持续创作,加快生长!这是我参与「日新计划 6 月更文应战」的第14天,点击检查活动概况
咱们好~我是
米洛
!
我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程
,希望咱们多多支撑。
欢迎关注我的大众号米洛的测开日记
,获取最新文章教程!
回顾
上一节咱们完成了mitmproxy的demo版本,这一节咱们来大刀阔斧,使用mitmproxy录制咱们需求的接口恳求
。
录制了以后,下一节咱们估量是要存取/解析这些恳求,最终一步便是转换为pity
的测试用例了。当然,为了通用,最好咱们也能支撑har/jmx等其他文件的导入。
录制流程
- 用户在页面输入要录制的url
- 用户点击开端录制,服务端将用户的ip寄存到redis中,这样用户就算中途脱离,刷新页面仍然能看到对应的录制数据和录制仍在进行中的状态
- 用户点击中止录制按钮,结束录制,后续便是用例的生成工作了
本节分2部分,建议配合起来阅读。先给咱们看个概览:
配置代理
依据mitmproxy官网可知,他们需求至少python3.8以上,所以咱们也趁这个时机晋级一下python吧~究竟3.8也发布很久了。
接着咱们需求先装置mitmproxy,因为他需求跟着咱们的服务发动:
pip install mitmproxy
装置好以后,咱们来配置咱们的MITMPROXY发动端口,暂定为7778吧~
由于配置文件我有少许改动,可以参阅下文档: fastapi.tiangolo.com/advanced/se…
这里就不细说了。基本用法和之前相似,只不过是从conf/dev.env里边读取配置。
咱们敞开mock并且设置好对应的端口号。
编写Redis缓存接口恳求的方法
我的计划是把暂时录制的恳求(保存1小时)放入redis,与该用户的ip绑定,假如1小时内用户暂时脱离,比如去上了个厕所
,回来也能持续操作。
所以咱们需求写一个redis缓存接口恳求的方法,下面是代码:
咱们用列表寄存这个用户录制的恳求(使用ip地址的仅有性保证key的仅有),接着判别这个key是否设置了过期时刻,假如没有则给它设置1小时的过期时刻。
编写proxy插件
咱们现在开端动手编写一个录制插件,看过上篇文章的观众应该都很了解。
"""
流量录制->生成case功用
record steps and generate testcase
"""
import asyncio
import json
import re
from app.core.ws_connection_manager import ws_manage
from app.enums.MessageEnum import WebSocketMessageEnum
from app.middleware.RedisManager import RedisHelper
from app.proxy.utils import RequestInfo
class PityRecorder(object):
async def response(self, flow):
# 获取当前录制到的客户端ip地址
addr = flow.client_conn.address[0]
# 判别这个ip是否敞开了录制,没敞开的话,直接return
record = await RedisHelper.get_address_record(addr)
if not record:
return
# 获取录制的url信息
data = json.loads(record)
# 判别当前的url是否和配置的url匹配
pattern = re.compile(data.get("regex"))
# 假如匹配则持续
if re.findall(pattern, flow.request.url):
# 忽略js、css等文件 忽略options恳求
if flow.request.method.lower() == "options":
return
if flow.request.url.endswith(("js", "css", "ttf", "jpg", "svg", "gif")):
return
# 阐明已敞开录制开关,记载状态 这里将flow里边的request进行了转换
request_data = RequestInfo(flow)
# 序列化为str,方便存入redis
dump_data = request_data.dumps()
# 记载录制的接口数据
await RedisHelper.cache_record(addr, dump_data)
# 经过websocket发送到录制页面,使页面生成最新的数据
asyncio.create_task(ws_manage.send_data(data.get("user_id"), WebSocketMessageEnum.RECORD,
dump_data))
注释里边写的很详尽,这里边有一部分代码还没有实现,涉及到的是redis和websocket那块,大体意思咱们能理解即可。
接着咱们要将插件挂载到mitmproxy:
app/proxy/__init__.py里边包裹了一个start_proxy的方法,先判别用户是否装置了mitmproxy,接着把recorder插件挂载进来,使用DumpMaster发动mitmproxy即可。
上面便是本节内容,下一节咱们具体细化websocket、redis还有前端部分内容,敬请期待。