常用断言
- 响应状态码断言
- 业务(接口响应的数据)断言。包括相等、包含
- 数据库断言
yaml用例validate节点
validate:
codes: 200
equals: {code: 0, msg: 登录成功}
contains: data
断言封装
从接口响应中提取中间变量(用于接口关联)之后,调用断言方法。防止断言失败后提取不到中间变量,影响后面的接口。
import jsonpath
from requests import Response
def asserts(validate: dict, rsp: Response):
"""
:param validate: 期望结果
:param rsp: 实际响应
:return:
"""
for k, v in validate.items():
# 响应状态码断言
if "codes" == k:
codes_assert(v, rsp.status_code)
# 相等断言
elif "equals" == k:
equals_assert(v, rsp.json()) # rsp.json()可能会抛异常
# 包含断言
elif "contains" == k:
contains_assert(v, rsp.text)
else:
print("不支持%s断言" % k)
def codes_assert(expected, actual: int):
"""
响应状态码断言
:param expected: 预期状态码
:param actual: 实际状态码
:return:
"""
if expected != actual:
assert 0, "codes断言失败,预期状态码:%d,实际状态码:%d" % (expected, actual)
def equals_assert(expected: dict, actual_rsp_json):
"""
对rsp.json()中包含的字段和值进行断言
:param expected: 预期响应rsp.json()中的字段和值
:param actual_rsp_json:
:return:
"""
for k, v in expected.items():
# 响应中提取字段k的值,没有这个字段返回False,有这个字段返回list
jsonpath_list = jsonpath.jsonpath(actual_rsp_json, "$..%s" % k)
if jsonpath_list:
if v not in jsonpath_list:
assert 0, "equals断言失败,%s预期值:%s,实际值列表是%s" % (k, v, str(jsonpath_list))
else:
assert 0, "equals断言失败,响应中没有字段%s" % k
def contains_assert(expected_contains, actual_rsp_text):
"""
判断响应文本中是否包含指定的字符串
:param expected_contains:
:param actual_rsp_text:
:return:
"""
if str(expected_contains) not in actual_rsp_text:
assert 0, "contains断言失败,响应文本中不包含%s" % str(expected_contains)