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统计文件行数示例分享
Feb 21 Python
Python中optionParser模块的使用方法实例教程
Aug 29 Python
python分析nignx访问日志脚本分享
Feb 26 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
Feb 10 Python
pycharm 主题theme设置调整仿sublime的方法
May 23 Python
Python基于生成器迭代实现的八皇后问题示例
May 23 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
Feb 29 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
python爬虫用request库处理cookie的实例讲解
Feb 20 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
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
2009/10/31 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
淘宝搜索框效果实现分析
2011/03/05 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
JS 修改URL参数(实现代码)
2013/07/08 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
2015/01/19 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
解决Layui 表单提交数据为空的问题
2018/08/15 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
2018/09/16 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
JS隐藏号码中间4位代码实例
2019/04/09 Javascript
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
Python读写ini文件的方法
2015/05/28 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
python实现人像动漫化的示例代码
2020/05/17 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
2020/05/27 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
商场消防安全责任书
2014/07/29 职场文书
关于教师节的广播稿
2014/09/10 职场文书
深入理解python多线程编程
2021/04/18 Python
详解Python自动化之文件自动化处理
2021/06/21 Python
实操Python爬取觅知网素材图片示例
2021/11/27 Python
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis