后端测试文档
1. 测试概述
1.1 测试目标
- 确保API接口功能正确
- 验证业务逻辑准确性
- 保证代码质量和稳定性
- 测试覆盖率达到80%以上
1.2 测试范围
- 单元测试:测试各个模块的独立功能
- 集成测试:测试API接口的端到端功能
- 性能测试:测试API响应时间(可选)
1.3 测试技术栈
| 技术 |
说明 |
| 测试框架 |
pytest |
| 异步测试 |
pytest-asyncio |
| HTTP测试 |
httpx / TestClient |
| 数据库测试 |
pytest-postgresql(可选) |
| 覆盖率 |
pytest-cov |
| Mock |
pytest-mock |
1.4 测试目录结构
2. 测试环境配置
2.1 依赖安装
2.2 测试配置文件 pytest.ini
2.3 环境变量
测试环境使用独立数据库配置:
3. 测试策略
3.1 单元测试
- 测试各个Service层方法
- 测试工具函数
- 不涉及数据库和网络调用
- 使用Mock隔离外部依赖
3.2 集成测试
- 测试完整的API端点
- 使用测试数据库
- 验证请求/响应格式
- 测试权限控制
3.3 测试数据管理
- 使用pytest fixture创建测试数据
- 每个测试独立运行,互不影响
- 测试后清理数据
4. 测试用例设计
4.1 认证模块测试 (test_auth.py)
4.1.1 用户登录测试
| 测试用例 |
描述 |
预期结果 |
| test_login_success |
正确的用户名和密码 |
返回token和用户信息 |
| test_login_wrong_username |
错误的用户名 |
返回401错误 |
| test_login_wrong_password |
错误的密码 |
返回401错误 |
| test_login_missing_fields |
缺少必填字段 |
返回400错误 |
4.1.2 Token验证测试
| 测试用例 |
描述 |
预期结果 |
| test_get_current_user_success |
有效token |
返回用户信息 |
| test_get_current_user_invalid_token |
无效token |
返回401错误 |
| test_get_current_user_expired_token |
过期token |
返回401错误 |
| test_logout_success |
有效token登出 |
返回成功 |
4.2 用户管理模块测试 (test_users.py)
4.2.1 创建用户测试
| 测试用例 |
描述 |
预期结果 |
| test_create_user_admin_success |
管理员创建用户 |
返回创建的用户 |
| test_create_user_market_forbidden |
非管理员创建用户 |
返回403错误 |
| test_create_user_duplicate_username |
重复的用户名 |
返回409错误 |
| test_create_user_invalid_role |
无效的角色 |
返回400错误 |
4.2.2 获取用户列表测试
| 测试用例 |
描述 |
预期结果 |
| test_get_users_admin_success |
管理员获取用户列表 |
返回用户列表 |
| test_get_users_market_forbidden |
非管理员获取用户列表 |
返回403错误 |
| test_get_users_with_pagination |
测试分页 |
返回正确的分页数据 |
| test_get_users_with_filter |
测试筛选 |
返回筛选后的数据 |
4.2.3 更新用户测试
| 测试用例 |
描述 |
预期结果 |
| test_update_user_admin_success |
管理员更新用户 |
返回更新后的用户 |
| test_update_user_market_forbidden |
非管理员更新用户 |
返回403错误 |
| test_update_user_not_found |
更新不存在的用户 |
返回404错误 |
4.2.4 删除用户测试
| 测试用例 |
描述 |
预期结果 |
| test_delete_user_admin_success |
管理员删除用户 |
返回成功 |
| test_delete_user_market_forbidden |
非管理员删除用户 |
返回403错误 |
| test_delete_user_not_found |
删除不存在的用户 |
返回404错误 |
4.2.5 重置密码测试
| 测试用例 |
描述 |
预期结果 |
| test_reset_password_admin_success |
管理员重置密码 |
返回成功 |
| test_reset_password_market_forbidden |
非管理员重置密码 |
返回403错误 |
| test_reset_password_invalid_password |
无效的密码格式 |
返回400错误 |
4.3 项目管理模块测试 (test_projects.py)
4.3.1 获取项目列表测试
| 测试用例 |
描述 |
预期结果 |
| test_get_projects_all_users_success |
所有用户获取项目列表 |
返回项目列表 |
| test_get_projects_with_pagination |
测试分页 |
返回正确的分页数据 |
| test_get_projects_with_filters |
测试组合筛选 |
返回筛选后的数据 |
| test_get_projects_sort_by_contract_amount |
按合同金额排序 |
返回排序后的数据 |
4.3.2 创建项目测试
| 测试用例 |
描述 |
预期结果 |
| test_create_project_admin_success |
管理员创建项目 |
返回创建的项目 |
| test_create_project_market_success |
市场部用户创建项目 |
返回创建的项目 |
| test_create_project_other_forbidden |
其他部门用户创建项目 |
返回403错误 |
| test_create_project_duplicate_project_no |
重复的项目编号 |
返回409错误 |
| test_create_project_missing_required_fields |
缺少必填字段 |
返回400错误 |
4.3.3 更新项目测试
| 测试用例 |
描述 |
预期结果 |
| test_update_project_admin_success |
管理员更新项目 |
返回更新后的项目 |
| test_update_project_market_own_project |
市场部更新自己的项目 |
返回更新后的项目 |
| test_update_project_market_other_project |
市场部更新其他人的项目 |
返回403错误 |
| test_update_project_other_financial_info |
其他部门更新财务信息 |
返回更新后的项目 |
| test_update_project_other_basic_info |
其他部门更新基础信息 |
返回403错误 |
| test_update_project_not_found |
更新不存在的项目 |
返回404错误 |
4.3.4 删除项目测试
| 测试用例 |
描述 |
预期结果 |
| test_delete_project_admin_success |
管理员删除项目 |
返回成功 |
| test_delete_project_market_own_project |
市场部删除自己的项目 |
返回成功 |
| test_delete_project_market_other_project |
市场部删除其他人的项目 |
返回403错误 |
| test_delete_project_other_forbidden |
其他部门删除项目 |
返回403错误 |
| test_delete_project_not_found |
删除不存在的项目 |
返回404错误 |
4.4 统计功能测试 (test_statistics.py)
4.4.1 基础统计测试
| 测试用例 |
描述 |
预期结果 |
| test_get_statistics_all_users_success |
所有用户获取统计 |
返回统计数据 |
| test_get_statistics_with_filters |
测试筛选条件 |
返回筛选后的统计 |
| test_get_statistics_empty_data |
无数据时统计 |
返回零值统计 |
4.4.2 分组统计测试
| 测试用例 |
描述 |
预期结果 |
| test_get_group_statistics_by_engineering_type |
按工程类别分组 |
返回分组统计 |
| test_get_group_statistics_by_department |
按项目部分组 |
返回分组统计 |
| test_get_group_statistics_with_date_filter |
带日期筛选的分组统计 |
返回分组统计 |
4.4.3 时间维度统计测试
| 测试用例 |
描述 |
预期结果 |
| test_get_timeline_statistics_by_month |
按月统计 |
返回时间维度统计 |
| test_get_timeline_statistics_by_year |
按年统计 |
返回时间维度统计 |
| test_get_timeline_statistics_with_filter |
带筛选的时间统计 |
返回时间维度统计 |
5. 测试Fixture
5.1 数据库Fixture
5.2 用户Fixture
5.3 项目Fixture
5.4 Token Fixture
6. 运行测试
6.1 运行所有测试
6.2 运行特定测试文件
6.3 运行特定测试用例
6.4 生成覆盖率报告
6.5 运行集成测试
6.6 运行单元测试
7. 持续集成
7.1 测试流程
- 提交代码前运行单元测试
- CI/CD流水线运行完整测试套件
- 生成覆盖率报告
- 测试通过才能合并代码
7.2 测试覆盖率要求
- 单元测试覆盖率 > 80%
- 关键业务逻辑覆盖率 > 90%
- API接口覆盖率 100%
8. 测试最佳实践
8.1 测试命名规范
- 测试文件:
test_<模块名>.py
- 测试类:
Test<功能名>
- 测试方法:
test_<功能>_<场景>
8.2 测试编写原则
- 每个测试只验证一个功能点
- 测试之间相互独立
- 使用描述性的测试名称
- 遵循AAA模式:Arrange, Act, Assert
8.3 Mock使用
- Mock外部依赖(数据库、网络等)
- 不要Mock被测试的代码
- 保持Mock的行为真实
9. 常见问题
9.1 数据库连接失败
检查测试数据库配置,确保测试数据库已创建。
9.2 测试数据冲突
使用pytest fixture和scope控制测试数据的生命周期。
9.3 异步测试失败
使用pytest-asyncio,确保测试函数使用async def定义。
文档维护: 后端程序员
更新时间: 2026-01-25