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中内置的NotImplemented类型的用法
Mar 31 Python
Python简单删除目录下文件以及文件夹的方法
May 27 Python
Python+Django搭建自己的blog网站
Mar 13 Python
对python函数签名的方法详解
Jan 22 Python
Python应用领域和就业形势分析总结
May 14 Python
对PyQt5中树结构的实现方法详解
Jun 17 Python
python常用数据重复项处理方法
Nov 22 Python
django 中使用DateTime常用的时间查询方式
Dec 03 Python
python求绝对值的三种方法小结
Dec 04 Python
tensorboard显示空白的解决
Feb 15 Python
Django中ORM找出内容不为空的数据实例
May 20 Python
keras-siamese用自己的数据集实现详解
Jun 10 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邮件发送,php发送邮件的类
2011/03/24 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
ExpressJS入门实例
2015/01/14 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
Python hexstring-list-str之间的转换方法
2019/06/12 Python
python常用库之NumPy和sklearn入门
2019/07/11 Python
python求绝对值的三种方法小结
2019/12/04 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
Python for循环搭配else常见问题解决
2020/02/11 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
数控专业个人求职信范例
2013/11/29 职场文书
优秀食品类广告词
2014/03/19 职场文书
社区道德讲堂实施方案
2014/03/21 职场文书
对照检查剖析材料
2014/09/30 职场文书
卖房协议书样本
2014/10/30 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
2015年英语教学工作总结
2015/05/25 职场文书
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL
volatile保证可见性及重排序方法
2022/08/05 Java/Android