python接口自动化测试之接口数据依赖的实现方法


Posted in Python onApril 26, 2019

在做自动化测试时,经常会对一整套业务流程进行一组接口上的测试,这时候接口之间经常会有数据依赖,那么具体要怎么实现这个依赖呢。

思路如下:

  1. 抽取之前接口的返回值存储到全局变量字典中。
  2. 初始化接口请求时,解析请求头部、请求参数等信息中的全局变量并进行替换。
  3. 发出请求。

核心代码实现:

抽取接口的返回值存储到全局变量字典中

# 抽取接口的返回值存储到全局变量字典中

if set_global_vars and isinstance(set_global_vars, list):
  for set_global_var in set_global_vars:
    if isinstance(set_global_var, dict):
      name = set_global_var.get('name') # name 代表全局变量的名字
      query = set_global_var.get('query') # query 代表全局变量的查询语句
      value = common.dict_get(response_json, query) # response_json 代表接口的响应数据
      self.global_vars[name] = value

其中set_global_vars代表的是当前测试用例的全局变量设置列表, self.global_vars则代表测试类实例的全局变量字典,common.dict_get方法的具体实现请移步方法具体实现

解析字符串中全局变量并进行替换

import re

# 解析字符串中全局变量并进行替换
def resolve_global_var(pre_resolve_var, global_var_dic, global_var_regex='\${.*?}',
          match2key_sub_string_start_index=2, match2key_sub_string_end_index=-1):

  '''
  :param pre_resolve_var: 准备进行解析的变量<str>
  :param global_var_dic: 全局变量字典<dict>
  :param global_var_regex: 识别全局变量正则表达式<str>
  :param match2key_sub_string_start_index: 全局变量表达式截取成全局变量字典key值字符串的开始索引<int>
  :param match2key_sub_string_end_index: 全局变量表达式截取成全局变量字典key值字符串的结束索引<int>
  :return: 解析后的变量<str>
  '''

  if not isinstance(pre_resolve_var, str):
    raise TypeError('pre_resolve_var must be str!')

  if not isinstance(global_var_dic, dict):
    raise TypeError('global_var_dic must be dict!')

  if not isinstance(global_var_regex, str):
    raise TypeError('global_var_regex must be str!')

  if not isinstance(match2key_sub_string_start_index, int):
    raise TypeError('match2key_sub_string_start_index must be int!')

  if not isinstance(match2key_sub_string_end_index, int):
    raise TypeError('match2key_sub_string_end_index must be int!')

  re_global_var = re.compile(global_var_regex)

  def global_var_repl(match_obj):
    start_index = match2key_sub_string_start_index
    end_index = match2key_sub_string_end_index
    match_value = global_var_dic.get(match_obj.group()[start_index:end_index])
    return match_value if match_value else match_obj.group()

  resolved_var = re.sub(pattern=re_global_var, string=pre_resolve_var, repl=global_var_repl)
  return resolved_var

这里,首先先创建识别全局变量的正则规则,然后运用re.sub方法进行替换。其中,re.sub中的repl参数可接受函数作为参数。global_var_repl方法中,使用global_var_dic字典去获取匹配的值并返回。

默认参数中,将全局变量做了这样一个识别: ${GLOBALVAR_NAME}, 用global_var_dic查找并替换全局变量时,则使用了默认预设的起止索引参数。这种写法我感觉有些奇怪, 但是目前也没想出更好的方法,如果大家有更好的实现思路的话欢迎讨论:)

最佳实践

我们来模拟一次全局变量替换的效果:

if __name__ == '__main__':
  pre_resolve_var = 'left ${status} right, left ${data} right'
  global_var_dic = {'status': 'STATUS', 'data': 'DATA'}
  resolved_str = resolve_global_var(pre_resolve_var=pre_resolve_var, global_var_dic=global_var_dic)
  print(resolved_str)

下面是控制台输出:

left STATUS right, left DATA right

Process finished with exit code 0

可以看出输出还是符合预期的,将字符串中全局变量成功解析。

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

Python 相关文章推荐
Python中的Numpy入门教程
Apr 26 Python
Python对象的深拷贝和浅拷贝详解
Aug 25 Python
使用Python的Django框架实现事务交易管理的教程
Apr 20 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
Apr 17 Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 Python
详解python实现交叉验证法与留出法
Jul 11 Python
Python缓存技术实现过程详解
Sep 25 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
python3实现网页版raspberry pi(树莓派)小车控制
Feb 12 Python
python中把元组转换为namedtuple方法
Dec 09 Python
Flask处理Web表单的实现方法
Jan 31 Python
python使用参数对嵌套字典进行取值的方法
Apr 26 #Python
python将视频转换为全字符视频
Apr 26 #Python
使用Python创建简单的HTTP服务器的方法步骤
Apr 26 #Python
Python3.5内置模块之random模块用法实例分析
Apr 26 #Python
python3.5安装python3-tk详解
Apr 26 #Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
Apr 26 #Python
python实现名片管理系统项目
Apr 26 #Python
You might like
ThinkPHP中关联查询实例
2014/12/02 PHP
避免Smarty与CSS语法冲突的方法
2015/03/02 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
2020/04/03 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
python 禁止函数修改列表的实现方法
2017/08/03 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
2019/01/29 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
世界上最大的在线学习和教学市场:Udemy
2017/11/08 全球购物
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
几个人围成一圈的问题
2013/09/26 面试题
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
学校联谊活动方案
2014/02/15 职场文书
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
nginx对http请求处理的各个阶段详析
2021/03/31 Servers
python如何利用traceback获取详细的异常信息
2021/06/05 Python
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android