apiAutoTest

先软文介绍下:apiAutoTest是个人和众多测试同行参与(提供新的需求)的一个接口测试工具项目.

Gitee: https://gitee.com/zy7y/apiAutoTest

Github: https://github.com/zy7y/apiAutoTest

目前功能

  • [x] 测试前后数据库备份操作,个人理解算数据清洗
  • [x] 各接口之间的测试数据依赖
  • [x] 自定义扩展函数定义,解决部分加密算法
  • [x] 后置sql,结果用于依赖或者断言(select 语句只能查出第一条)1. * *
  • [x] 实际结果可动态提取,与预期结果绝对==
  • [x] 可选用例失败重跑机制
  • [x] 基于mitmproxy录制接口生成用例文件

重大更新(个人认为)

在之前的一篇自定义函数简单实现方式时,有提醒到语法可能出现冲突,所以在前两天更新时已经统一了语法${}

无论是使用依赖参数还是自定义方法都使用${}, 为了避免每次使用其他接口返回提取jsonpath表达式在用例中的冗余(或许也提高了些性能,之前版本是会保存整个响应内容的),用例中增加了提取参数来实现形式如下

{
// key -> id 为其他接口使用时的参数变量 用法 ${id}
"id": "$.data.id" // $.data.id 实则为jsonpath表达式 从当前响应中提取id值
}

相关使用文档: 可到源码Readme.md 文件中前往 在线文档查看

本次更新

**本次更新内容使用演示视频: 点击访问B站 **

契机

有同志,希望有个录制功能来减少手写参数的时间

根本

基于mitmproxy, 抓包微信小程序 使用其提供的扩展API, 通过mitmproxy 实现代理之后捕获到HTTP/HTTPS请求,并把请求已追加的形式添加到excel中,当录制完成务必使用ctrl + c 关闭录制,将生成一个完成的用例数据文件

可指定录制包含请求地址的接口

如何录制

  1. 前置条件: https://www.cnblogs.com/zy7y/p/14798151.html

  2. 打开本机代理

  3. 修改tools\recording.py中配置抓包请求地址, 用例生成路径

  4. apiAutoTest根目录下执行

    mitmweb -s tools\recording.py

  5. 正常去使用就行了,当不需要录制的时候 在上面这个窗口Ctrl + C停止录制,然后关闭本机代理

录制的用例

因为默认录制的url是完整的url,所以如果直接用这个文件,请把config/config.yaml中的serve dev 基准地址换成"", 因为条件有限没法覆盖测试很多内容这快功能可能会有Bug, 目前个人测试了Graphql规范接口的录制,RestFul规范接口录制, 不排除其他的无法完整的生成用例文件

需要注意Excel 单元格字符数限制问题, Graphql规范接口非常容易出现不可写入的情况, 单从业务接口来说应该不容易出现此类问题

执行录制的用例

config/config.yaml修改基准地址dev"",指定使用录制的用例文件

server:
# 本地接口服务
test: http://127.0.0.1:8888/
# https://space.bilibili.com/283273603 演示项目后端服务来自
# dev: http://www.ysqorz.top:8888/api/private/v1/
dev: ''
# 基准的请求头信息
request_headers: {}
file_path:
test_case: data/case_data1.xls # 指定使用那个用例,这里使用了录制的用例
report: report/
log: log/run{time}.log
....

执行结果

实现源码

#!/usr/bin/env/ python3
# -*- coding:utf-8 -*-
"""
@Project: apiAutoTest
@File :recording.py
@Author:zy7y
@Date :2021/5/21 22:07
@Desc : 录制接口,生成用例文件
基于mitmproxy实现
参考资料:
https://blog.wolfogre.com/posts/usage-of-mitmproxy/
https://www.cnblogs.com/liuwanqiu/p/10697373.html
""" import json import mitmproxy.http
import xlwt # 上传文件接口不能录入文件参数 , excel单元格限制: Exception: String longer than 32767 characters
from mitmproxy import ctx class Counter:
def __init__(self, filter_url: str, filename: str = "data/case_data1.xls"):
"""
基于mitmproxy抓包生成用例数据
:param filter_url: 需要过滤的url
:param filename: 生成用例文件路径
"""
self.url = filter_url
self.excel_row = [
'编号',
'用例标题',
'请求头',
'接口地址',
'是否执行',
'请求方式',
'入参关键字',
'上传文件',
'请求数据',
'提取参数',
'后置sql',
'预期结果']
self.cases = [self.excel_row]
self.counter = 1
self.file = filename def response(self, flow: mitmproxy.http.HTTPFlow):
"""
mitmproxy抓包处理响应,在这里汇总需要数据
:param flow:
:return:
"""
if self.url in flow.request.url:
# 编号
number = "C" + str(self.counter)
# 标题
title = "mitmproxy录制接口" + str(self.counter)
try:
token = flow.request.headers["Authorization"]
except KeyError:
token = ''
header = json.dumps({"Authorization": token})
data = flow.request.text
# 请求地址,config.yaml 里面基准环境地址 写 空字符串
method = flow.request.method.lower()
url = flow.request.url
try:
content_type = flow.request.headers['Content-Type']
except KeyError:
content_type = ''
if 'form' in content_type:
data_type = "data"
elif 'json' in content_type:
data_type = 'json'
else:
data_type = 'params'
if '?' in url:
data = url.split('?')[1]
data = self.handle_form(data)
# 预期结果
expect = json.dumps(
{".": json.loads(flow.response.text)}, ensure_ascii=False) # 日志
ctx.log.info(url)
ctx.log.info(header)
ctx.log.info(content_type)
ctx.log.info(method)
ctx.log.info(data)
ctx.log.info(flow.response.text)
case = [
number,
title,
header,
url.split('?')[0],
"是",
method,
data_type,
"",
data,
"",
"",
expect]
self.cases.append(case)
self.counter += 1
# 文件末尾追加
self.excel_cases() def excel_cases(self):
"""
对二维列表cases进行循环并将内容写入单元格中
:return:
"""
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet('用例数据')
for x in range(len(self.cases)):
for y in range(len(self.cases[x])):
worksheet.write(x, y, self.cases[x][y])
try:
workbook.save(self.file)
except Exception as e:
print(e) def handle_form(self, data: str):
"""
处理 Content-Type: application/x-www-form-urlencoded
默认生成的数据 username=admin&password=123456
:param data: 获取的data 类似这样 username=admin&password=123456
:return:
"""
data_dict = {}
if data.startswith('{') and data.endswith('}'):
return data
try:
for i in data.split('&'):
data_dict[i.split('=')[0]] = i.split('=')[1]
return json.dumps(data_dict)
except IndexError:
return '' addons = [
Counter("http://www.ysqorz.top:8888/api/private/v1/")
] """ mitmweb -s tools\recording.py 启动
ctrl + C 停止 并生成完整用例
"""

参考资料

https://docs.mitmproxy.org/stable/

https://blog.wolfogre.com/posts/usage-of-mitmproxy/

https://www.cnblogs.com/liuwanqiu/p/10697373.html

apiAutoTest:基于mitmproxy实现接口录制的更多相关文章

  1. Matlab与.NET基于类型安全的接口混合编程入门

    原文:[原创]Matlab与.NET基于类型安全的接口混合编程入门 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ...

  2. 基于注解的接口限流+统一session认证

    代码心得: 一个基本的做法:对于用户身份认证做到拦截器里,针对HandlerMethod进行统一拦截认证,根据方法上的注解标识,判别是否需要身份验证,并将查找出来的User实体存入ThreadLoca ...

  3. 基于HttpRunner的接口自动化测试平台HttpRunnerManager(二)

    https://github.com/HttpRunner/HttpRunnerManager HttpRunnerManager Design Philosophy 基于HttpRunner的接口自 ...

  4. ASP.NET Core WebApi基于JWT实现接口授权验证

    一.ASP.Net Core WebApi JWT课程前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再 ...

  5. 基于postman测试接口(整套接口测试)

    基于postman测试接口(整套接口测试) 可以解决的问题 几百个接口人工测试接口过于繁杂 大多测试无法使用请求结果当参数 可以使用随机参数 支持swagger信息导入 随账号持久化保存数据 对集合一 ...

  6. 基于Redis&MySQL接口幂等性设计

    基于Redis&MySQL接口幂等性设计 欲把相思说似谁,浅情人不知. 1.幂等 幂等性即多次调用接口或方法不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致. 2.幂等使用场景 前 ...

  7. 基于Jmeter的接口自动化测试实践

    在去年实施了一年的三端(PC.无线M站.无线APP[Android.IOS])后,今年7月份开始,我们开始进行接口自动化的实施,目前已完成了整个框架的搭建以及接口的持续测试集成.今天做个简单的分享. ...

  8. 从壹开始前后端分离 40 || 完美基于AOP的接口性能分析

    旁白音:本文是不定时更新的.net core,当前主线任务的Nuxt+VueAdmin教程的 nuxt.js 之 tibug项目已上线,大家可以玩一玩:http://123.206.33.109:70 ...

  9. 基于 Markdown 编写接口文档

    最近公司开发项目需要前后端分离,这样话就设计到后端接口设计.复杂功能需要提供各种各样的接口供前端调用,因此编写API文档非常有必要了 网上查了很多资料,发现基于Markdown编写文档是一种比较流行而 ...

随机推荐

  1. CUDA Cudnn pytorch 安装及错误 RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED解决

    看我结论,大家试试看最后装pytorch看行不行,不行就去冲了PyTorch   /Doge ubuntu 20.04 下安装CUDA,参考这个博主写的,先看显卡支持的最高CUDA版本,之后找一个较新 ...

  2. NetCore的缓存使用详例

    关于我 作者博客|文章首发 缓存基础知识 缓存可以减少生成内容所需的工作,从而显著提高应用程序的性能和可伸缩性. 缓存最适用于不经常更改的 数据,生成 成本很高. 通过缓存,可以比从数据源返回的数据的 ...

  3. abp加DDD开发:低耦合、可复用、可扩展的【工单】业务模块-简介和集成

    前言 很多场景[单体+模块化]比微服务更合适,开发难度低.代码可复用性强.可扩展性强.模块化开发有些难点,模块启动与卸载.模块之间的依赖和通讯.asp.net core abp为我们提供了模块化开发能 ...

  4. 如何开发一个APP——转自知乎

    作者:简单点链接:https://www.zhihu.com/question/22999185/answer/155469014来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  5. 关于ArrayList 中子方法 -- contains 疑惑解决

    写之前先看下 ArrayList 子函数 contains 的Api 怎么介绍: boolean contains(Object o)           如果此列表中包含指定的元素,则返回 true ...

  6. BLE链路层空中包格式

    空中包格式 BLE链路层的空中包格式非常简单,它所有的空中包都遵循下图所示的格式: 有上图可见,BLE空中包由4个部分组成,他们分别是: 前导码(Preamble) 访问地址(Access Addre ...

  7. 另类的曲线方式定时Start up/Shut down VM 的解决方案

    一,引言 最近看到一位小兄弟在为了做 Azure 云虚拟机的自动关机开启 在群里求助,最后也不知道结果咋样了. 至于他提到的利用 Automation Account 我是没有接触过,并且也没有看资料 ...

  8. 软件调研——GoodNotes 5与Notability

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 作业要求 我在这个课程的目标是 积累软件开发经验,提高工程能力 这个作业在哪个具体方面帮助我实现目标 深入调 ...

  9. 035- 控制语句_break和continue

    break break是java语言中的关键字,中文是打断,终止的意思 可以用在switch语句中,结束分支语句,防止case穿透现象的发生. 可以出现在循环当中,作用是结束整个循环的执行,默认情况下 ...

  10. hdu4291 暴力循环节+矩阵快速幂

    题意:       给你一个关系式,x[n] = 3*x[n-1] + x[n-2],求x(x(x[n]))%1000000007. 思路:       做这个题目要明确一点,就是对于取余操作大多数时 ...