🚀 API端点测试实施计划

📋 目标

短期目标(1周内):

  • 添加200-400个API端点测试用例
  • 覆盖率提升到10-15%
  • 满足CI/CD要求(10%阈值)

📊 API文件清单

已测试的API文件(4个)

  1. shared/src/api/health.py - 健康检查(7个测试)
  2. shared/src/api/quota.py - 配额管理(20个测试)
  3. shared/src/api/rate_limit.py - 限流API(16个测试)
  4. shared/src/api/performance.py - 性能监控(8个测试)

已测试总计: 51个测试用例

需要测试的API文件(65个)

高优先级(核心API,代码量大)

  1. shared/src/api/chat.py - 聊天API(23个端点)
  2. shared/src/api/market.py - 市场API(41个端点)
  3. shared/src/api/knowledge.py - 知识库API(72个端点)⭐
  4. shared/src/api/users.py - 用户API(1个端点)
  5. shared/src/api/payment.py - 支付API(14个端点)
  6. shared/src/api/training.py - 训练API(20个端点)
  7. shared/src/api/training_v2.py - 训练API v2(21个端点)
  8. shared/src/api/mbe_core.py - 核心API(27个端点)
  9. shared/src/api/education.py - 教育API(24个端点)
  10. shared/src/api/cluster.py - 集群API(36个端点)

预计测试用例: 每个文件5-15个测试 → 100-200个测试用例

中优先级(重要API)

  1. shared/src/api/admin/billing_api.py - 计费API(15个端点)
  2. shared/src/api/admin/users_api.py - 用户管理API(14个端点)
  3. shared/src/api/admin/market.py - 市场管理API(18个端点)
  4. shared/src/api/admin/system.py - 系统管理API(17个端点)
  5. shared/src/api/admin/model_sync_api.py - 模型同步API(16个端点)
  6. shared/src/api/admin/tickets_api.py - 工单API(15个端点)
  7. shared/src/api/admin/sub_accounts_api.py - 子账户API(34个端点)
  8. shared/src/api/admin/template_routes.py - 模板路由(27个端点)
  9. shared/src/api/admin/permissions_api.py - 权限API(30个端点)
  10. shared/src/api/admin/api_clients_api.py - API客户端API(17个端点)

预计测试用例: 每个文件3-10个测试 → 100-150个测试用例

低优先级(辅助API)

21-65. 其他API文件(约45个文件)

  • shared/src/api/feedback.py
  • shared/src/api/files.py
  • shared/src/api/websocket.py
  • shared/src/api/vision.py
  • shared/src/api/voice.py
  • ... 等等

预计测试用例: 每个文件2-5个测试 → 90-225个测试用例

🎯 实施策略

阶段1: 高优先级API(第1-3天)

目标: 100-200个测试用例

文件列表:

  1. knowledge.py - 知识库API(最重要,72个端点)
  2. market.py - 市场API(41个端点)
  3. chat.py - 聊天API(23个端点)
  4. mbe_core.py - 核心API(27个端点)
  5. cluster.py - 集群API(36个端点)
  6. education.py - 教育API(24个端点)
  7. training.py + training_v2.py - 训练API(41个端点)
  8. payment.py - 支付API(14个端点)
  9. 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

🚀 开始实施

立即行动:

  1. 创建测试文件目录结构
  2. knowledge.py开始(最重要)
  3. 使用模板快速编写测试用例
  4. 每天跟踪进度
  5. 第一周结束时验证覆盖率

预计结果:

  • ✅ 200-400个API测试用例
  • ✅ 10-15%覆盖率
  • ✅ CI/CD通过(10%阈值)