接口自动化测试:apiAutoTest使用re 处理数据依赖
废话
目前在工作中写脚本的时候发现了一些之前开源的apiAutoTest的可优化项,后面应该也是会慢慢的继续优化了
2020/11/19
截止到写这篇文章的时间是,2020/11/19 00:53 现在也是把该项优化了,那优化了什么尼?
参数依赖
我理解的参数依赖/接口依赖就是接口进行关联操作,比如有些查询接口需要登录之后才可以操作,那么我们就需要拿到token之类的东西,这一部分东西是放到header中的,apiAutoTest围绕的只有路径参数依赖,请求数据依赖
路径参数依赖
譬如说现在的restful,一个users接口,路由一般这样的
users
他的请求方式是get,这个路由我们把他认为是查所有用户,如果查某一个用户可能是这样的users/:id
也是个get请求,这里这个id想表达的意思是这里有个需要个用户id的参数,比如1-500里面的任意1个,也就是说这个id是可变的,可以从登录接口的返回响应取一个叫userId的值请求参数依赖
这个应该好理解些,就是说支付接口需要的订单id,是从上一步提交订单接口返回的响应订单id
更新后的效果
由于在改动时发现了之前的代码挺绕的,而且都没什么帮助所以就不说了,如果对之前的感兴趣可以看这里:https://testerhome.com/topics/25003 , 下面上新版用例截图
关于文件改动,新增了
data_process.py
文件里面封装了请求保存实际结果响应,path参数处理,请求数据处理#!/usr/bin/env/python3
# -*- coding:utf-8 -*-
"""
@project: apiAutoTest
@author: zy7y
@file: data_process.py
@ide: PyCharm
@time: 2020/11/18
"""
import json
import re
from tools import * class DataProcess:
response_dict = {}
header = {}
null_header = {} @classmethod
def save_response(cls, key: str, value: object) -> None:
"""
保存实际响应
:param key: 保存字典中的key,一般使用用例编号
:param value: 保存字典中的value,使用json响应
"""
cls.response_dict[key] = value
logger.info(f'添加key: {key}, 对应value: {value}') @classmethod
def handle_path(cls, path_str: str = '') -> str:
"""路径参数处理
:param path_str: 带提取表达式的字符串 /&$.case_005.data.id&/state/&$.case_005.data.create_time&
上述内容表示,从响应字典中提取到case_005字典里data字典里id的值,假设是500,后面&$.case_005.data.create_time& 类似,最终提取结果
return /511/state/1605711095
"""
# /&$.case.data.id&/state/&$.case_005.data.create_time&
path_str.split('/')
for i in re.findall('&(.*?)&', path_str):
path_str = path_str.replace(f'&{i}&', str(extractor(cls.response_dict, i)))
logger.info(f'提取出的路径地址: {path_str}')
return path_str @classmethod
def handle_header(cls, is_token: str, response: dict, reg) -> dict:
"""处理header"""
if is_token == '写':
cls.header['Authorization'] = extractor(response, reg)
return cls.header
elif is_token == '':
return cls.null_header
else:
return cls.header @classmethod
def handle_data(cls, variable: str) -> dict:
"""请求数据处理
:param variable: 请求数据,传入的是可转换字典/json的字符串,其中可以包含变量表达式
return 处理之后的json/dict类型的字典数据
"""
if variable == '':
return
for i in re.findall('&(.*?)&', variable):
variable = variable.replace(f'&{i}&', str(extractor(cls.response_dict, i)))
if 'null' in variable:
variable = variable.replace('null', 'None')
if 'true' in variable:
variable = variable.replace('true', 'True')
if 'false' in variable:
variable = variable.replace('false', 'False')
logger.info(f'最终的请求数据如下: {variable}')
return eval(variable)相比之前这种写法应该更加清晰,然后之前的请求数据是采用字典合并的方式,在请求数据多层结构的时候会出现bug,现在改成了文本替换之后转json/dict的方法
新版依赖数据如何使用
举个例子
假设现在有个实际响应结果字典如下
{"case_002": {
"data": {
"id": 500,
"username": "admin",
"mobile": "12345678",
}},
"case_005": {
"data": {
"id": 511,
"create_time": 1605711095
},
}
}
excel中接口路径内容:
users/&$.case_005.data.id&/state/&$.case_005.data.careate_time&
代码内部解析后如下:
users/511/state/1605711095
&$.case_005.data.id&
代表从响应字典中提取case_005字典中data字典中的id的值,提取出来的结果是511excel中请求参数内容如下:
{
"pagenum": 1,
"pagesize": "12",
"data": &$.case_005.data&,
"userId": &$.case_002.data.id&
}
代码内部解析后如下:
{
"pagenum": 1,
"pagesize": "12",
"meta": {
"id": 511,
"create_time": 1605711095
},
"userId": 500
}
其实不难看出其中规则&jsonpath提取语法&
,如果你需要的内容是字符串类型,只需要这样"&jsonpath提取语法&"
源码地址
github: https://github.com/zy7y/apiAutoTest.git
gitee: https://gitee.com/zy7y/apiAutoTest.git
道谢
谢谢各位的点评,在实际工作写到之后发现之前的写法的确不如意,希望多写,然后进步~晚安
接口自动化测试:apiAutoTest使用re 处理数据依赖的更多相关文章
- 接口自动化测试框架 (一) :APIAutoTest框架
前言 随着测试技术的发展,接口自动化测试逐渐成为各大公司投入产出比最高的测试技术.介入时间早,执行效率高,稳定性高的优点,让越来越多的公司引入接口自动化测试. 框架简介 APIAutoTest是处理A ...
- 接口自动化测试框架 :APIAutoTest框架
前言 随着测试技术的发展,接口自动化测试逐渐成为各大公司投入产出比最高的测试技术.介入时间早,执行效率高,稳定性高的优点,让越来越多的公司引入接口自动化测试. 框架简介 APIAutoTest是处理A ...
- Python接口自动化测试框架: pytest+allure+jsonpath+requests+excel实现的接口自动化测试框架(学习成果)
废话 最近在自己学习接口自动化测试,这里也算是完成一个小的成果,欢迎大家交流指出不合适的地方,源码在文末 问题 整体代码结构优化未实现,导致最终测试时间变长,其他工具单接口测试只需要39ms,该框架中 ...
- python - 接口自动化测试 - RunTest - 测试用例加载执行/测试报告生成
# -*- coding:utf-8 -*- ''' @project: ApiAutoTest @author: Jimmy @file: run_test.py @ide: PyCharm Com ...
- Python接口自动化测试框架实战 从设计到开发
第1章 课程介绍(不要错过)本章主要讲解课程的详细安排.课程学习要求.课程面向用户等,让大家很直观的对课程有整体认知! 第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的htt ...
- seldom 2.0 让接口自动化测试更简单
前言 HTTP接口测试很简单,不管工具.框架.还是平台,只要很的好的几个点就是好工具. 测试数据问题:比如删除接口,重复执行还能保持结果一致,必定要做数据初始化. 接口依赖问题:B接口依赖A的返回值, ...
- 接口自动化测试的"开胃小菜"---简单黑客攻击手段
Web应用系统的小安全漏洞及相应的攻击方式 接口自动化测试的"开胃小菜" 1 写作目的 本文讲述一个简单的利用WebAPI来进行一次基本没有破坏力的“黑客”行为. 主要目的如下 ...
- APP接口自动化测试JAVA+TestNG(三)之HTTP接口测试实例
前言 前两篇普及相关基础知识后,本篇主要对举例对国家气象局接口自动化测试进行讲解(Get请求及结果断言),以达到自动化测试入门目的,除了前两篇的一些了解外,需要有一定的JAVA知识(HTTP相 ...
- APP接口自动化测试JAVA+TestNG(二)之TestNG简介与基础实例
前言 继上篇环境篇后,本篇主要对TestNG进行介绍,给出最最基础的两个实例,通过本文后,学会并掌握TestNG测试用例的编写与运行,以及生成美化后的报告.下一篇为HTTP接口实战(国家气象局接口自动 ...
- 手把手教你接口自动化测试 – SoapUI & Groovy
手把手教你接口自动化测试 – SoapUI & Groovy http://www.cnblogs.com/wade-xu/p/4236295.html 关键词:SoapUI接口测试,接口自动 ...
随机推荐
- 【C/C++编程入门学习】C语言结构体硬核玩法分享,一切皆是数据!
前言 对于结构体的应用太多了,今天这篇文章我主要为大家总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,如果你对结构体的基础知识还不具备的话得回头看一下专栏教程或者自己找本书籍学习 ...
- centos8安装fastdfs6.06集群方式一之:软件下载与安装
一,查看本地centos的版本 [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 说 ...
- Excel中外部数据链接无法删除的解决方法【转】
[摘要] 当Excel中公式引用了外部数据,每次打开时,总是自动弹出自动更新链接的对话框.如何找到这些链接?有没有办法实现断开原有链接,而保持数值不变? 有客户反应,当Excel无法链接到外部数据后, ...
- 圆形进度条的模仿3-DrawArc,DrawCircle,DrawText,自定义属性实例讲解
前面两篇中已经讲过如何使用drawARC,等,画其他的图形的方法的使用也是一样的,只是参数不同, 同时也讲了如何通过xml进行自定义属性,接下来这篇便是通过实例讲解如何实地应用起来, 效果如下,点击开 ...
- Pytest学习(三) - setup和teardown的使用
一.前言 从文章标题可以看出,就是初始化和释放的操作,根据我的java习惯来学习pytest,个人感觉没差太多,理解上也不是很难. 哦,对了,差点跑题了,这个框架是基于Python语言的,在学习的时候 ...
- s == t 何解?
Integer s=new Integer(9); Integer t=new Integer(9); Long u=new Long(9); (s==t) 这个是错的,只要有new这个关键字 ...
- Graph-to-ID task
首先图像是一个二维的结构,CNN提取图片的特征,但是是local的,通过kenel的形式,不断的图上移动,通过卷积的形式, 无论移动到哪个位置,内部的结构都是不变的,这就是参数共享. 这个所说的图像显 ...
- ctfshow 1024杯 部分web题解
------------恢复内容开始------------ 今年1024忙得厉害,去大上海参加geekpwn膜拜大佬,几家平台的题目没怎么好好看.特别是小破站的比赛拉跨的一批,bytectf的web ...
- MongoDB 数据备份和恢复 --- MongoDB基础用法(七)
数据备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据.该命令可以导出所有数据到指定目录中. mongodump命令可以通过参数指定导出的数据量级转存的服务器. mongo ...
- 02 . Go框架之Gin框架从入门到熟悉(数据解析和绑定,渲染,重定向,同步异步,中间件)
数据解析和绑定 json数据解析和绑定 package main import ( "github.com/gin-gonic/gin" "net/http" ...