前言
进行接口自动化时,有时候往往没有接口文档,或者文档更新并不及时,此时,想要获取相关接口,通过抓包是一种快速便捷的手段。抓包获取到接口后,开始写接口用例,此时需要复制请求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.urlmethod = flow.request.methodheaders = dict(flow.request.headers)data = flow.request.textbody = ""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、计算机基础