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 相关文章推荐
Python3基础之基本数据类型概述
Aug 13 Python
python中bisect模块用法实例
Sep 25 Python
Python使用正则匹配实现抓图代码分享
Apr 02 Python
Python实现模拟时钟代码推荐
Nov 08 Python
Python递归函数定义与用法示例
Jun 02 Python
Python实现的朴素贝叶斯分类器示例
Jan 06 Python
在Python中获取两数相除的商和余数方法
Nov 10 Python
matplotlib实现热成像图colorbar和极坐标图的方法
Dec 13 Python
Django REST framework 分页的实现代码
Jun 19 Python
Python读取xlsx文件的实现方法
Jul 04 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 Python
python 实现图与图之间的间距调整subplots_adjust
May 21 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 file_get_contents 函数超时的几种解决方法
2009/07/30 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
JavaScript语言中的Literal Syntax特性分析
2007/03/08 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
python实现统计代码行数的方法
2015/05/22 Python
在Django框架中编写Contact表单的教程
2015/07/17 Python
Python工程师面试题 与Python Web相关
2016/01/14 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
静态变量和实例变量的区别
2015/07/07 面试题
数控机械专业个人的自我评价
2014/01/02 职场文书
捐书活动总结
2014/05/04 职场文书
贷款承诺书范文
2014/05/19 职场文书
校庆标语集锦
2014/06/25 职场文书
英文演讲稿开场白
2014/08/25 职场文书
法人授权委托书范本
2014/09/17 职场文书
2014年减负工作总结
2014/12/10 职场文书
2015年实习单位评语
2015/03/25 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
MySQL Shell的介绍以及安装
2021/04/24 MySQL