🚀 API端点测试实施计划
📋 目标
短期目标(1周内):
- 添加200-400个API端点测试用例
- 覆盖率提升到10-15%
- 满足CI/CD要求(10%阈值)
📊 API文件清单
已测试的API文件(4个)
- ✅
shared/src/api/health.py- 健康检查(7个测试) - ✅
shared/src/api/quota.py- 配额管理(20个测试) - ✅
shared/src/api/rate_limit.py- 限流API(16个测试) - ✅
shared/src/api/performance.py- 性能监控(8个测试)
已测试总计: 51个测试用例
需要测试的API文件(65个)
高优先级(核心API,代码量大)
shared/src/api/chat.py- 聊天API(23个端点)shared/src/api/market.py- 市场API(41个端点)shared/src/api/knowledge.py- 知识库API(72个端点)⭐shared/src/api/users.py- 用户API(1个端点)shared/src/api/payment.py- 支付API(14个端点)shared/src/api/training.py- 训练API(20个端点)shared/src/api/training_v2.py- 训练API v2(21个端点)shared/src/api/mbe_core.py- 核心API(27个端点)shared/src/api/education.py- 教育API(24个端点)shared/src/api/cluster.py- 集群API(36个端点)
预计测试用例: 每个文件5-15个测试 → 100-200个测试用例
中优先级(重要API)
shared/src/api/admin/billing_api.py- 计费API(15个端点)shared/src/api/admin/users_api.py- 用户管理API(14个端点)shared/src/api/admin/market.py- 市场管理API(18个端点)shared/src/api/admin/system.py- 系统管理API(17个端点)shared/src/api/admin/model_sync_api.py- 模型同步API(16个端点)shared/src/api/admin/tickets_api.py- 工单API(15个端点)shared/src/api/admin/sub_accounts_api.py- 子账户API(34个端点)shared/src/api/admin/template_routes.py- 模板路由(27个端点)shared/src/api/admin/permissions_api.py- 权限API(30个端点)shared/src/api/admin/api_clients_api.py- API客户端API(17个端点)
预计测试用例: 每个文件3-10个测试 → 100-150个测试用例
低优先级(辅助API)
21-65. 其他API文件(约45个文件)
shared/src/api/feedback.pyshared/src/api/files.pyshared/src/api/websocket.pyshared/src/api/vision.pyshared/src/api/voice.py- ... 等等
预计测试用例: 每个文件2-5个测试 → 90-225个测试用例
🎯 实施策略
阶段1: 高优先级API(第1-3天)
目标: 100-200个测试用例
文件列表:
knowledge.py- 知识库API(最重要,72个端点)market.py- 市场API(41个端点)chat.py- 聊天API(23个端点)mbe_core.py- 核心API(27个端点)cluster.py- 集群API(36个端点)education.py- 教育API(24个端点)training.py+training_v2.py- 训练API(41个端点)payment.py- 支付API(14个端点)users.py- 用户API(1个端点)
预计: 每个文件10-20个测试用例 → 150-250个测试用例
阶段2: 中优先级API(第4-5天)
目标: 100-150个测试用例
文件列表:
- 所有
admin/*管理API文件(约20个文件)
预计: 每个文件5-10个测试用例 → 100-200个测试用例
阶段3: 低优先级API(第6-7天)
目标: 50-100个测试用例
文件列表:
- 其他辅助API文件(约45个文件)
预计: 每个文件2-5个测试用例 → 90-225个测试用例
📝 测试用例编写模板
模板1: GET端点测试
@pytest.mark.unit
class TestAPIGetEndpoint:
"""测试GET端点"""
@pytest.mark.asyncio
async def test_get_endpoint_success(self):
"""测试成功获取数据"""
from api.module import get_endpoint
mock_dependency = Mock()
mock_dependency.get_data = AsyncMock(return_value={"data": "test"})
with patch("api.module.get_dependency", return_value=mock_dependency):
result = await get_endpoint("param")
assert result is not None
assert "data" in result
模板2: POST端点测试
@pytest.mark.unit
class TestAPIPostEndpoint:
"""测试POST端点"""
@pytest.mark.asyncio
async def test_post_endpoint_success(self):
"""测试成功创建数据"""
from api.module import create_endpoint, CreateRequest
mock_service = Mock()
mock_service.create = AsyncMock(return_value={"id": "123"})
with patch("api.module.get_service", return_value=mock_service):
request = CreateRequest(data="test")
result = await create_endpoint(request)
assert result["id"] == "123"
@pytest.mark.asyncio
async def test_post_endpoint_validation_error(self):
"""测试验证错误"""
from api.module import create_endpoint, CreateRequest
from fastapi import HTTPException
request = CreateRequest(data="") # 无效数据
with pytest.raises(HTTPException) as exc_info:
await create_endpoint(request)
assert exc_info.value.status_code == 400
模板3: 批量测试生成
@pytest.mark.unit
class TestAPIBatch:
"""批量API端点测试"""
@pytest.mark.parametrize("endpoint,expected_status", [
("/api/endpoint1", 200),
("/api/endpoint2", 200),
("/api/endpoint3", 200),
])
@pytest.mark.asyncio
async def test_multiple_endpoints(self, endpoint, expected_status):
"""批量测试多个端点"""
# 测试逻辑
pass
🔧 工具和脚本
脚本1: 自动生成测试框架
# scripts/generate_api_tests.py
import os
import ast
from pathlib import Path
def find_api_endpoints(file_path):
"""查找API文件中的所有端点"""
with open(file_path) as f:
tree = ast.parse(f.read())
endpoints = []
for node in ast.walk(tree):
if isinstance(node, ast.FunctionDef):
# 检查是否是FastAPI端点
if any(decorator.id == 'router' for decorator in node.decorator_list):
endpoints.append(node.name)
return endpoints
def generate_test_file(api_file, endpoints):
"""生成测试文件"""
test_content = f'''"""
自动生成的API测试文件
源文件: {api_file}
"""
import pytest
from unittest.mock import AsyncMock, Mock, patch
@pytest.mark.unit
class Test{api_file.stem}:
"""测试{api_file.stem}"""
'''
for endpoint in endpoints:
test_content += f'''
@pytest.mark.asyncio
async def test_{endpoint}(self):
"""测试{endpoint}端点"""
# TODO: 实现测试逻辑
pass
'''
return test_content
📊 进度跟踪
第1天目标
-
knowledge.py- 20个测试用例 -
market.py- 15个测试用例 - 总计: 35个测试用例
第2天目标
-
chat.py- 10个测试用例 -
mbe_core.py- 15个测试用例 -
cluster.py- 15个测试用例 - 总计: 40个测试用例
第3天目标
-
education.py- 10个测试用例 -
training.py+training_v2.py- 20个测试用例 -
payment.py- 10个测试用例 - 总计: 40个测试用例
第4-5天目标
- 所有
admin/*API文件 - 100-150个测试用例
第6-7天目标
- 其他辅助API文件 - 50-100个测试用例
✅ 验收标准
覆盖率要求
- ✅ 覆盖率 ≥ 10%
- ✅ 所有测试通过
- ✅ CI/CD通过
测试质量要求
- ✅ 每个API端点至少1个测试用例
- ✅ 覆盖主要路径(成功场景)
- ✅ 覆盖错误场景(验证错误、权限错误等)
- ✅ 使用Mock减少外部依赖
CI/CD要求
- ✅ 所有测试在CI/CD中通过
- ✅ 覆盖率报告上传成功
- ✅ 可以设置
--cov-fail-under=10
🚀 开始实施
立即行动:
- 创建测试文件目录结构
- 从
knowledge.py开始(最重要) - 使用模板快速编写测试用例
- 每天跟踪进度
- 第一周结束时验证覆盖率
预计结果:
- ✅ 200-400个API测试用例
- ✅ 10-15%覆盖率
- ✅ CI/CD通过(10%阈值)