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实现远程调用MetaSploit的方法
Aug 22 Python
详解Django通用视图中的函数包装
Jul 21 Python
详解字典树Trie结构及其Python代码实现
Jun 03 Python
Python2.7编程中SQLite3基本操作方法示例
Aug 09 Python
Python使用matplotlib简单绘图示例
Feb 01 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
在python中使用xlrd获取合并单元格的方法
Dec 26 Python
opencv实现简单人脸识别
Feb 19 Python
Matplotlib使用Cursor实现UI定位的示例代码
Mar 12 Python
详解Python中namedtuple的使用
Apr 27 Python
python 生成器需注意的小问题
Sep 29 Python
python 中的jieba分词库
Nov 23 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 动态执行带有参数的类方法
2009/04/10 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
2018/07/31 PHP
Javascript将string类型转换int类型
2010/12/09 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
Ajax的概述与实现过程
2016/11/18 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
urllib2自定义opener详解
2014/02/07 Python
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
PHP实现发送和接收JSON请求
2018/06/07 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
Pytorch之Variable的用法
2019/12/31 Python
PyTorch加载预训练模型实例(pretrained)
2020/01/17 Python
python3实现网页版raspberry pi(树莓派)小车控制
2020/02/12 Python
如何利用python web框架做文件流下载的实现示例
2020/06/02 Python
Python提取视频中图片的示例(按帧、按秒)
2020/10/22 Python
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
广州某公司软件工程师面试题
2014/12/22 面试题
物流专业大学生求职信范文
2013/10/28 职场文书
初中化学教学反思
2014/01/23 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
Django使用echarts进行可视化展示的实践
2021/06/10 Python