接口测试场景
接口自动化测试场景
接口自动化测试与 Web/App 自动化测试对比
|
Web/App 自动化测试 |
接口自动化测试 |
成本 |
|
|
测试效率 |
|
|
用例编写效率 |
|
|
稳定性 |
|
|
自动化回归测试效率 |
|
|
测试覆盖度 |
|
|
自动生成用例 |
|
|
1. 常见 HTTP 请求方法构造
方法 |
说明 |
requests.request() |
构造一个请求,支撑以下各方法的基础方法。 |
requests.get() |
构造 HTTP 协议中的 GET 请求。 |
requests.post() |
构造 HTTP 协议中的 POST 请求。 |
requests.put() |
构造 HTTP 协议中的 PUT 请求。 |
requests.delete() |
构造 HTTP 协议中的 DELETE 请求。 |
2. 接口请求参数
携带请求参数的方式
- 常用两种方式:
- 直接在 URL 中拼接:
?username=Hogwarts&id=666
。
- 通过 params 参数传递:
requests.get(url, params)
3. 接口请求头
请求头信息的使用场景
请求头信息
- HTTP 请求头是在 HTTP 请求消息中包含的元数据信息,用于描述请求或响应的一些属性和特征。
- 实际工作过程中具体要关注的头信息字段需要和研发沟通。
- 常见的头信息(下侧表格):
内容 |
含义 |
Authorization |
表示客户端请求的身份验证信息 |
Cookie |
表示客户端的状态信息,通常用于身份验证和会话管理 |
Content-Type |
表示请求消息体的 MIME 类型 |
User-Agent |
发送请求的客户端软件信息 |
构造头信息
- 使用 headers 参数传入。
- 通常使用字典格式。
headers = {
'Cookie':'working=1', #添加cookie
'user-agent': 'my-app/0.0.1'
}
r = requests.get(url, headers=headers)
# 通过cookies参数添加cookie的方法
cookies_data = {"name":"julia",
"id":"223"}
r = requests.get(url, cookies = cookies_data)
4. 接口请求体
接口请求体简介
- 进行HTTP请求时,发送给服务器的数据。
- 数据格式类型可以是JSON、XML、文本、图像等格式。
- 请求体的格式和内容取决于服务器端API的设计和开发人员的要求。
常用接口请求体
类型 |
介绍 |
Content-type |
JSON(JavaScript Object Notation) |
轻量级的数据交换格式,最常见的一种类型。 |
application/json |
表单数据(Form Data) |
以键值对的形式提交数据,例如通过 HTML 表单提交数据。 |
application/x-www-form-urlencoded |
XML(eXtensible Markup Language) |
常用的标记语言,通常用于传递配置文件等数据。 |
application/xml, text/xml |
文件(File) |
可以通过请求体上传文件数据,例如上传图片、视频等文件。 |
上传文件的 MIME 类型,例如 image/jpeg |
multipart/form-data |
|
|
纯文本(Text) |
纯文本数据,例如发送邮件、发送短信等场景 |
text/plain |
其他格式 |
二进制数据、protobuf 等格式 |
|
4.1 接口请求体 - JSON
JSON 简介
- 是 JavaScript Object Notation 的缩写。
- 是一种轻量级的数据交换格式。
- 是理想的接口数据交换语言。
- Content-Type 为 application/json。
构造 JSON 格式请求体
# 导入依赖
import requests
def test_post_json():
# 定义接口的 url 和 json 格式请求体
url = "https://httpbin.ceshiren.com/post"
body= {
"post_key": "post_value"
}
# 发出 POST 请求,r 接收接口响应
r = requests.post(url, json=body)
4.2 接口请求体 - 文件
使用 requests 如何上传
r = requests.post("https://httpbin.ceshiren.com/post",
files={"hogwarts_file": open("hogwarts.txt", "rb")})
#通过元祖的形式修改上传的filename名称
r = requests.post("https://httpbin.ceshiren.com/post",
files={"hogwarts_file":("修改后的上传filename.txt", open("hogwarts.txt", "rb"))})
4.3 接口请求体 - FORM 请求
什么是 FORM 请求
python代码
data = {"name":"julia"}
r = requests.post("https://httpbin.ceshiren.com/post",
data=data)
4.4 接口请求体 - xml
request 请求构造
import requests
xml = """<?xml version='1.0' encoding='utf-8'>
<a>6<\a>
"""
headers={'Content-Type':'application/xml'}
r=requests.post('http://htttbin.org/post',data=xml,headers=headers).text
5 接口响应断言
接口断言使用场景
- 问题:
- 如何确保请求可以发送成功。
- 如何保证符合业务需求。
- 解决方案:
- 通过获取响应信息,验证接口请求是否成功,是否符合业务需求。
响应结果类型
属性 |
含义 |
r |
响应 Response 对象(可以使用任意的变量名) |
r.status_code |
HTTP 响应状态码 |
r.headers |
返回一个字典,包含响应头的所有信息。 |
r.text |
返回响应的内容,是一个字符串。 |
r.url |
编码之后的请求的 url |
r.content |
返回响应的内容,是一个字节流。 |
r.raw |
响应的原始内容 |
r.json() |
如果响应的内容是 JSON 格式,可以使用该方法将其解析成 Python 对象。 |
若碰到复杂断言应该如何处理?
- 多层嵌套的数据提取与断言: JSONPath
- 整体结构响应断言: JSONSchema
- 自行编写解析算法
1. xml响应断言
XML 断言
from requests_xml import XMLSession
session = XMLSession()
r = session.get('https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss')
print(r.xml.links)
XPath 断言
from requests_xml import XMLSession
session = XMLSession()
r = session.get('https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss')
item = r.xml.xpath('//item', first=True)
print(item.text)
XML 解析
import xml.etree.ElementTree as ET
root = ET.fromstring(countrydata)
root.findall(".")
root.findall("./country/neighbor")
root.findall(".//year/..[@name='Singapore']")
root.findall(".//*[@name='Singapore']/year")
root.findall(".//neighbor[2]")
2. 多层嵌套响应断言
JSONPath 简介
- 在 JSON 数据中定位和提取特定信息的查询语言。
- JSONPath 使用类似于 XPath 的语法,使用路径表达式从 JSON 数据中选择和提取数据。
- 相比于传统的提取方式,更加灵活,并且支持定制化。
JSONPath 语法
符号 |
描述 |
$ |
查询的根节点对象,用于表示一个 json 数据,可以是数组或对象 |
@ |
过滤器(filter predicate)处理的当前节点对象 |
* |
通配符 |
. |
获取子节点 |
.. |
递归搜索,筛选所有符合条件的节点 |
?() |
过滤器表达式,筛选操作 |
[start:end] |
数组片段,区间为[start,end),不包含 end |
[A]或[A,B] |
迭代器下标,表示一个或多个数组下标 |
JSONPath 与代码结合(Python)
- 环境安装:
pip install jsonpath
# 返回结果列表,没找到返回Fasle
jsonpath.jsonpath(源数据对象, jsonpath表达式)
3. 整体结构响应断言
针对与“大响应数据”如何断言
- 针对主要且少量的业务字段断言。
- 其他字段不做数据正确性断言,只做类型与整体结构的校验。
- 与前面的版本进行 diff,对比差异化的地方。
JSONSchema 简介
- 使用 JSON 格式编写的
- 可以用来定义校验 JSON 数据的结构
- 可以用来校验 JSON 数据的一致性
- 可以用来校验 API 接口请求和响应
JSONSchema 的生成
from genson import SchemaBuilder
def generate_jsonschema(obj):
# 实例化jsonschem
builder = SchemaBuilder()
# 传入被转换的对象
builder.add_object(obj)
# 转换成 schema 数据
return builder.to_schema()
JSONSchema 验证(Python)
- 安装:
pip install jsonschema
。
- 调用
validate()
进行验证。
def schema_validate(obj, schema):
'''
对比 python 对象与生成的 JSONSchame 的结构是否一致
'''
try:
validate(instance=obj, schema=schema)
return True
except Exception as e:
return False
超时处理
通过timeout参数传递超时时间
import requests
class TestReq:
def test_timeout(self):
r = requests.get('http://github.com', timeout = 0.01)
代理配置
代理在接口自动化的使用场景
- 测试脚本,更直观的排查请求错误,相当于编写代码时的 debug
- 获取没有错误的,真实的接口请求响应信息
- 通过代理获取自动化测试的请求响应
- 对比两次请求响应的区别
Requests 代理配置
import requests
proxies = {
'http':'http://10.10.10.1:3182',
'https':'http://10.10.10.1:1080'
}
#verified=False 跳过证书认证
requests.get('http://example.org',proxies = proxies, verify=False)
如何使用
- 设定代理格式
- 通过 proxies 参数传递代理设置
- 开启代理工具监听请求
代理配置