打造高效接口自动化测试:精准对比与可视化展示,轻松发现数据差异!
前言
在进行接口自动化测试时,一个不可或缺的步骤是验证接口返回的数据是否符合我们的预期。要准确完成这一任务,一种高效的方法是编写专门的函数或方法,其核心职责在于仔细比较接口实际的响应数据与预先定义的期望结果之间的一致性。这不仅涉及到数据的内容,还包括数据结构和状态码等方面的校验。
此外,仅仅完成比对任务本身并不够,为了提升测试结果的可理解性和后续分析的便捷性,将这些比对结果转化为一份结构化并且可视化的表格是非常必要的。这种表格能够直观地展示出哪些接口符合预期,哪些不符合,包括具体的差异点,如缺失的字段、不匹配的值等信息,从而为开发人员定位问题、理解接口行为提供直接而有效的帮助。
实现这一过程,不仅需要对接口测试的标准流程有清晰的认识,还需要具备一定的编程能力,以便设计和实现功能齐全、逻辑清晰的测试脚本。使用如Python等编程语言中的单元测试框架,或者是专门的接口自动化测试工具如Postman、JMeter等,都能够有效地支撑这一需求。
Python实现接口实际结果与预期结果对比
代码实现
下面使用Python实现这一功能,代码如下:
def compare_results(actual, expected, *exclude_keys):
"""
比较接口返回的实际结果与预期结果,支持多层嵌套结构,排除不需要校验的参数。
:param actual: 接口返回的实际数据(通常是一个字典或列表)
:param expected: 预期数据(通常是一个字典或列表)
:param exclude_keys: 需要排除校验的参数键名,可以使用"parent.child"的形式排除多层嵌套的字段
:return: 一个字典,表示不匹配的字段和对应的实际与预期值
"""
mismatches = {}
def _compare(act, exp, parent_key=""):
# 如果是字典,递归遍历其内部
if isinstance(act, dict) and isinstance(exp, dict):
for key in act:
# 构建完整的键名
full_key = f"{parent_key}.{key}" if parent_key else key
# 如果该键在排除校验的列表中,则跳过
if full_key in exclude_keys:
continue
# 如果预期结果中没有这个键,或者嵌套对比子项
if key in exp:
_compare(act[key], exp[key], full_key)
else:
mismatches[full_key] = {"actual": act[key], "expected": "Key not present in expected"}
# 如果预期结果有的key在实际结果中不存在
for key in exp:
full_key = f"{parent_key}.{key}" if parent_key else key
if key not in act and full_key not in exclude_keys:
mismatches[full_key] = {"actual": "Key not present in actual", "expected": exp[key]}
# 如果是列表,递归遍历其每一个元素
elif isinstance(act, list) and isinstance(exp, list):
for i in range(min(len(act), len(exp))):
full_key = f"{parent_key}[{i}]"
_compare(act[i], exp[i], full_key)
# 列表长度不相等的情况
if len(act) != len(exp):
for i in range(len(exp), len(act)):
mismatches[f"{parent_key}[{i}]"] = {"actual": act[i], "expected": "No corresponding item"}
for i in range(len(act), len(exp)):
mismatches[f"{parent_key}[{i}]"] = {"actual": "No corresponding item", "expected": exp[i]}
# 对于基础数据类型,直接比较
else:
if act != exp:
mismatches[parent_key] = {"actual": act, "expected": exp}
# 调用内部函数开始比较
_compare(actual, expected)
return mismatches
# 示例使用
actual_response = {
"id": 123,
"name": "John",
"email": "john@example.com",
"address": {
"street": "123 Street",
"city": "New York",
"zip_code": "10001"
},
"orders": [
{"id": 1, "total": 100.0},
{"id": 2, "total": 200.0}
]
}
expected_response = {
"id": 123,
"name": "John Doe",
"email": "john@example.com",
"address": {
"street": &#