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实现机械分词之逆向最大匹配算法代码示例
Dec 13 Python
Python iter()函数用法实例分析
Mar 17 Python
Python基于opencv的图像压缩算法实例分析
May 03 Python
python文件操作之批量修改文件后缀名的方法
Aug 10 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
Pandas之DataFrame对象的列和索引之间的转化
Jun 25 Python
解决Pytorch训练过程中loss不下降的问题
Jan 02 Python
python颜色随机生成器的实例代码
Jan 10 Python
Python函数生成器原理及使用详解
Mar 12 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
Oct 29 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
php下使用无限生命期Session的方法
2007/03/16 PHP
php文档更新介绍
2011/07/22 PHP
基于php 随机数的深入理解
2013/06/05 PHP
php上传文件中文文件名乱码的解决方法
2013/11/01 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
javascript函数库-集合框架
2007/04/27 Javascript
javascript tips提示框组件实现代码
2010/11/19 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
JavaScript prototype 使用介绍
2013/08/29 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
python__new__内置静态方法使用解析
2020/01/07 Python
Django密码存储策略分析
2020/01/09 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
党校自我鉴定范文
2013/10/02 职场文书
八达岭长城导游词
2015/01/30 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js
带你了解Java中的ForkJoin
2022/04/28 Java/Android