场景:

已将系统相关的接口的接口测试用例完成,现增加比较同一接口、同一请求参数在线上和测试环境的返回值。

流程图:

关键处理: 以差值的 key 作为对比

由于同一接口在不同环境间的返回值可能包含不固定的值(如 id、时间戳等),因此无法以返回值是否完全匹配作为对比结果。
因此选择获取返回值差值的 key 列表作为判断对比是否通过的标准。

部分代码:

1. 比较两个 dict 的差值

分别传入正式环境的返回值数组和测试环境的返回值数组; 对比结果为一个新的数组,内容为两个数组不匹配的字段。

def symmetric_difference(oldobj,newobj):
    oldobj=json.loads(oldobj)
    newobj=json.loads(newobj)
    print(oldobj)
    print(newobj)
    oldkeys = list(oldobj.keys())
    newkeys = list(newobj.keys())
    diff = {}
    for _key in set(oldkeys + newkeys):
        if newobj.get(_key,0) != oldobj.get(_key,0):
            diff[_key] = "new:%s, old:%s" %(newobj.get(_key,0) , oldobj.get(_key,0))
    return diff

执行效果:

两个返回值分别为:
response1 = {'userId': 414,   'msg': 'success', 'token': '4_A', 'platform': 'mobile', 'code': 200,  'isFirstLogin': 1}
response2 = {'userId': 415,   'msg': 'success', 'token': '4_B', 'platform': 'mobile', 'code': 200,  'isFirstLogin': 1}

对比获得两个数组的差值:

result =  {'userId': 'new:414, old:415', 'token': 'new:4_A, old:4_B'}

2. 验证对比结果:

# 测试 登录 接口差值
def test_compare_login(self):
    user = new_user()         # 生成同样的登录用户数据
    response1 = login(user, url1)   
    response2 = login(user, url2)   # 以同一  user  登录,分别获取url1、url2  的登录接口返回值。   
    result = symmetric_difference(response1,response2)      # 获取两个返回值的差
    list1 = list(result.keys())         # 获取差值数组的 key 列表(忽略里面具体的内容,只关心有哪些 key 不一致)
    list1.sort()                              # 排序,确保最终对比结果不变
    self.assertEqual(list1,['token', 'userId'])       #  验证对比结果是否符合预期

待完善的点:

  1. 部分接口存在前置依赖,需要修改生成用户数据的逻辑,分别在各自环境调用前置接口生成数据。
  2. 部分接口与数据配置相关。 需要确保测试环境和生产环境的配置数据保持一致。


↙↙↙阅读原文可查看相关链接,并与作者交流