30.快速实现接口重构测试---deepdiff库使用
背景
- 公司的数据接口项目需要进行重构(接口总数约220),希望能尽量快速完成测试.
- 和开发沟通,新旧接口的返回数据预期是完全一致的
- 协调资源,让测试环境可以访问新旧服务进行响应比对
测试脚本设计思路
在切换数据源前,根据测试范围尽可能地造业务数据,然后记录下调用接口的参数以及返回值。
通知开发切换数据源(可能是个开关配置),切换后,使用切换数据源前已经记录下来的参数再次请求查询接口并记录下返回值。
编写 Diff 脚本去输出每个相同的请求参数在切换数据源前后的接口请求返回值差异。
最后分析差异,将差异点进行记录并和开发对齐结果。
开发进行修复后进行脚本自动回归。
循环步骤三到五,直到没有差异或者差异可被接受为止,则测试结束。
deepdiff库
怎么写
Python-deepdiff库是用来对比报文的好帮手,下面是一组简单deomfrom deepdiff import DeepDiff
ddiff = DeepDiff(dict(a=1, b=2), dict(a=2, b=2))
print(ddiff)
输出是:
{'values_changed': {"root['a']": {'new_value': 2, 'old_value': 1}}}
Process finished with exit code 0
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
可以看到输出的是两个 dict 中 key 为 a 的值存在差异的部分,旧的 a 值是 1,而新的 a 值是 2。
复盘
从接到需求到完成第一次测试结果输出,我花了大概一天半的时间。整个过程比较顺利,但在真正实践过程中,确实有一些坑点.如下:
- 响应对比的过程中,有一部分字段是不可比的.例如"时间戳".>>>解决办法是用deepdiff设置忽略(好在这类字段的名字比较规范)
- 响应里有的排序会导致结果不可比,>>>解决办法①deepdiff可以设置忽略顺序比较 ②如果排序+分页的情况,只能退而求其次了
- deepdiff的结果展示不很直观,是用文本+节点来展示的>>>后续把错误的接口又用defflib做了可视化输出(这个库可以输出对比html)
- 测试中发现新旧接口的空值展示不同,有null,"",[]三种情况>>>沟通后开发领了这种bug,新接口统一空值的时候传 "" 或者 []
- 极个别接口的相应过于"活泼",例如"舆情信息"这个接口.没法进行值的对比>>>采取了降级的检查的手段.只检查返回值的结构符合预期(这里用的pydantic)
上次更新: 2023/09/21, 15:32:58