场景:
接口 A 在固定的请求参数组合下,会返回一个几乎不变的 json 对象。
- 通常的做法,是对这个对象的每一个参数和值进行逐个断言;
- 但如果这个对象基本上都是固定的,而且结构比较复杂,则一条用例中就需要添加非常复杂和冗长的断言,导致用例维护难度加大。
解决思路:
既然返回值的结构基本上是固定的,那么我们可以考虑对整个 json 对象进行断言。
实现步骤:
- 1. 保存一份已人工校验过是正确的返回值作为模板。
- 2. 使用同一套参数请求接口,获取返回值。同时读取已保存的返回值模板。
- 3. 将返回值与模板值进行比较。
比较分为两步:
- 1. 将返回值和模板值直接对比,如果完全相等,则用例通过。
- 2. 如果不完全相等,调用 Python 的 jsondiff 模块对两个 json 进行比较,获取到一个差值对象。原理是比较两个 json 对象,将两者的差异字段取出。通常是一些每次请求随机生成的 ID,或者经常变化的时间戳等字段。
如模板值为:
{'userid':123,'username':'testname','lastlogindate':'2020-09-01'}
而实时返回值为;
{'userid':123,'username':'testname','lastlogindate':'2020-09-02'}
则差异对象为:
{'lastlogindate':'2020-09-02'}
- 3. 编写一个公共方法,获取差值对象的字段路径和名称。如上面的例子,输出结果为: [lastlogindate]
- 4. 将上一步获取的差异对象值保存为二级模板。用例运行时最终比较计算出的差异值是否与保存的模板差异值相同。
将上述比较方法提取为公共方法,并编写对应的模板提取方法。这样只需将对应的参数组合和模板名称,即可通过 pytest.mark.paramise 的方式,轻松添加不同的测试用例。