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. [源码解析] 并行分布式框架 Celery 之架构 (1)

    [源码解析] 并行分布式框架 Celery 之架构 (1) 目录 [源码解析] 并行分布式框架 Celery 之架构 (1) 0x00 摘要 0x01 Celery 简介 1.1 什么是 Celery ...

  2. C# 输出一个字符串的前缀、后缀和它的子串(信息内容安全 实验一)

    一.什么是前后缀 字符串的前缀:符号串左部的任意子串(或者说是字符串的任意首部) 字符串的后缀:符号串右部的任意子串(或者说是字符串的任意尾部) 举例:比如 101110 它的前缀就是空串.1.10. ...

  3. 通过lms.samples熟悉lms微服务框架的使用

    经过一段时间的开发与测试,终于发布了Lms框架的第一个正式版本(1.0.0版本),并给出了lms框架的样例项目lms.samples.本文通过对lms.samples的介绍,简述如何通过lms框架快速 ...

  4. [DFS]特殊的质数肋骨

    特殊的质数肋骨 时间限制:1000MS----内存限制:256000KB 题目描述 农民约翰母牛总是产生最好的肋骨. 你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们. 农民约翰确定他卖给买 ...

  5. SVN讲解

    1.SVN是什么? 代码版本管理工具 它能记住你每次的修改 查看所有的修改记录 恢复到任何历史版本 恢复到已经删除的文件 2.SVN和Git相比,有什么优势? 使用简单,上手快 git没有目录级权限控 ...

  6. C# List常用方法及Dictionary常用方法汇总

    本文主要汇总了在开发过程中,使用List和Dictionary常用的方法,例如增.删.改.查.排序等等各种常用操作. 在平时的开发过程中,List和Dictionary是我们经常使用到的数据结构,而且 ...

  7. Sentinel上生产环境只差一步,监控数据持久化

    之前介绍了Sentinel相关的文章,小伙伴在生产实践中不知道有没有这个疑问?我们的Sentinel控制台监控的数据只能看最近5分钟的,如图 那么就导致历史数据是查看不了的,那肯定是不行的,在生产环境 ...

  8. linux下Mysql 8.0.19 编译安装

    1 前言 linux下安装MySQL的方式有很多种,包括以仓库的方式安装(yum,apt,zypper),以包的方式安装(rpm,deb),以docker方式安装,从压缩包解压安装,从源码编译安装,这 ...

  9. Nginx篇

    1 基本操作命令 先CD到nginx.exe目录 启动nginx服务 nginx start nginx 优雅停止nginx,有连接时会等连接请求完成再杀死worker进程 nginx -s quit ...

  10. 02- HTML网页基础知识与浏览器介绍

    1.认识网页 网页主要由文字,图像和超链接等元素构成.当然,除了这些元素,网页还可以包含音频,视频,以及flask等. 如图所示就是一个网页: 网页是如何形成的呢? 它是由前端人员写的代码,经过浏览器 ...