python 接口测试response返回数据对比的方法


Posted in Python onFebruary 11, 2018

背景:之前写的接口测试一直没有支持无限嵌套对比key,上次testerhome逛论坛,有人分享了他的框架,看了一下,有些地方不合适我这边自己修改了一下,部署在jenkins上跑完效果还不错,拿出来分享一下。ps:还是要多看看别人写的,新学了不少python自带的一些常用方法。

这次直接上代码,下面写一下这次我新学一些方法和思路。

def check_response_hope_key(self,response={},hope_response={}):
  temp_data={}
  for n1 in hope_response:
   print "n1:",n1
   #如果值是字典类型
   if isinstance(hope_response[n1],dict):
    print "dict"
    if not Check_Response_Hope().check_response_hope_key(response=response.get(n1), hope_response=hope_response[n1]):
     MailFile().checkfail(response=response.get(n1), hope_response=hope_response[n1])
     return False
     raise '{},{}'.format(hope_response[n1],response[n1])
   
   #如果值是列表类型
   elif isinstance(hope_response[n1],list):
    print "list"
    for hope_index,hope_listValue in enumerate(hope_response[n1]):
     #print "hope_index:",hope_index
     #print "hope_listValue:",hope_listValue
     for response_index,response_listValue in enumerate(response[n1]):
      #print "response_index:",response_index
      #print "response_listValue:",response_listValue
      if isinstance(hope_listValue,dict):
       Check_Response_Hope().check_response_hope_key(response=response[n1][response_index],
hope_response=hope_response[n1][response_index])
      elif isinstance(hope_listValue,list):
       if hope_response[n1][hope_index]==response[n1][hope_index]:
        break
       else:
        MailFile().checkfail(response=response_listValue,hope=hope_listValue)
        raise Exception ("hope_response="+str(hope_response[n1][hope_index])+"\n"+
"response="+str(response[n1][response_index]))
      else:
       if hope_response[n1][hope_index]==response[n1][hope_index]:
        break
       else:
        MailFile().checkfail(response=response[n1][hope_index],hope=hope_response[n1][hope_index])
        raise Exception ("hope_response="+str(hope_listValue)+"\n"+"response="+str(response_listValue))
   else:
    print "string"
    if response.has_key(n1):
     continue
    else:
     temp_data['error_data']='{}:{},{}:{}'.format(n1,hope_response[n1],n1,response[n1])
     #发送邮件
     MailFile().checkfail(response=response[n1],hope=hope_response[n1])
     raise Exception ("hope_response="+str(hope_response[n1])+"\n"+"response="+str(response.get(n1)))
    
  return True

内置函数enumerate():

传入list的数据时返回该列表的索引和值,例如:

>>> list1=[1,2,3,4]
>>> for list_index,list_value in enumerate(list1):
...  print list_index,list_value
...

0 1
1 2
2 3
3 4

还可以控制索引的起始值开始迭代,例如:

>>> for list_index,list_value in enumerate(list1,1):
...  print list_index,list_value
...

1 1
2 2
3 3
4 4

内置函数isinstance(object,type):

用于判断传入对象是什么类型,返回布尔类型true或false,例如:

>>> isinstance(list1,dict)
False

ps:这个方法真的挺好用的,很基础可以根据返回的布尔类型走不同的if分支。

内置函数format()

这个函数作用就是格式化字符串,这里面不是非要用,我用完感觉还是挺方便的,结构也清晰,在下面举个常用例子。
1.通过位置进行映射:

>>> '{},{}'.format('abc',123)
'abc,123'
>>> '{1}{0}{1}'.format('abc',123)
'123abc123'

2.通过下标

>>> list1=['a','b']
>>> '{0[1]},{0[0]}'.format(list1)
'b,a'

当然还其他很多用法,我也没用到,还是挺强大的,有兴趣自己百度一下吧,很多写的很详细。

思路:

接口返回response一定是字典格式的,因为我写的接口测试框架用的orm链接数据库动态从数据库中传参数,所以返回value可能会不同,但是返回response的key肯定是固定的,所以我这里验证所有的key。

首先遍历hope_response(期望接口返回),hope_response[n]可能类型字典,列表或者string/int(我目前没有见过key是int型的),所以使用isinsstance()去判断value的类型。如果是string就表示是最简单的一层{key:value}形式,这里就使用has_key来判断response中有没有该key。hope_response[n]是dict类型,就递归,最后一定会落到string/int类型的分支。如果hope_response[n]是list类型,就用到enumerate()来拿到索引和值,根据值的类型去判断。大体思路这样的,我调试1天多,看着简单,自己写坑还是挺多的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
深入讨论Python函数的参数的默认值所引发的问题的原因
Mar 30 Python
简单介绍Python的Django框架的dj-scaffold项目
May 30 Python
Python实现数通设备端口使用情况监控实例
Jul 15 Python
python实现下载文件的三种方法
Feb 09 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
在Windows中设置Python环境变量的实例讲解
Apr 28 Python
python多进程实现文件下载传输功能
Jul 28 Python
python实现字符串中字符分类及个数统计
Sep 28 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
Jan 08 Python
Python获取excel内容及相关操作代码实例
Aug 10 Python
详细总结Python常见的安全问题
May 21 Python
使用Python读取大文件的方法
Feb 11 #Python
python脚本作为Windows服务启动代码详解
Feb 11 #Python
分析Python读取文件时的路径问题
Feb 11 #Python
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 #Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 #Python
代码讲解Python对Windows服务进行监控
Feb 11 #Python
django 按时间范围查询数据库实例代码
Feb 11 #Python
You might like
PHP 代码规范小结
2012/03/08 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
PHP运行模式汇总
2016/11/06 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
JS操作HTML自定义属性的方法
2015/02/10 Javascript
javascript学习总结之js使用技巧
2015/09/02 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
node获取客户端ip功能简单示例
2019/08/24 Javascript
详解React 条件渲染
2020/07/08 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
python 字符串split的用法分享
2013/03/23 Python
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
python删除服务器文件代码示例
2018/02/09 Python
Python中安装easy_install的方法
2018/11/18 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
Django组件content-type使用方法详解
2019/07/19 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
工程监理应届生求职信
2013/11/09 职场文书
环保倡议书300字
2014/05/15 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
Django cookie和session的应用场景及如何使用
2021/04/29 Python