项目管理是巧克力测试平台的基础功能,就像给你的测试工作建立一个"户口本"。本文档将详细介绍项目管理的各个方面,让你成为项目管理的专家!
在测试平台中,项目是测试工作的基本组织单位。它将相关的测试用例、测试套件、测试计划等资源组织在一起,便于统一管理和维护。
- 📋 资源组织: 将相关测试资源归类管理
- 👥 权限控制: 基于项目的访问权限管理
- 📊 数据统计: 按项目维度统计测试数据
- 🔄 环境隔离: 不同项目可以使用不同的测试环境
项目 (Project)
├── 测试模块 (Test Module)
│ ├── 测试用例 (Test Case)
│ └── 测试场景 (Test Scene)
├── 测试套件 (Test Suite)
│ ├── 用例组合
│ └── 执行配置
└── 测试计划 (Test Plan)
├── 定时配置
└── 通知设置
interface Project {
id: number;
project_name: string; // 项目名称
project_desc: string; // 项目描述
project_owners: string; // 项目负责人
add_time: string; // 创建时间
update_time: string; // 更新时间
is_deleted: boolean; // 是否删除
// 扩展字段
test_env?: string[]; // 测试环境
status?: 'active' | 'inactive' | 'archived'; // 项目状态
tags?: string[]; // 项目标签
}- 在左侧菜单栏找到 "项目管理"
- 点击 "项目列表"
- 进入项目管理页面
点击 "新建项目" 按钮,填写以下信息:
项目名称: 电商平台测试项目
项目描述: 包含用户管理、商品管理、订单管理等模块的自动化测试
项目负责人: 张三, 李四, 王五
测试环境: dev, test, staging
项目标签: 电商, 核心业务, 高优先级
项目状态: 进行中
通知设置: 邮件通知, 钉钉通知
[业务域]-[系统名称]-测试项目
示例:
- 电商-用户中心-测试项目
- 支付-风控系统-测试项目
- 物流-配送系统-测试项目
- ✅ 使用有意义的名称,便于识别
- ✅ 保持命名一致性
- ✅ 避免使用特殊字符
- ❌ 不要使用过于简单的名称如"测试"、"项目1"
项目列表展示以下信息:
- 项目名称: 点击可进入项目详情
- 项目描述: 项目的简要说明
- 负责人: 项目负责人列表
- 创建时间: 项目创建的时间
- 更新时间: 最后更新时间
- 状态: 项目当前状态
// 搜索条件
interface ProjectSearchParams {
project_name?: string; // 项目名称模糊搜索
project_owners?: string; // 负责人搜索
status?: string; // 状态筛选
date_range?: [string, string]; // 时间范围
tags?: string[]; // 标签筛选
}- 批量删除: 选择多个项目进行批量删除
- 批量导出: 导出项目信息到Excel
- 批量修改状态: 批量修改项目状态
- 批量分配负责人: 批量修改项目负责人
每个项目支持以下操作:
- 👁️ 查看详情: 查看项目详细信息
- ✏️ 编辑: 修改项目信息
- 📊 统计: 查看项目测试统计数据
- 🗂️ 管理: 进入项目内部管理
- 🗑️ 删除: 删除项目(需确认)
- 快速复制: 基于现有项目创建新项目
- 快速归档: 将完成的项目归档
- 快速激活: 激活暂停的项目
{
"project_name": "电商平台测试项目",
"project_desc": "电商平台的自动化测试项目,包含用户、商品、订单等核心模块",
"project_owners": ["张三", "李四", "王五"],
"tags": ["电商", "核心业务", "自动化测试"],
"status": "active"
}{
"environments": {
"dev": {
"name": "开发环境",
"base_url": "http://dev-api.example.com",
"database": "dev_database",
"description": "开发人员日常开发使用"
},
"test": {
"name": "测试环境",
"base_url": "http://test-api.example.com",
"database": "test_database",
"description": "QA团队测试使用"
},
"staging": {
"name": "预发环境",
"base_url": "http://staging-api.example.com",
"database": "staging_database",
"description": "生产环境模拟"
}
}
}{
"notifications": {
"email": {
"enabled": true,
"recipients": ["test-team@example.com"],
"events": ["test_failed", "test_completed"]
},
"dingtalk": {
"enabled": true,
"webhook": "https://oapi.dingtalk.com/robot/send?access_token=xxx",
"events": ["test_failed"]
},
"wechat": {
"enabled": false,
"webhook": "",
"events": []
}
}
}{
"permissions": {
"admins": ["admin@example.com"],
"developers": ["dev1@example.com", "dev2@example.com"],
"testers": ["tester1@example.com", "tester2@example.com"],
"viewers": ["viewer@example.com"]
},
"role_permissions": {
"admin": ["read", "write", "delete", "manage"],
"developer": ["read", "write"],
"tester": ["read", "write", "execute"],
"viewer": ["read"]
}
}interface ProjectStatistics {
// 资源统计
total_modules: number; // 测试模块数量
total_cases: number; // 测试用例数量
total_suites: number; // 测试套件数量
total_plans: number; // 测试计划数量
// 执行统计
total_executions: number; // 总执行次数
success_executions: number; // 成功执行次数
failed_executions: number; // 失败执行次数
avg_pass_rate: number; // 平均通过率
// 时间统计
avg_execution_time: number; // 平均执行时间
total_execution_time: number; // 总执行时间
}interface ProjectTrend {
date: string;
executions: number; // 执行次数
pass_rate: number; // 通过率
avg_duration: number; // 平均执行时长
new_cases: number; // 新增用例数
fixed_bugs: number; // 修复问题数
}显示项目测试执行的时间趋势:
- X轴:时间(日期)
- Y轴:执行次数、通过率
- 图表类型:折线图
显示不同模块的通过率分布:
- 图表类型:饼图或柱状图
- 数据:各模块的通过率
显示测试执行时长的分布:
- 图表类型:直方图
- 数据:执行时长区间分布
- 🟢 进行中 (Active): 项目正在活跃开发和测试
- 🟡 暂停 (Inactive): 项目临时暂停
- 🔴 已完成 (Completed): 项目开发完成
- ⚫ 已归档 (Archived): 项目已归档存储
新建 → 进行中 → 暂停 ⇄ 进行中 → 已完成 → 已归档
↓ ↓ ↓ ↓ ↓ ↓
创建 开发 暂停 恢复 完成 归档
def activate_project(project_id: int):
"""激活项目"""
project = Project.query.get(project_id)
project.status = 'active'
project.update_time = datetime.now()
db.session.commit()
# 发送通知
send_notification(f"项目 {project.project_name} 已激活")def archive_project(project_id: int):
"""归档项目"""
project = Project.query.get(project_id)
# 检查是否有正在执行的任务
if has_running_tasks(project_id):
raise Exception("项目有正在执行的任务,无法归档")
project.status = 'archived'
project.update_time = datetime.now()
db.session.commit()
# 清理临时数据
cleanup_project_temp_data(project_id)- 项目管理员: 拥有项目的完全控制权
- 开发人员: 可以创建和修改测试用例
- 测试人员: 可以执行测试和查看结果
- 观察者: 只能查看项目信息和测试结果
| 操作 | 管理员 | 开发人员 | 测试人员 | 观察者 |
|---|---|---|---|---|
| 查看项目 | ✅ | ✅ | ✅ | ✅ |
| 修改项目 | ✅ | ❌ | ❌ | ❌ |
| 删除项目 | ✅ | ❌ | ❌ | ❌ |
| 创建用例 | ✅ | ✅ | ❌ | ❌ |
| 修改用例 | ✅ | ✅ | ❌ | ❌ |
| 执行测试 | ✅ | ✅ | ✅ | ❌ |
| 查看结果 | ✅ | ✅ | ✅ | ✅ |
def add_project_member(project_id: int, user_id: int, role: str):
"""添加项目成员"""
member = ProjectMember(
project_id=project_id,
user_id=user_id,
role=role,
added_time=datetime.now()
)
db.session.add(member)
db.session.commit()def check_project_permission(user_id: int, project_id: int, action: str) -> bool:
"""检查项目权限"""
member = ProjectMember.query.filter_by(
user_id=user_id,
project_id=project_id
).first()
if not member:
return False
role_permissions = {
'admin': ['read', 'write', 'delete', 'manage'],
'developer': ['read', 'write'],
'tester': ['read', 'execute'],
'viewer': ['read']
}
return action in role_permissions.get(member.role, [])- 按业务域划分: 将相关业务功能组织在同一项目中
- 合理控制规模: 避免项目过大或过小
- 清晰的命名: 使用有意义的项目名称
- 及时更新: 保持项目信息的及时更新
- 最小权限原则: 只给用户必要的权限
- 定期审查: 定期审查和更新权限设置
- 角色分离: 明确不同角色的职责
- 权限记录: 记录权限变更历史
- 状态及时更新: 根据项目实际情况及时更新状态
- 归档策略: 制定合理的项目归档策略
- 数据备份: 归档前做好数据备份
- 清理策略: 定期清理无用的项目数据
🎉 项目管理专家! 你已经掌握了项目管理的全部技能。记住,好的项目管理是成功测试的基础,让我们一起构建更好的测试项目!