在Python接口自动化中,断言(Assertion)是用来验证接口响应是否符合预期的一种机制。
当实际结果与预期结果不一致时,断言会失败,通常会导致测试停止并报告错误。以下是一些在Python接口自动化中常用的断言方法
1.断言响应状态码
def test():
url= 'https://www.wanandroid.com/friend/json'
r = requests.get(url=url)
s = r.json()
# 获取接口返回响应数据,并且使用jsonpath提取状态码
data = jsonpath.jsonpath(s, "$.errorCode")
# 由于返回的数据类型是列表需要通过索引获取对应数据
data_list = data[0]
# 断言:实际结果 == 预期结果
assert data_list == 0,"状态码断言失败,状态码:{}".format(data_list)
print("状态码断言成功!")
# 调用一下
test()
断言成功:表示返回的状态码与你预设的状态码一样。
断言失败:断言失败表示返回的状态码与你预设的状态码不一致,所以失败了。
2.断言响应内容:验证响应的文本内容或JSON数据是否符合预期。
def test():
url= 'https://www.wanandroid.com/friend/json'
r = requests.get(url=url)
# 获取响应的文本信息
data = r.text
# 断言:预期结果 in 实际结果
assert 'name' in data,"断言响应内容不包含预期文本:{}".format(data)
print('断言响应内容成功')
# 调用一下
test()
断言成功:返回的内容里面包含预设的内容。
断言失败:返回的内容里面不包含你预设的内容,多以断言失败了
3.断言响应头:验证HTTP响应头是否包含特定的字段和值。
def test():
url= 'https://www.wanandroid.com/friend/json'
r = requests.get(url=url)
# 获取请求头
data = r.headers
# 断言:预期结果 in 实际结果
assert 'Content-Type' in data,"断言响应头失败,响应头:{}".format(data)
print('断言响应头成功')
# 调用一下
test()
断言成功:返回的请求头内容里面包含预设的请求头内容。
断言失败:返回的请求头内容里面不包含你预设的请求头内容,多以断言失败了
4.断言响应体结构:如果接口返回的是JSON格式的数据,可以断言其结构是否符合预期。
注意:一般情况下返回的结构多为json格式。
def test():
url= 'https://www.wanandroid.com/friend/json'
r = requests.get(url=url)
# 预期的结构
expected_structure = {
'key1': {
'sub_key': 'value'
},
'key2': [1, 2, 3]
}
# 实际的结构
actual_structure = r.json()
# 使用jsonschema进行结构验证
import jsonschema
try:
jsonschema.validate(instance=actual_structure, schema=expected_structure)
except jsonschema.ValidationError as e:
assert False, "响应体结构验证失败: {}".format(e)
print("断言响应体结构成功")
# 调用一下
test()
5.断言响应体中的特定字段:检查响应体中的特定字段是否存在,以及其值是否符合预期。
def test():
url= 'https://www.wanandroid.com/friend/json'
r = requests.get(url=url)
# 断言某个字段是否存在
# 获取响应信息
data = r.json()
# 将获取到的响应信息进行反序列化,后续方便断言,否则就会出现返回的信息为字典或列表,无法获取对应字段
data_dumps = json.dumps(data)
# 断言:预期结果 in 实际结果
assert 'icon' in data_dumps, "响应体中缺少字段name:{}".format(data_dumps)
print("断言响应体中的特定字段成功!")
# 调用一下
test()
6.响应断言长度(条数):如果接口返回的是列表或数组,可以断言其长度是否符合预期。
注意:一般面试的时候会问。可以直接回答使用len()函数来获取长度
def test():
url= 'https://www.wanandroid.com/friend/json'
r = requests.get(url=url)
# 获取响应信息
data = r.json()
# 使用jsonpath提取要获取的信息
data_json = jsonpath.jsonpath(data,"$.data..link")
# 获得提取的信息的长度
actual_count = len(data_json)
assert actual_count == 39, "响应体中的项目数量不符合预期"
print("响应断言长度(条数)成功!!")
# 调用一下
test()
7.自定义断言:根据具体需求,可以编写自定义的断言函数来验证响应。
注意:以下代码只做案例展示使用。
def assert_custom_condition(actual, expected):
if actual != expected:
assert False, "自定义条件验证失败,实际值:{},预期值:{}".format(actual, expected)