接口测试 python 接口测试: 如何增加同一接口不同环境间的返回值对比

Jerry li · 2018年10月31日 · 最后由 Jerry li 回复于 2018年11月01日 · 3566 次阅读

场景:

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

流程图:

关键处理: 以差值的 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. 部分接口与数据配置相关。 需要确保测试环境和生产环境的配置数据保持一致。
共收到 8 条回复 时间 点赞

比较线上和测试环境的目的是什么

AngryTester 回复

尝试过 diffy,但是需要搭建相关的环境,而且报告不够直观;
现在只是在原有的接口测试基础上做多一层分发和对比。

Vin 回复

例如新版本提测后,可以和线上版本的返回值对比一下是否有结构上的变动,避免对接口使用者产生影响。

维护两套环境的测试数据 光这一条就够受的了,而且生产环境你还不能铲掉重建

hellohell 回复
  1. 维护的只是环境的配置,这是功能测试的时候一直已在使用的,而且只是配置一次,不需要经常维护,更不需要清除。
  2. 测试产生的数据也是正常数据,只是在应用级别分离了,不会对用户产生影响。

可怜的三体人抓住俩地球人,对比后得知不一样,因而得出一是男一是女,到底谁是男谁是女,不知道;

hellohell 回复

三体人那么先进,加个打印输出就知道了

Jerry li 关于接口测试返回值验证的疑问 中提及了此贴 12月11日 15:47
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册