接手老员工代码后,如何创建不调用真实API的模拟集成测试?
无真实API依赖的模拟集成测试实现方案
1. 选择适配技术栈的模拟服务器工具
根据你的技术栈匹配对应的工具:
- Java/跨语言场景:WireMock、MockServer,支持通过配置文件或代码定义请求响应规则
- Python场景:用FastAPI快速搭建临时模拟服务,或配合pytest实现自定义模拟逻辑
- Node.js场景:用Express搭建极简模拟服务,或Mockoon可视化配置API规则
- 通用场景:Postman Mock Server,适合快速配置复杂多场景API
2. 改造代码的API地址配置
确保业务代码中的API地址可配置,避免硬编码。通过环境变量、配置文件或启动参数切换地址:
- Java示例(application.properties):
api.base.url=http://localhost:8080/mock-api - Python示例:
import os API_BASE_URL = os.getenv("API_BASE_URL", "http://localhost:8080/mock-api")
无需修改业务逻辑,仅通过配置即可将请求路由到模拟服务器。
3. 定义模拟服务器的请求响应规则
完全复刻真实API的请求特征(方法、路径、请求头、请求体),覆盖所有业务场景:
- 成功响应:匹配真实API的返回结构,返回符合业务逻辑的测试数据
- 错误响应:模拟404、500、403等状态码及对应错误体,验证代码的异常处理逻辑
- 边界场景:模拟空值、超长字段、特殊字符等请求,验证代码兼容性
以WireMock为例,创建映射文件mappings/user-get.json:
{ "request": { "method": "GET", "urlPathPattern": "/mock-api/user/[0-9]+", "headers": { "Accept": { "equalTo": "application/json" } } }, "response": { "status": 200, "headers": { "Content-Type": "application/json" }, "jsonBody": { "id": "${request.urlSegments.[2]}", "name": "Mock User ${request.urlSegments.[2]}", "email": "mock-${request.urlSegments.[2]}@example.com" } } }
该配置会匹配所有/mock-api/user/{id}的GET请求,动态返回对应ID的用户数据。
4. 执行模拟集成测试
启动模拟服务器后,直接运行原有集成测试用例:
- 启动WireMock:
java -jar wiremock-jre8-standalone-2.35.0.jar --port 8080 - 运行测试:用JUnit、pytest、Jest等框架执行集成测试套件
测试逻辑与真实API测试完全一致,仅请求被路由到模拟服务器,不会调用真实接口。
5. 设置真实API测试的触发规则
在测试流程中加入前置校验:只有当所有模拟集成测试通过后,才允许切换到真实API地址执行测试。可在CI/CD脚本或测试配置中实现:
- Shell脚本示例:
# 执行模拟集成测试 npm run test:mock-integration if [ $? -eq 0 ]; then # 测试通过,切换到真实API export API_BASE_URL=https://api.prod.example.com npm run test:real-integration else echo "模拟集成测试未通过,终止真实API测试" exit 1 fi
内容的提问来源于stack exchange,提问作者Mr J
相关产品推荐
相关产品推荐

