利用MixProxy自动录制生成Pytest案例:轻松实现测试脚本编写!

前言

进行接口自动化时,有时候往往没有接口文档,或者文档更新并不及时,此时,想要获取相关接口,通过抓包是一种快速便捷的手段。抓包获取到接口后,开始写接口用例,此时需要复制请求url、请求参数等,时间长了必然觉得索然无味,重复的工作为何不想办法变为自动化呢?那该如何将抓包获得接口自动转变为pytest接口自动化用例呢?带着这个疑问,继续查看文章。

如何录制接口用例?

在进入正题前,我们先抛出这个工具mitmproxy, 它是一个开源的中间人代理工具,这里不做详细介绍了,下面进入实现细节

编写 mitmproxy 脚本

创建一个 Python 脚本(例如 record.py),其中包含 mitmproxy 的脚本代码。在脚本中,你可以使用 http 模块监听请求和响应,并将其保存到测试用例所需的格式中。

from mitmproxy import http
​
​
class Recorder:
​
    def __init__(self, domains):
        self.domains = domains
​
    def response(self, flow: http.HTTPFlow) -> None:
        for domain in self.domains:
            if domain in flow.request.pretty_host:
                test_case_name = f"test_{flow.request.path.split('?')[0].replace('/', '_').strip('_')}.py"
                url = flow.request.url
                method = flow.request.method
                headers = dict(flow.request.headers)
                data = flow.request.text
                body = ""
                if method == "GET" and data:
                    body = f"params={data}"
                else:
                    body = f"json={data}"
            test_case_content = f"""
import requests
​
def {test_case_name.replace('.py', '')}():
​
    # 请求URL: {flow.request.url}
    # 请求方法: {flow.request.method}
    # 请求头部: {dict(flow.request.headers)}
    # 请求数据: {flow.request.text}
    # 响应状态码: {flow.response.status_code}
    # 响应头部: {dict(flow.response.headers)}
    # 响应数据: {flow.response.text}
    
    response = requests.{method.lower()}(
        url="{url}",
        headers={headers},
        {body}
    )
​
    # 执行测试逻辑
    assert response.status_code == 200
"""
            with open(test_case_name, 'w') as f:
                f.write(test_case_content)
​
​
​
addons = [Recorder(domains=['test.api.example.cn'])]

其实整个代码看起来还是很容易的,笔者做个简单解释:

这段代码定义了一个名为'Recorder'的类,该类的主要功能是根据输入的HTTP流('http.HTTPFlow')生成对应的Python测试用例。

  • 'init': '这是一个构造函数,用于初始化Recorder类的实例。它接收一个参数domains,这个参数是一个列表,列表中的元素是字符串,表示需要关注的域名。
  • 'response': '这个函数接收一个参数flow,它是HTTP流的对象。函数遍历所有的域名,如果流请求的主机名包含在关注的域名列表中,就生成一个测试用例。测试用例的名字是根据请求的路径生成的。测试用例的内容是一个Python函数,这个函数使用requests库来发送一个HTTP请求,并断言响应的状态码是200。请求的参数(如URL、请求方法、头部、数据等)都是从传入的HTTP流中获取的。'}
  • 'addons': '这个列表包含一个Recorder类的实例,这个实例关注的域名是<test.api.example.cn>。'}

运行 mitmproxy

使用以下命令运行 mitmproxy,并指定刚才编写的脚本:

mitmproxy -s record.py

此时,mitmproxy 将会启动并开始监听请求和响应。

验证结果

配置代理后,我们抓包请求,会自动生成该域名下的case,以下是笔者抓包生成的case

test_user_info.py

import requests
​
def test_user_info():
​
    # 请求URL: 
    # 请求方法: POST
    # 请求头部: {}
    # 请求数据: 
    # 响应状态码: 200
    # 响应头部: 
    # 响应数据: 
    response = requests.post(
        url="",
        headers={},
        json=
    )
​
    # 执行测试逻辑
    assert response.status_code == 200

可以看到还是很不错的,基本模版已经生成了,我们只需在增加一些断言即可。注意,笔者这里将请求相关数据删除了,正常的case其实是完成的,是可以直接运行的。

最后

通过这篇文章的学习,我们可以将 mitmproxy 录制的请求和响应数据自动生成为 pytest 的测试用例。这样可以方便地进行接口回归测试和功能验证,并提高测试效率。当然,你可以根据实际需要,修改生成的用例,扩展更多功能。

最后:下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!【100%无套路免费领取】

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

  全套资料获取方式:点击下方小卡片自行领取即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值