持续创作,加快生长!这是我参与「日新计划 6 月更文应战」的第14天,点击检查活动概况

咱们好~我是米洛
我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望咱们多多支撑。
欢迎关注我的大众号米洛的测开日记,获取最新文章教程!

回顾

上一节咱们完成了mitmproxy的demo版本,这一节咱们来大刀阔斧,使用mitmproxy录制咱们需求的接口恳求

录制了以后,下一节咱们估量是要存取/解析这些恳求,最终一步便是转换为pity的测试用例了。当然,为了通用,最好咱们也能支撑har/jmx等其他文件的导入。

录制流程

  1. 用户在页面输入要录制的url
  2. 用户点击开端录制,服务端将用户的ip寄存到redis中,这样用户就算中途脱离,刷新页面仍然能看到对应的录制数据和录制仍在进行中的状态
  3. 用户点击中止录制按钮,结束录制,后续便是用例的生成工作了

本节分2部分,建议配合起来阅读。先给咱们看个概览:

测试平台系列(132) 用例生成之录制接口请求(上)

配置代理

依据mitmproxy官网可知,他们需求至少python3.8以上,所以咱们也趁这个时机晋级一下python吧~究竟3.8也发布很久了。

测试平台系列(132) 用例生成之录制接口请求(上)

接着咱们需求先装置mitmproxy,因为他需求跟着咱们的服务发动:

pip install mitmproxy

装置好以后,咱们来配置咱们的MITMPROXY发动端口,暂定为7778吧~

由于配置文件我有少许改动,可以参阅下文档: fastapi.tiangolo.com/advanced/se…

这里就不细说了。基本用法和之前相似,只不过是从conf/dev.env里边读取配置。

测试平台系列(132) 用例生成之录制接口请求(上)

咱们敞开mock并且设置好对应的端口号。

编写Redis缓存接口恳求的方法

我的计划是把暂时录制的恳求(保存1小时)放入redis,与该用户的ip绑定,假如1小时内用户暂时脱离,比如去上了个厕所,回来也能持续操作。

所以咱们需求写一个redis缓存接口恳求的方法,下面是代码:

测试平台系列(132) 用例生成之录制接口请求(上)

咱们用列表寄存这个用户录制的恳求(使用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:

测试平台系列(132) 用例生成之录制接口请求(上)

app/proxy/__init__.py里边包裹了一个start_proxy的方法,先判别用户是否装置了mitmproxy,接着把recorder插件挂载进来,使用DumpMaster发动mitmproxy即可。

上面便是本节内容,下一节咱们具体细化websocket、redis还有前端部分内容,敬请期待。