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 collections模块实例讲解
Apr 07 Python
跟老齐学Python之编写类之三子类
Oct 11 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
Python 带有参数的装饰器实例代码详解
Dec 06 Python
Python玩转加密的技巧【推荐】
May 13 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
python @classmethod 的使用场合详解
Aug 23 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
Feb 12 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
python开发人人对战的五子棋小游戏
May 02 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
一个更简单的无限级分类菜单代码
2007/01/16 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
PHP闭包实例解析
2014/09/08 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
jQuery 使用手册(二)
2009/09/23 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
Python爬虫之Selenium设置元素等待的方法
2020/12/04 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
error和exception有什么区别
2012/10/02 面试题
说出数据连接池的工作机制是什么?
2013/04/19 面试题
机械设计毕业生自荐信
2014/02/02 职场文书
老师的检讨书
2014/02/23 职场文书
高中班级口号
2014/06/09 职场文书
校庆标语集锦
2014/06/25 职场文书
法人身份证明书
2015/06/18 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
JS中如何优雅的使用async await详解
2021/10/05 Javascript