Pytest API Reporter:零配置的接口自动化测试报告生成神器
Pytest API Reporter:零配置的接口自动化测试报告生成神器
📖 前言
在接口自动化测试中,测试报告的生成和展示一直是一个痛点。传统的pytest报告虽然功能强大,但对于接口测试来说,缺少对HTTP方法和接口路径的直观展示。今天给大家推荐一个基于pytest的接口自动化测试框架——Pytest API Reporter,它能够自动生成美观的HTML测试报告,让你告别繁琐的报告配置,专注于测试用例的编写。
✨ 项目亮点
1. 零配置,开箱即用
- 无需复杂配置,安装依赖后即可使用
- 自动收集测试结果,无需手动编写报告生成代码
- 测试完成后自动生成报告,无需额外操作
2. 多种接口信息定义方式
支持三种灵活的方式定义接口信息,适应不同的编码习惯:
- Pytest Marker(推荐):使用装饰器标记,代码清晰
- 函数文档字符串:在docstring中定义,简单直观
- Fixture参数:通过fixture传递,适合批量用例
3. 美观的HTML报告
- 📊 可视化统计图表:饼图展示测试结果分布
- 📋 详细的用例列表:显示HTTP方法、接口路径、耗时等信息
- 🔍 智能筛选功能:支持按状态筛选(全部/通过/失败/跳过/错误)
- 📄 错误详情展示:可展开查看失败用例的详细错误信息
- 📱 响应式设计:支持移动端查看,随时随地查看报告
4. 完善的测试统计
- 总用例数、通过率一目了然
- 失败、跳过、错误用例清晰标注
- 总耗时统计,便于性能分析
5. 基于pytest生态
- 完全兼容pytest的所有功能
- 支持pytest的所有插件和扩展
- 学习成本低,pytest用户零门槛使用
🚀 快速开始
环境要求
- Python 3.7+
- pytest >= 7.0.0
- requests >= 2.28.0(用于接口测试)
安装步骤
1. 克隆项目
git clone https://github.com/qinian2709/pytest-api-reporter
cd pytest-api-reporter
2. 安装依赖
pip install -r requirements.txt
或者直接安装:
pip install pytest requests
3. 运行测试
# 运行所有测试
pytest
# 运行指定测试文件
pytest tests/test_example.py -v
# 显示详细输出
pytest -vv
4. 查看报告
测试运行完成后,报告会自动生成在 reports/ 目录下:
# macOS
open reports/test_report.html
# Linux
xdg-open reports/test_report.html
# Windows
start reports/test_report.html
📝 编写测试用例
方式一:使用 Pytest Marker(推荐)⭐
这是最推荐的方式,代码清晰,易于维护:
import pytest
import requests
class TestUserAPI:
"""用户相关接口测试"""
base_url = "https://api.example.com"
@pytest.mark.api_method("POST")
@pytest.mark.api_path("/api/user/login")
def test_user_login(self):
"""测试用户登录接口"""
url = f"{self.base_url}/api/user/login"
data = {
"username": "test_user",
"password": "test_password"
}
response = requests.post(url, json=data, timeout=10)
assert response.status_code == 200
assert response.json()["code"] == 0
@pytest.mark.api_method("GET")
@pytest.mark.api_path("/api/user/info")
def test_get_user_info(self):
"""获取用户信息"""
url = f"{self.base_url}/api/user/info"
headers = {"Authorization": "Bearer token123"}
response = requests.get(url, headers=headers, timeout=10)
assert response.status_code == 200
优点:
- 接口信息与测试函数紧邻,一目了然
- 支持IDE自动补全和类型检查
- 便于代码审查和维护
方式二:使用函数文档字符串
如果你习惯在docstring中写接口信息,这种方式也很方便:
def test_user_login():
"""
POST /api/user/login
测试用户登录接口
"""
url = "https://api.example.com/api/user/login"
data = {
"username": "test_user",
"password": "test_password"
}
response = requests.post(url, json=data, timeout=10)
assert response.status_code == 200
def test_get_user_info():
"""
GET /api/user/info
获取用户信息
"""
url = "https://api.example.com/api/user/info"
headers = {"Authorization": "Bearer token123"}
response = requests.get(url, headers=headers, timeout=10)
assert response.status_code == 200
格式要求:
- 第一行必须是
METHOD /path/to/api的格式 - METHOD 可以是 GET、POST、PUT、DELETE 等
- 路径必须以
/开头
优点:
- 不需要额外的装饰器
- 文档字符串本身就是接口说明,一举两得
方式三:使用 Fixture
适合批量测试或需要动态配置的场景:
import pytest
@pytest.fixture
def api_method():
"""提供HTTP方法"""
return "POST"
@pytest.fixture
def api_path():
"""提供接口路径"""
return "/api/user/login"
def test_user_login(api_method, api_path):
"""
使用fixture方式定义接口信息的测试用例
"""
url = f"https://api.example.com{api_path}"
data = {
"username": "test_user",
"password": "test_password"
}
response = requests.post(url, json=data, timeout=10)
assert response.status_code == 200
优点:
- 适合批量用例的场景
- 可以动态配置接口信息
- 便于参数化测试
接口信息提取优先级
框架会按照以下优先级提取接口信息:
- Pytest Marker(最高优先级)
- Fixture参数
- 函数文档字符串
- 默认值(GET /)
如果同时使用多种方式,会按照优先级选择。
📊 报告功能详解
1. 统计概览
报告顶部显示测试统计信息:
- 总用例数:本次运行的所有测试用例数量
- 通过数:成功执行的用例数量及通过率
- 失败数:执行失败的用例数量
- 跳过数:被跳过的用例数量
- 错误数:执行出错的用例数量
- 总耗时:整个测试会话的执行时间
2. 可视化图表
使用饼图直观展示测试结果分布:
- 🟢 绿色:通过的用例
- 🔴 红色:失败的用例
- 🟡 黄色:跳过的用例
- ⚪ 灰色:错误的用例
3. 测试用例列表
每个用例显示以下信息:
- 状态标识:通过✅、失败❌、跳过⏭、错误⚠️
- HTTP方法:GET、POST、PUT、DELETE等
- 接口路径:完整的API路径
- 用例名称:测试函数的名称
- 执行耗时:该用例的执行时间(秒)
4. 状态筛选
支持按状态筛选用例:
- 全部:显示所有用例
- 通过:只显示通过的用例
- 失败:只显示失败的用例
- 跳过:只显示跳过的用例
- 错误:只显示出错的用例
5. 错误详情
对于失败的用例,可以点击展开查看详细的错误信息:
- 完整的错误堆栈
- 断言失败的具体原因
- 便于快速定位问题
🎯 实际应用场景
场景一:RESTful API测试
import pytest
import requests
class TestProductAPI:
"""商品API测试"""
base_url = "https://api.example.com"
@pytest.mark.api_method("GET")
@pytest.mark.api_path("/api/products")
def test_get_product_list(self):
"""获取商品列表"""
response = requests.get(f"{self.base_url}/api/products")
assert response.status_code == 200
assert len(response.json()["data"]) > 0
@pytest.mark.api_method("POST")
@pytest.mark.api_path("/api/products")
def test_create_product(self):
"""创建商品"""
data = {
"name": "测试商品",
"price": 99.99,
"stock": 100
}
response = requests.post(
f"{self.base_url}/api/products",
json=data
)
assert response.status_code == 201
@pytest.mark.api_method("PUT")
@pytest.mark.api_path("/api/products/{id}")
def test_update_product(self):
"""更新商品信息"""
product_id = 1
data = {"price": 199.99}
response = requests.put(
f"{self.base_url}/api/products/{product_id}",
json=data
)
assert response.status_code == 200
@pytest.mark.api_method("DELETE")
@pytest.mark.api_path("/api/products/{id}")
def test_delete_product(self):
"""删除商品"""
product_id = 1
response = requests.delete(
f"{self.base_url}/api/products/{product_id}"
)
assert response.status_code == 204
场景二:微服务接口测试
import pytest
import requests
class TestOrderService:
"""订单服务接口测试"""
@pytest.mark.api_method("POST")
@pytest.mark.api_path("/order-service/api/orders")
def test_create_order(self):
"""创建订单"""
# 测试代码...
pass
@pytest.mark.api_method("GET")
@pytest.mark.api_path("/order-service/api/orders/{orderId}")
def test_get_order_detail(self):
"""获取订单详情"""
# 测试代码...
pass
class TestPaymentService:
"""支付服务接口测试"""
@pytest.mark.api_method("POST")
@pytest.mark.api_path("/payment-service/api/payments")
def test_create_payment(self):
"""创建支付"""
# 测试代码...
pass
场景三:CI/CD集成
在CI/CD流水线中,可以这样使用:
# .gitlab-ci.yml 示例
test:
stage: test
script:
- pip install -r requirements.txt
- pytest tests/ -v
- # 报告会自动生成在 reports/test_report.html
artifacts:
paths:
- reports/
expire_in: 7 days
# Jenkinsfile 示例
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'pip install -r requirements.txt'
sh 'pytest tests/ -v'
}
}
stage('Archive Report') {
steps {
archiveArtifacts artifacts: 'reports/**', fingerprint: true
}
}
}
}
🔧 高级配置
自定义报告输出路径
如果需要修改报告的输出路径,可以编辑 tests/conftest.py:
def generate_html_report(report_data: Dict[str, Any]):
"""生成HTML报告文件"""
# 修改这里的路径
report_path = Path("custom_reports") / "my_test_report.html"
# ... 其他代码
添加自定义Marker
如果需要添加更多的接口信息(如接口版本、环境等),可以在 conftest.py 中注册:
def pytest_configure(config):
"""注册自定义marker"""
config.addinivalue_line(
"markers", "api_method(method): 标记接口的HTTP方法"
)
config.addinivalue_line(
"markers", "api_path(path): 标记接口的路径"
)
# 添加自定义marker
config.addinivalue_line(
"markers", "api_version(version): 标记接口版本"
)
扩展报告数据
如果需要收集更多的测试信息,可以在 pytest_runtest_makereport 钩子中添加:
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
rep = outcome.get_result()
# 在这里可以添加更多信息收集逻辑
# 例如:请求参数、响应数据、环境信息等
# ... 原有代码
❓ 常见问题
Q1: 报告没有生成怎么办?
A: 检查以下几点:
- 确保
conftest.py文件在测试目录中 - 确保
templates/report_template.html模板文件存在 - 检查是否有pytest执行错误
- 查看终端输出是否有错误信息
Q2: 接口信息显示不正确?
A: 检查接口信息的定义方式:
- 如果使用marker,确保格式正确:
@pytest.mark.api_method("POST") - 如果使用docstring,确保第一行格式为:
POST /api/path - 检查是否有多个定义方式冲突(按优先级选择)
Q3: 如何只运行失败的用例?
A: 使用pytest的 --lf 参数:
pytest --lf # 只运行上次失败的用例
pytest --ff # 先运行失败的,再运行其他的
Q4: 如何生成不同格式的报告?
A: 框架目前只支持HTML格式,但你可以:
- 使用pytest的其他插件(如pytest-html)生成额外报告
- 修改
conftest.py中的报告生成逻辑 - 使用JSON数据(
test_report_data.json)自行处理
Q5: 报告可以分享给其他人吗?
A: 可以!HTML报告是独立的文件,包含所有样式和数据:
- 可以直接通过邮件发送
- 可以上传到文件服务器
- 可以在CI/CD中作为构建产物保存
📈 项目优势总结
- 零学习成本:基于pytest,pytest用户可以直接使用
- 零配置:安装即用,无需复杂配置
- 灵活扩展:支持多种接口信息定义方式
- 美观实用:HTML报告美观且功能完善
- CI/CD友好:易于集成到持续集成流程中
- 开源免费:MIT许可证,可自由使用和修改
🎓 最佳实践
- 统一使用Marker方式:团队统一使用pytest marker定义接口信息,保持代码风格一致
- 合理组织测试用例:按模块或功能组织测试类,便于维护
- 及时查看报告:每次测试后及时查看报告,快速定位问题
- 版本控制报告:在CI/CD中保存历史报告,便于对比分析
- 定期清理报告:设置报告过期时间,避免占用过多存储空间
📚 相关资源
💡 总结
Pytest API Reporter 是一个专注于接口自动化测试的报告生成工具,它解决了传统pytest报告在接口测试场景下的不足,提供了美观、实用的HTML报告。无论是个人项目还是团队协作,都能大大提升测试效率和体验。
如果你正在寻找一个简单易用的接口测试报告工具,Pytest API Reporter 绝对值得一试!
如果这篇文章对你有帮助,欢迎点赞、收藏、转发!
有任何问题或建议,欢迎在评论区留言讨论!
本文来自博客园,作者:七年!,转载请注明原文链接:https://www.cnblogs.com/qinian1/p/19391497

浙公网安备 33010602011771号