访问被拒绝,你可能没有权限或未登录,或者你还在新人期。
场景:
接口 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 的方式,轻松添加不同的测试用例。
「原创声明:保留所有权利,禁止转载」
这是 Java 的库吧? 我是用的 Python 的框架
太单一 了 ,思想不要固化,建议 可以看看 现有的 web 框架 或者 result api 框架; 好好顺一下 思路
jsonschema 是 Python 库,可以方便的对比返回值的类型,也可以预设你期望的值。对比结果是一个包含模式的,也就是返回数据比期望数据多出内容的话不会报错,只有缺少才会报错。
如果只是对比数据结构的话,这个库完全符合你的需求了。
好的,谢谢你的提醒,我有空去了解一下。
我现在的目标不是只对比结构,而是数据也要对比,所以现在做出来的效果只要有任何变化,比如多字段,少字段,字段层级变了,或者值变了,都可以识别出来,可以满足当前需求。
想了很久,还是想请教一下阁下:怎么样才不单一不固化?
谢谢回复。
我是第一时间用手机快速百度的,看到的前几个都是 Java 的使用例子,所以才疑问是不是 Java 的库。
感谢大家不吝赐教,了解到很多不同的 json 断言库。
jsondiff 两年前玩过精度不准;直接用文本对比写个库;jieba 分词做一套更好;一般做这个对比的可能公司需要和上个版本的结果返回值做个相似度对比吧;实际场景只能说多多益善吧;
jsonschema , jsonpath;以前我都是直接代码写的断言逻辑;出去面试这两不知道可能人家觉得我 low;哈哈
如果只是判断两个 json 是否相等,可以转成 OrderedDict 之后算一下 MD5 值是否相等即可。
json 不是所有情况下都完全相等的,可以允许部分字段变化,例如时间戳等
那就删掉这种 key 不就 OK 啦,用其他的方法你也得忽略这个呀
我只是提供一种比较是否相等的思路给你