邮轮穿舱件管理系统后台 - 测试指南
概述
本文档为邮轮穿舱件管理系统后台提供完整的测试指南,涵盖单元测试、集成测试的编写和执行方法。基于FastAPI框架和pytest测试框架,确保系统的稳定性和可靠性。
测试框架配置
pytest配置
项目使用pytest作为主要测试框架,配置如下:
[pytest]
addopts = --cov=app/ --cov-report=term-missing
asyncio_mode = auto
env =
ENV=test
MPLBACKEND=Agg
DISPLAY=
测试依赖
项目依赖配置在pyproject.toml中:
测试架构
测试目录结构
test/
├── __init__.py
├── conftest.py
├── test_global_error_handling.py
├── test_permission_router.py
├── test_root_router.py
└── test_user_router.py
测试架构图
flowchart TD
A[测试执行] --> B[conftest.py<br/>测试配置]
B --> C[测试数据库初始化]
B --> D[测试客户端创建]
C --> E[单元测试]
D --> E
E --> F[API路由测试]
E --> G[错误处理测试]
E --> H[权限测试]
F --> I[测试报告生成]
G --> I
H --> I
测试配置详解
conftest.py - 测试配置中心
@pytest.fixture(scope="session", autouse=True)
def override_settings() -> None:
os.environ["ENV"] = "test"
@pytest.fixture(scope="session", autouse=True)
async def setup_database() -> Generator[None, None, None]:
"""设置测试数据库"""
await Tortoise.init(config=settings.tortoise_orm_config_dict)
await Tortoise.generate_schemas()
yield
await Tortoise.close_connections()
@pytest.fixture(scope="module")
def client() -> Generator[TestClient, None, None]:
with TestClient(app) as c:
yield c
测试依赖关系图
flowchart TD
A[conftest.py] --> B[override_settings<br/>环境配置]
A --> C[setup_database<br/>数据库初始化]
A --> D[setup_application<br/>应用设置]
A --> E[client<br/>测试客户端]
A --> F[get_admin_token<br/>管理员令牌]
A --> G[get_user_case<br/>测试用户]
B --> H[测试用例]
C --> H
D --> H
E --> H
F --> H
G --> H
单元测试编写指南
用户路由测试示例
用户创建和列表测试
def test_user_create_and_list_user(client: TestClient, get_admin_token) -> None:
client.headers.update({
"Authorization": f"Bearer {get_admin_token}"
})
response = client.post("/users/", json={
"username": "testuser",
"password": "123456",
"email": "testuser@example.com",
"sms": "13800000000"
})
assert response.status_code == status.HTTP_201_CREATED
用户认证测试
def test_authenticate_user(client: TestClient) -> None:
# 测试正确的用户名和密码
response = client.post("/users/authenticate", json={
"username": "authuser",
"password": "123456"
})
assert response.status_code == status.HTTP_200_OK
测试用例分类
1. CRUD操作测试
- 用户创建、读取、更新、删除
- 数据验证和边界测试
- 分页和查询参数测试
2. 认证授权测试
- 用户登录认证
- 权限验证
- Token管理
3. 业务逻辑测试
- 状态变更
- 数据关联
- 业务规则验证
集成测试编写指南
全局错误处理测试
def test_value_error_handling(client: TestClient) -> None:
"""测试ValueError的全局异常处理"""
response = client.get("/error-test/value-error")
assert response.status_code == status.HTTP_400_BAD_REQUEST
data = response.json()
assert data["error"] == "Bad Request"
根路由测试
def test_root_request(client: TestClient) -> None:
response = client.get("/")
assert response.status_code == 200
data = response.json()
assert data == {"message": "Hello World"}
测试执行方法
基本测试执行
# 运行所有测试
pytest
# 运行特定测试文件
pytest test/test_user_router.py
# 运行特定测试函数
pytest test/test_user_router.py::test_user_create_and_list_user
# 生成覆盖率报告
pytest --cov=app/ --cov-report=html
测试执行流程图
sequenceDiagram
participant User
participant Pytest
participant TestClient
participant FastAPI
participant Database
User->>Pytest: 执行测试命令
Pytest->>TestClient: 创建测试客户端
TestClient->>FastAPI: 发送HTTP请求
FastAPI->>Database: 数据库操作
Database-->>FastAPI: 返回数据
FastAPI-->>TestClient: HTTP响应
TestClient-->>Pytest: 断言验证
Pytest-->>User: 测试结果报告
测试覆盖率分析
# 终端显示覆盖率
pytest --cov=app/ --cov-report=term-missing
# 生成HTML覆盖率报告
pytest --cov=app/ --cov-report=html
测试最佳实践
1. 测试组织结构
flowchart TD
A[测试目录] --> B[conftest.py<br/>共享配置]
A --> C[test_*.py<br/>功能测试]
A --> D[集成测试]
A --> E[端到端测试]
B --> F[测试夹具]
B --> G[测试配置]
C --> H[单元测试]
D --> I[API测试]
E --> J[系统测试]
2. 测试数据管理
- 使用fixture创建测试数据
- 测试后自动清理数据
- 避免测试间数据污染
3. 异步测试处理
@pytest.mark.asyncio
async def test_async_function():
result = await async_function()
assert result is not None
错误处理和异常测试
异常处理架构
flowchart TD
A[HTTP请求] --> B[路由处理]
B --> C{是否发生异常?}
C -->|是| D[异常类型判断]
C -->|否| E[正常响应]
D --> F[HTTPException]
D --> G[StarletteHTTPException]
D --> H[通用Exception]
F --> I[HTTP错误处理]
G --> J[Starlette错误处理]
H --> K[全局异常处理]
I --> L[JSON错误响应]
J --> L
K --> L
E --> M[成功响应]
异常测试策略
- 预期异常测试:验证系统正确处理已知异常
- 边界条件测试:测试输入边界和极端情况
- 错误恢复测试:验证系统从错误中恢复的能力
性能测试建议
基准测试
import pytest
import time
def test_api_performance(client: TestClient):
start_time = time.time()
# 执行多次请求测试性能
for i in range(100):
response = client.get("/users/")
assert response.status_code == 200
end_time = time.time()
assert (end_time - start_time) < 5.0 # 5秒内完成100次请求
索引
本测试指南提供了邮轮穿舱件管理系统后台的完整测试方案,包括:
- 测试框架配置:pytest配置和依赖管理
- 测试架构设计:模块化测试组织和依赖关系
- 单元测试编写:详细的测试用例示例和最佳实践
- 集成测试策略:API测试和错误处理验证
- 测试执行方法:命令行工具和覆盖率分析
- 性能测试建议:基准测试和性能监控
通过遵循本指南,可以确保系统的高质量交付和持续集成流程的顺畅运行。
参考文件:
- pytest.ini - 测试框架配置
- test/conftest.py - 测试配置和夹具
- test/test_user_router.py - 用户路由测试示例
- test/test_global_error_handling.py - 错误处理测试
- app/main.py - 主应用配置和异常处理