在测试工程师的日常工作中,接口测试是不可或缺的一部分。然而,接口测试往往伴随着以下痛点:
- 环境依赖:后端服务不稳定或无法访问时,接口测试无法正常进行。
- 重复验证:需要频繁调用接口并对比返回的数据,耗费时间且容易出错。
- 依赖数据难以构造:接口依赖的上下游数据复杂,难以快速准备测试环境。
- 结果报告不直观:接口测试的响应数据量大,难以快速排查问题。
本篇文章将向你展示如何通过 自动化脚本 和 Mock 数据,彻底解决这些问题,从而让接口测试变得简单、高效,同时还能生成直观的测试报告。
1. 实现目标
我们希望实现以下功能:
- 快速执行接口测试:利用 Python 编写接口测试脚本,支持大规模接口验证。
- Mock 数据解决环境依赖:通过 Mock 服务模拟后端接口,验证前端逻辑。
- 自动化报告生成:将接口测试结果以可视化的方式展示,便于快速定位问题。
2. 环境准备
在正式实现前,请安装以下依赖库:
pip install requests pytest rich flask pytest-html
- requests:用于发起 HTTP 请求。
- pytest:支持接口测试的断言与用例集成。
- rich:生成终端美观的测试日志输出。
- flask:用于搭建 Mock 服务。
- pytest-html:生成接口测试的 HTML 报告。
3. 快速实现接口测试
3.1 测试用例设计
我们以一个简单的用户登录接口为例:
- 接口地址:
POST https://api.example.com/login
- 请求参数:
{ "username": "admin", "password": "123456" }
- 响应结果:
- 成功:
{"status": "success", "token": "abc123"}
- 失败:
{"status": "error", "message": "Invalid credentials"}
- 成功:
测试用例设计
设计测试用例存储为 JSON 文件,便于管理和扩展:
[
{
"case_id": "TC001",
"description": "登录成功",
"request": {
"url": "https://api.example.com/login",
"method": "POST",
"data": {
"username": "admin",
"password": "123456"
}
},
"expected": {
"status_code": 200,
"response": {
"status": "success"
}
}
},
{
"case_id": "TC002",
"description": "登录失败 - 密码错误",
"request": {
"url": "https://api.example.com/login",
"method": "POST",
"data": {
"username": "admin",
"password": "wrong_password"
}
},
"expected": {
"status_code": 401,
"response": {
"status": "error",
"message": "Invalid credentials"
}
}
}
]
3.2 编写测试脚本
利用 pytest
和 requests
,快速实现接口测试脚本。
接口测试脚本(test_api.py
)
import requests
import json
import pytest
from rich.console import Console
console = Console()
# 读取测试用例
def load_test_cases(file_path="test_cases.json"):
with open(file_path, "r", encoding="utf-8") as f:
return json.load(f)
# 参数化测试用例
@pytest.mark.parametrize("case", load_test_cases())
def test_api(case):
# 提取用例信息
request = case["request"]
expected = case["expected"]
# 发起请求
console.log(f"[bold cyan]执行用例:{case['case_id']} - {case['description']}[/]")
response = requests.request(
method=request["method"],
url=request["url"],
json=request.get("data")
)
# 验证状态码
assert response.status_code == expected["status_code"], f"状态码错误,用例:{case['case_id']}"
# 验证响应内容
for key, value in expected["response"].items():
assert response.json().get(key) == value, f"响应内容错误:{key},用例:{case['case_id']}"
运行测试
运行以下命令执行测试:
pytest test_api.py --html=report.html --self-contained-html
--html=report.html
:生成 HTML 格式的测试报告。--self-contained-html
:生成独立 HTML 文件,包含样式和脚本。
4. Mock 数据解决环境依赖
实际测试中,后端服务可能无法稳定提供接口,或者接口还未开发完成。这时,我们可以通过 Mock 服务 模拟接口返回的数据,确保测试环境的稳定性。
4.1 基于 Flask 搭建 Mock 服务
Mock 服务脚本(mock_server.py
)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/login", methods=["POST"])
def login():
data = request.json
if data["username"] == "admin" and data["password"] == "123456":
return jsonify({"status": "success", "token": "abc123"}), 200
else:
return jsonify({"status": "error", "message": "Invalid credentials"}), 401
if __name__ == "__main__":
app.run(port=5000)
启动 Mock 服务
运行以下命令启动 Mock 服务:
python mock_server.py
Mock 服务将在 http://127.0.0.1:5000
监听请求。
4.2 修改测试用例使用 Mock 地址
将测试用例中的接口地址改为本地 Mock 服务地址:
"url": "http://127.0.0.1:5000/login"
5. 自动化生成报告
5.1 生成 HTML 测试报告
利用 pytest-html
插件,自动生成直观的 HTML 测试报告,包含每个用例的执行结果和详情。
运行命令
pytest test_api.py --html=report.html --self-contained-html
完成后,打开 report.html
即可查看测试结果:
- 绿色:表示测试通过。
- 红色:表示测试失败,报告会展示失败的具体原因。
5.2 终端美化输出
通过 rich
库提升终端输出效果,让测试日志更直观。
示例输出
[11:00:00] 执行用例:TC001 - 登录成功
[11:00:01] ✅ 状态码验证成功
[11:00:01] ✅ 响应内容验证成功
[11:00:02] 执行用例:TC002 - 登录失败 - 密码错误
[11:00:03] ✅ 状态码验证成功
[11:00:03] ✅ 响应内容验证成功
6. 效果展示
终端输出日志
通过 Rich 实现:
- 美观的用例执行进度。
- 通过与失败用例的直观区分。
HTML 测试报告
通过 pytest-html 实现:
- 用例的执行结果汇总。
- 每个用例的详细请求与响应日志。
7. 小结
通过本篇文章,我们实现了接口测试的高效自动化,并通过 Mock 数据解决了环境依赖问题。
亮点
- 快速实现接口测试:通过
pytest
和requests
,实现高效的接口测试自动化。 - Mock 数据支持:利用 Flask 模拟后端接口,适配未完成的接口或不稳定的测试环境。
- 可视化报告:通过 pytest-html 生成直观的 HTML 测试报告,提升问题排查效率。
- 终端美化输出:通过 rich 打印美观的测试日志,让测试更直观。
下一篇预告:我们将在下一篇文章中探索 测试环境的自动化管理:从数据清理到环境初始化,帮助你彻底解决测试环境配置和数据准备的难题,敬请期待!
标签:case,pytest,接口,html,测试,Mock,救赎 From: https://blog.csdn.net/weixin_44872675/article/details/145315396