测试用例是测试工作的基础单元,就像是测试的"DNA"。本文档将详细介绍如何在巧克力测试平台中管理测试用例的"生老病死"全流程。
测试用例是为了验证特定功能或需求而设计的一组测试步骤、输入数据和预期结果。在我们的平台中,测试用例主要来源于后端代码中的测试函数。
interface TestCase {
id: number;
case_func: string; // 用例函数名
case_func_desc: string; // 用例描述
case_sence: string; // 测试场景
casemoudle: { // 所属模块
id: number;
moudle: string;
desc: string;
};
path_desc: string; // 接口路径描述
tags: string; // 标签
update_time: string; // 更新时间
}平台通过扫描后端代码中的测试函数,自动生成测试用例。这种方式确保了测试用例与代码的一致性。
# 标准pytest测试函数
def test_user_login():
"""用户登录接口测试
测试场景: 正常登录流程
接口路径: POST /api/user/login
标签: login,auth,core
"""
# 测试逻辑
pass
def test_user_register_success():
"""用户注册成功测试"""
pass
def test_user_register_invalid_email():
"""用户注册-邮箱格式错误"""
pass- 函数名规则: 以
test_开头的函数 - 描述提取: 从函数的docstring中提取描述信息
- 场景识别: 根据函数名和描述自动识别测试场景
- 模块归类: 根据文件路径自动归类到对应模块
导航路径: 接口测试 → 用例管理
# 点击"同步测试用例"按钮
# 选择要同步的模块
modules = [
"user_module", # 用户模块
"order_module", # 订单模块
"product_module" # 商品模块
]
# 执行同步
POST /api/auto_pytest/sync_test_case
{
"moudle_list": modules
}{
"success": true,
"data": {
"moudle_list": ["user_module", "order_module"],
"synced_cases": 45,
"new_cases": 12,
"updated_cases": 8,
"deleted_cases": 2
},
"msg": "同步完成"
}用例列表提供以下信息:
- 用例名称: 函数名,点击可查看详情
- 用例描述: 功能描述信息
- 测试场景: 具体的测试场景
- 所属模块: 用例归属的功能模块
- 接口路径: API接口路径信息
- 标签: 用例分类标签
- 更新时间: 最后更新时间
interface CaseFilterParams {
moudle?: string[]; // 模块筛选
case_func?: string; // 函数名搜索
case_sence?: string; // 场景搜索
tags?: string; // 标签筛选
date_range?: [string, string]; // 时间范围
current?: number; // 当前页
pageSize?: number; // 页面大小
}- 批量删除: 删除选中的测试用例
- 批量标签: 为选中用例添加标签
- 批量导出: 导出用例信息到Excel
- 批量执行: 批量执行选中的用例
# 按函数名搜索
case_func: "login" # 匹配所有包含"login"的用例
# 按场景搜索
case_sence: "用户注册" # 匹配用户注册相关场景
# 按标签搜索
tags: "core,auth" # 匹配包含core或auth标签的用例{
"moudle": ["user_module"],
"case_sence": "登录",
"tags": "core",
"date_range": ["2024-01-01", "2024-01-31"]
}用户模块 (user_module)
├── 用户注册
│ ├── test_user_register_success
│ ├── test_user_register_invalid_email
│ └── test_user_register_duplicate_username
├── 用户登录
│ ├── test_user_login_success
│ ├── test_user_login_invalid_password
│ └── test_user_login_locked_account
└── 用户信息
├── test_get_user_profile
├── test_update_user_profile
└── test_delete_user_account
正常流程测试
├── 用户注册成功
├── 用户登录成功
└── 订单创建成功
异常流程测试
├── 参数验证错误
├── 权限验证失败
└── 业务规则违反
边界条件测试
├── 最大值测试
├── 最小值测试
└── 空值测试
P0 - 核心功能 (阻塞级)
├── 用户登录
├── 订单支付
└── 商品购买
P1 - 主要功能 (严重级)
├── 用户注册
├── 商品搜索
└── 购物车管理
P2 - 一般功能 (一般级)
├── 用户信息修改
├── 收藏夹管理
└── 评价系统
P3 - 辅助功能 (轻微级)
├── 帮助文档
├── 意见反馈
└── 统计报表
{
"id": 1,
"case_func": "test_user_login_success",
"case_func_desc": "测试用户登录成功流程",
"case_sence": "用户登录",
"casemoudle": {
"id": 1,
"moudle": "user_module",
"desc": "用户管理模块"
},
"path_desc": "POST /api/user/login",
"tags": "login,auth,core,P0",
"update_time": "2024-01-01T10:00:00",
"execution_history": [
{
"execution_time": "2024-01-01T09:00:00",
"status": "success",
"duration": 0.5,
"environment": "test"
}
],
"related_suites": [
{
"suite_id": 1,
"suite_name": "用户模块测试套件"
}
]
}interface ExecutionHistory {
id: number;
execution_time: string; // 执行时间
status: 'success' | 'failed' | 'skipped'; // 执行状态
duration: number; // 执行时长(秒)
environment: string; // 执行环境
error_message?: string; // 错误信息
suite_id?: number; // 所属套件ID
plan_id?: number; // 所属计划ID
}- 关联套件: 包含此用例的测试套件
- 关联计划: 包含此用例的测试计划
- 依赖关系: 与其他用例的依赖关系
- 覆盖需求: 覆盖的业务需求
# 执行单个测试用例
POST /api/auto_pytest/run_single_case
{
"case_id": 1,
"environment": "test",
"parameters": {
"username": "testuser",
"password": "testpass"
}
}# 批量执行测试用例
POST /api/auto_pytest/run_multiple_cases
{
"case_ids": [1, 2, 3, 4, 5],
"environment": "test",
"execution_mode": "parallel", // parallel | sequential
"max_workers": 3
}# 执行结果数据结构
class CaseExecutionResult:
case_id: int
case_func: str
status: str # success | failed | skipped
start_time: datetime
end_time: datetime
duration: float
error_message: str
stack_trace: str
assertions: List[dict]
environment: str
def to_dict(self):
return {
'case_id': self.case_id,
'case_func': self.case_func,
'status': self.status,
'duration': self.duration,
'error_message': self.error_message,
'environment': self.environment
}interface CaseStatistics {
total_cases: number; // 总用例数
active_cases: number; // 活跃用例数
deprecated_cases: number; // 废弃用例数
by_module: { // 按模块统计
[module: string]: number;
};
by_scene: { // 按场景统计
[scene: string]: number;
};
by_priority: { // 按优先级统计
P0: number;
P1: number;
P2: number;
P3: number;
};
execution_stats: { // 执行统计
total_executions: number;
success_rate: number;
avg_duration: number;
last_execution: string;
};
}interface CaseTrend {
date: string;
new_cases: number; // 新增用例
updated_cases: number; // 更新用例
executed_cases: number; // 执行用例
success_rate: number; // 成功率
avg_duration: number; // 平均执行时长
}interface CaseQuality {
coverage_rate: number; // 覆盖率
stability_rate: number; // 稳定性
maintenance_index: number; // 维护指数
top_failed_cases: Array<{ // 失败最多的用例
case_id: number;
case_func: string;
failure_count: number;
failure_rate: number;
}>;
slow_cases: Array<{ // 执行最慢的用例
case_id: number;
case_func: string;
avg_duration: number;
}>;
}新建 → 开发 → 测试 → 稳定 → 维护 → 废弃
↓ ↓ ↓ ↓ ↓ ↓
创建 编写 调试 运行 更新 删除
class CaseStatus:
DRAFT = 'draft' # 草稿
ACTIVE = 'active' # 活跃
DEPRECATED = 'deprecated' # 废弃
ARCHIVED = 'archived' # 归档
STATUS_CHOICES = [
(DRAFT, '草稿'),
(ACTIVE, '活跃'),
(DEPRECATED, '废弃'),
(ARCHIVED, '归档'),
]interface CaseVersion {
version: string; // 版本号
change_log: string; // 变更日志
author: string; // 修改人
change_time: string; // 修改时间
changes: { // 具体变更
added: string[];
modified: string[];
deleted: string[];
};
}# 自动清理策略
class CaseCleanupPolicy:
# 清理长期未执行的用例
INACTIVE_DAYS = 90
# 清理失败率过高的用例
MAX_FAILURE_RATE = 0.8
# 清理执行时间过长的用例
MAX_DURATION = 300 # 5分钟
def should_cleanup(self, case):
# 实现清理逻辑
pass- 单一职责: 每个用例只测试一个功能点
- 独立性: 用例之间不应有依赖关系
- 可重复: 用例应该可以重复执行
- 清晰命名: 用例名称应该清楚表达测试目的
- 模块化组织: 按功能模块组织用例
- 场景化分类: 按测试场景分类用例
- 优先级管理: 明确用例的重要程度
- 标签管理: 使用标签进行灵活分类
- 定期同步: 定期同步最新的测试用例
- 及时更新: 代码变更后及时更新用例
- 清理废弃: 定期清理无效的测试用例
- 性能监控: 监控用例执行性能
🎉 用例管理专家! 你已经掌握了测试用例管理的全部技能。记住,好的用例管理是高质量测试的基础!