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 相关文章推荐
推荐11个实用Python库
Jan 23 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
Python3调用微信企业号API发送文本消息代码示例
Nov 10 Python
Python 数据处理库 pandas进阶教程
Apr 21 Python
解决Python获取字典dict中不存在的值时出错问题
Oct 17 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 Python
python可视化实现KNN算法
Oct 16 Python
python 使用shutil复制图片的例子
Dec 13 Python
python中wheel的用法整理
Jun 15 Python
Python DES加密实现原理及实例解析
Jul 17 Python
Python爬虫防封ip的一些技巧
Aug 06 Python
python如何爬取动态网站
Sep 09 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
中国收音机工业发展史
2021/03/02 无线电
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
JavaScript Konami Code 实现代码
2009/07/29 Javascript
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
JS前端框架关于重构的失败经验分享
2013/03/17 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
在axios中使用params传参的时候传入数组的方法
2018/09/25 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
vue实例的选项总结
2020/06/09 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Python subprocess模块常见用法分析
2018/06/12 Python
简单了解python反射机制的一些知识
2019/07/13 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
python关闭占用端口方式
2019/12/17 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
canvas裁剪clip()函数的具体使用
2018/03/01 HTML / CSS
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
港湾网络笔试题
2014/04/19 面试题
副职竞争上岗演讲稿
2014/05/12 职场文书
捐书倡议书
2014/08/29 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
Python的这些库,你知道多少?
2021/06/09 Python
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android