零失败指南:FastAPI-MCP工具测试用例编写全攻略
你还在为MCP工具测试头疼吗?接口变更导致测试失效?AI调用工具频繁出错?本文将通过3个核心步骤+2套实战模板,教你编写经得起迭代的高质量测试用例,让你的MCP工具稳定运行率提升90%。读完本文你将掌握:测试环境快速搭建、边界场景全覆盖策略、配置参数验证技巧。
测试环境极速配置
FastAPI-MCP的测试体系基于pytest构建,项目已预置完整的测试框架。通过以下命令30秒启动测试套件:
pytest tests/ -v
核心测试依赖位于tests/conftest.py,其中定义了simple_fastapi_app和complex_fastapi_app两个核心测试夹具。前者用于基础功能验证,后者模拟生产级复杂场景,包含认证、嵌套路由和多响应状态码。
必备测试文件结构
项目采用"功能-配置-场景"三维测试架构:
tests/
├── test_basic_functionality.py # 基础功能验证
├── test_configuration.py # 参数配置测试
├── test_http_real_transport.py # 传输层测试
└── fixtures/ # 测试夹具定义
新手建议优先关注test_basic_functionality.py,其中test_create_mcp_server用例展示了最基础的MCP服务器初始化验证:
def test_create_mcp_server(simple_fastapi_app: FastAPI):
mcp = FastApiMCP(
simple_fastapi_app,
name="Test MCP Server",
description="Test description",
)
assert mcp.name == "Test MCP Server"
assert len(mcp.tools) > 0, "Should have extracted tools from the app"
三大核心测试场景
1. 基础功能验证
重点验证MCP服务器的创建、路由挂载和路径规范化。测试用例应包含:
- 服务器初始化参数验证
- 自动工具提取功能检查
- 挂载路径规范化测试(带/不带斜杠情况)
test_basic_functionality.py中的test_normalize_paths用例展示了路径处理的鲁棒性测试:
def test_normalize_paths(simple_fastapi_app: FastAPI):
# 测试无前置斜杠路径
mcp = FastApiMCP(simple_fastapi_app)
mcp.mount(mount_path="test-mcp")
route_found = any("/test-mcp" in str(route) for route in simple_fastapi_app.routes)
assert route_found
# 测试带后置斜杠路径
mcp2 = FastApiMCP(simple_fastapi_app)
mcp2.mount(mount_path="/test-mcp2/")
route_found = any("/test-mcp2" in str(route) for route in simple_fastapi_app.routes)
assert route_found
2. 配置参数验证矩阵
FastAPI-MCP提供丰富的定制化参数,test_configuration.py构建了完整的参数验证矩阵。关键测试维度包括:
- 基础元数据(name/description)
- 响应描述策略(describe_all_responses)
- 输出模式详细度(describe_full_response_schema)
- 端点过滤规则(include_operations/exclude_tags)
响应描述策略测试
describe_all_responses参数控制是否展示错误状态码描述。测试用例通过对比默认配置与开启该参数的工具描述差异,验证响应描述的完整性:
def test_describe_all_responses_config_simple_app(simple_fastapi_app: FastAPI):
mcp_default = FastApiMCP(simple_fastapi_app)
mcp_all_responses = FastApiMCP(simple_fastapi_app, describe_all_responses=True)
# 默认配置只包含成功响应
assert mcp_default.tools[0].description.count("**422**") == 0
# 开启后包含错误响应
assert mcp_all_responses.tools[0].description.count("**422**") == 1
端点过滤测试
include_operations和exclude_tags参数用于精确控制暴露的工具集。test_configuration.py的test_filtering_functionality用例展示了组合过滤策略:
def test_filtering_functionality():
# 仅包含指定操作ID
include_ops_mcp = FastApiMCP(app, include_operations=["get_item", "list_items"])
assert {tool.name for tool in include_ops_mcp.tools} == {"get_item", "list_items"}
# 排除指定标签
exclude_tags_mcp = FastApiMCP(app, exclude_tags=["write", "delete"])
assert len(exclude_tags_mcp.tools) == 3
3. 传输层与异常场景
真实环境中网络波动、超时和认证失败是常见问题。test_http_real_transport.py模拟了这些异常场景,建议重点关注:
- HTTP超时配置验证(参考examples/07_configure_http_timeout_example.py)
- SSE流传输中断恢复
- 认证令牌传递验证(examples/08_auth_example_token_passthrough.py)
测试最佳实践
测试夹具复用策略
复杂场景建议复用tests/fixtures/complex_app.py,该夹具包含:
- JWT认证保护端点
- 多版本API路由(
/v1/,/v2/) - 包含5种响应状态码的CRUD接口
文档驱动测试
所有测试用例应参考官方文档的功能描述编写。例如docs/configurations/customization.mdx中提到的"响应模式定制"功能,对应test_configuration.py的test_describe_full_response_schema_config_complex_app用例。
自动化测试集成
在CI/CD流程中添加测试步骤,确保每次提交都通过全部测试:
# .github/workflows/tests.yml 片段
- name: Run tests
run: pytest tests/ --cov=fastapi_mcp
测试用例模板
基础功能验证模板
def test_[功能名]_basic_behavior(simple_fastapi_app: FastAPI):
# 1. 初始化MCP服务器
mcp = FastApiMCP(simple_fastapi_app, [配置参数])
# 2. 执行操作
mcp.mount([挂载参数])
# 3. 验证结果
assert [预期结果1]
assert [预期结果2]
配置参数测试模板
def test_[参数名]_configuration_variations(simple_fastapi_app: FastAPI):
# 1. 创建不同配置的实例
mcp_default = FastApiMCP(simple_fastapi_app)
mcp_custom = FastApiMCP(simple_fastapi_app, [自定义参数])
# 2. 对比配置差异
assert mcp_default.[属性] == [默认值]
assert mcp_custom.[属性] == [预期值]
# 3. 验证副作用
assert [配置A产生的效果]
assert [配置B产生的效果]
进阶测试技巧
边界值覆盖矩阵
针对mount_path参数的边界测试示例:
| 测试用例 | 输入值 | 预期规范化结果 |
|---|---|---|
| 空字符串 | "" | "/mcp" |
| 无斜杠路径 | "custom-mcp" | "/custom-mcp" |
| 多级嵌套路径 | "/api/v1/mcp" | "/api/v1/mcp" |
| 带查询参数 | "/mcp?debug=1" | 抛出ValueError |
参数组合测试
使用@pytest.mark.parametrize实现多参数组合测试:
import pytest
@pytest.mark.parametrize("describe_all_responses, describe_full_schema, expected_schemas_count", [
(False, False, 0),
(True, False, 0),
(False, True, 1),
(True, True, 2),
])
def test_response_schema_config_combinations(
simple_fastapi_app: FastAPI,
describe_all_responses: bool,
describe_full_schema: bool,
expected_schemas_count: int
):
mcp = FastApiMCP(
simple_fastapi_app,
describe_all_responses=describe_all_responses,
describe_full_response_schema=describe_full_schema
)
assert mcp.tools[0].description.count("**Output Schema:**") == expected_schemas_count
通过本文介绍的测试方法,你可以构建覆盖95%以上场景的测试套件。记住,高质量的测试用例是MCP工具稳定运行的基石。下一步建议深入研究examples/目录中的实战场景,为每个示例编写对应的验证测试。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



