|
|
@@ -0,0 +1,324 @@
|
|
|
+# Story 10.11: 编写订单完整流程测试
|
|
|
+
|
|
|
+Status: ready-for-dev
|
|
|
+
|
|
|
+<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
|
|
|
+
|
|
|
+## Story
|
|
|
+
|
|
|
+作为测试开发者,
|
|
|
+我想要编写订单管理的完整流程 E2E 测试,
|
|
|
+以便验证从创建到关闭的端到端场景。
|
|
|
+
|
|
|
+## Acceptance Criteria
|
|
|
+
|
|
|
+**Given** 所有子功能测试已完成
|
|
|
+**When** 编写完整流程测试
|
|
|
+**Then** 包含以下测试场景:
|
|
|
+
|
|
|
+1. **新增订单完整流程**
|
|
|
+ - 创建订单(填写所有字段)
|
|
|
+ - 添加人员到订单
|
|
|
+ - 为人员添加附件
|
|
|
+ - 激活订单
|
|
|
+ - 验证所有步骤成功
|
|
|
+
|
|
|
+2. **编辑订单完整流程**
|
|
|
+ - 打开已有订单
|
|
|
+ - 修改订单信息
|
|
|
+ - 添加更多人员
|
|
|
+ - 关闭订单
|
|
|
+ - 验证所有步骤成功
|
|
|
+
|
|
|
+**测试文件:** `web/tests/e2e/specs/admin/order-complete.spec.ts`
|
|
|
+
|
|
|
+## Tasks / Subtasks
|
|
|
+
|
|
|
+- [ ] 分析完整流程测试需求 (AC: Given)
|
|
|
+ - [ ] 确认所有子功能测试已完成(Story 10.1-10.10)
|
|
|
+ - [ ] 确认 Page Object 方法完整可用
|
|
|
+ - [ ] 确认测试数据准备策略
|
|
|
+- [ ] 创建完整流程测试文件 (AC: When)
|
|
|
+ - [ ] 创建 `web/tests/e2e/specs/admin/order-complete.spec.ts`
|
|
|
+ - [ ] 导入必要的测试依赖和 Page Object
|
|
|
+ - [ ] 配置测试 Fixtures(adminLoginPage, orderManagementPage)
|
|
|
+- [ ] 编写新增订单完整流程测试 (AC: Then #1)
|
|
|
+ - [ ] 测试创建订单(填写所有字段)
|
|
|
+ - [ ] 测试添加人员到订单
|
|
|
+ - [ ] 测试为人员添加附件
|
|
|
+ - [ ] 测试激活订单
|
|
|
+ - [ ] 测试验证所有步骤成功
|
|
|
+- [ ] 编写编辑订单完整流程测试 (AC: Then #2)
|
|
|
+ - [ ] 测试打开已有订单
|
|
|
+ - [ ] 测试修改订单信息
|
|
|
+ - [ ] 测试添加更多人员
|
|
|
+ - [ ] 测试关闭订单
|
|
|
+ - [ ] 测试验证所有步骤成功
|
|
|
+- [ ] 确保所有测试通过 (AC: And)
|
|
|
+ - [ ] 运行测试并修复问题
|
|
|
+ - [ ] 验证测试稳定性(连续运行 3 次)
|
|
|
+
|
|
|
+## Dev Notes
|
|
|
+
|
|
|
+### Epic Context
|
|
|
+
|
|
|
+**Epic 10: 订单管理 E2E 测试 (Epic C - 业务测试 Epic)**
|
|
|
+
|
|
|
+- **目标**: 测试开发者可以为订单管理功能编写完整的 E2E 测试,验证订单的 CRUD、状态流转、人员关联和附件管理功能
|
|
|
+- **业务分组**: Epic C(业务测试 Epic)
|
|
|
+- **背景**: 订单管理是招聘系统的核心业务功能,涉及复杂表单(多选择器联动)、状态流转、人员关联等场景
|
|
|
+- **模式**: 业务测试为主,工具包支持为辅(遵循 Epic A 成功模式)
|
|
|
+
|
|
|
+**依赖:**
|
|
|
+- Epic 1: ✅ 已完成(Select 工具基础框架)
|
|
|
+- Epic 2: ✅ 已完成(Select 工具在真实 E2E 测试中验证)
|
|
|
+- Story 10.1: ✅ 已完成(订单管理 Page Object)
|
|
|
+- Story 10.2: ✅ 已完成(订单列表查看测试)
|
|
|
+- Story 10.3: ✅ 已完成(订单搜索和筛选测试)
|
|
|
+- Story 10.4: ✅ 已完成(创建订单测试)
|
|
|
+- Story 10.5: ✅ 已完成(编辑订单测试)
|
|
|
+- Story 10.6: ✅ 已完成(删除订单测试)
|
|
|
+- Story 10.7: ✅ 已完成(订单状态流转测试)
|
|
|
+- Story 10.8: ✅ 已完成(订单详情查看测试)
|
|
|
+- Story 10.9: ✅ 已完成(人员关联功能测试)
|
|
|
+- Story 10.10: ✅ 已完成(附件管理测试)
|
|
|
+
|
|
|
+### 前序 Story 关键发现总结
|
|
|
+
|
|
|
+**从 Story 10.1 学到的经验(Page Object 设计):**
|
|
|
+- `orderManagementPage` 提供完整的订单管理操作方法
|
|
|
+- 使用 `createOrder()` 创建订单
|
|
|
+- 使用 `openDetailDialog()` 查看订单详情
|
|
|
+- 使用 `closeDetailDialog()` 关闭订单详情对话框
|
|
|
+
|
|
|
+**从 Story 10.4 学到的经验(创建订单):**
|
|
|
+- 使用 `createOrder()` 方法创建订单
|
|
|
+- 必填字段:订单名称、预计开始日期
|
|
|
+- 可选字段:平台、公司、渠道
|
|
|
+- 使用时间戳确保订单名称唯一性
|
|
|
+
|
|
|
+**从 Story 10.5 学到的经验(编辑订单):**
|
|
|
+- 使用 `editOrder()` 方法编辑订单
|
|
|
+- 可以修改订单基本信息和关联信息
|
|
|
+- 编辑后验证列表更新
|
|
|
+
|
|
|
+**从 Story 10.7 学到的经验(状态流转):**
|
|
|
+- 使用 `activateOrder()` 激活订单(草稿 → 进行中)
|
|
|
+- 使用 `closeOrder()` 关闭订单(进行中 → 已完成)
|
|
|
+- 使用 `getOrderStatus()` 获取订单状态
|
|
|
+
|
|
|
+**从 Story 10.9 学到的经验(人员关联):**
|
|
|
+- 使用 API 创建残疾人数据:`createDisabledPersonViaAPI()`
|
|
|
+- 使用 `addPersonToOrder()` 添加人员到订单
|
|
|
+- 设置入职日期和薪资
|
|
|
+- 使用 `getPersonListFromDetail()` 获取人员列表
|
|
|
+
|
|
|
+**从 Story 10.10 学到的经验(附件管理):**
|
|
|
+- 使用 `openAddAttachmentDialog()` 打开附件上传对话框
|
|
|
+- 使用 `uploadAttachment()` 上传附件
|
|
|
+- 使用 fixtures 文件进行测试
|
|
|
+- 验证附件列表显示
|
|
|
+
|
|
|
+### 完整流程测试覆盖场景清单
|
|
|
+
|
|
|
+**新增订单完整流程:**
|
|
|
+- [ ] 创建订单(填写所有字段:订单名称、平台、公司、渠道、预计开始日期)
|
|
|
+- [ ] 添加人员到订单(使用 API 创建的残疾人数据)
|
|
|
+- [ ] 设置人员工作状态为待就业
|
|
|
+- [ ] 为人员添加附件(使用 fixtures 文件)
|
|
|
+- [ ] 激活订单(草稿 → 进行中)
|
|
|
+- [ ] 验证订单状态为进行中
|
|
|
+- [ ] 验证人员列表正确显示
|
|
|
+- [ ] 验证附件列表正确显示
|
|
|
+
|
|
|
+**编辑订单完整流程:**
|
|
|
+- [ ] 创建初始订单(用于后续编辑)
|
|
|
+- [ ] 添加初始人员到订单
|
|
|
+- [ ] 打开订单详情对话框
|
|
|
+- [ ] 修改订单名称
|
|
|
+- [ ] 更换平台和公司
|
|
|
+- [ ] 添加更多人员到订单
|
|
|
+- [ ] 关闭订单(进行中 → 已完成)
|
|
|
+- [ ] 验证订单状态为已完成
|
|
|
+- [ ] 验证订单信息更新正确
|
|
|
+- [ ] 验证人员列表包含新添加的人员
|
|
|
+
|
|
|
+### 测试数据准备策略
|
|
|
+
|
|
|
+**使用 API 创建测试数据(遵循 Story 10.9 成功模式):**
|
|
|
+```typescript
|
|
|
+// 1. 创建残疾人数据(使用 API)
|
|
|
+const disabledPerson = await createDisabledPersonViaAPI({
|
|
|
+ name: `测试残疾人_${timestamp}`,
|
|
|
+ idCard: generateTestIdCard(timestamp),
|
|
|
+ disabilityType: '肢体残疾',
|
|
|
+ disabilityLevel: '一级',
|
|
|
+ // ... 其他字段
|
|
|
+});
|
|
|
+
|
|
|
+// 2. 创建测试订单
|
|
|
+const orderName = `测试订单_${timestamp}`;
|
|
|
+await orderManagementPage.createOrder({
|
|
|
+ name: orderName,
|
|
|
+ platformName: '测试平台',
|
|
|
+ companyName: '测试公司',
|
|
|
+ channelName: '测试渠道',
|
|
|
+ expectedStartDate: '2026-01-15',
|
|
|
+});
|
|
|
+
|
|
|
+// 3. 添加人员到订单
|
|
|
+await orderManagementPage.addPersonToOrder({
|
|
|
+ personName: disabledPerson.name,
|
|
|
+ workStatus: '待就业',
|
|
|
+ expectedEmploymentDate: '2026-01-15',
|
|
|
+ salary: 5000,
|
|
|
+});
|
|
|
+
|
|
|
+// 4. 上传附件
|
|
|
+await orderManagementPage.uploadAttachment(
|
|
|
+ disabledPerson.id,
|
|
|
+ 'sample-id-card.jpg',
|
|
|
+ 'image/jpeg'
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+**Fixtures 文件使用:**
|
|
|
+- `web/tests/fixtures/images/sample-id-card.jpg` - 身份证照片
|
|
|
+- `web/tests/fixtures/images/sample-disability-card.jpg` - 残疾证照片
|
|
|
+- `web/tests/fixtures/images/photo.jpg` - 个人照片
|
|
|
+
|
|
|
+### 项目结构对齐
|
|
|
+
|
|
|
+**遵循 Epic 9.6 并行执行决策:**
|
|
|
+- ✅ 不使用 `test.describe.serial`
|
|
|
+- ✅ 每个测试创建独立的测试数据
|
|
|
+- ✅ 使用时间戳确保订单名称和残疾人姓名唯一
|
|
|
+
|
|
|
+**遵循项目的测试模式:**
|
|
|
+- ✅ 使用 Playwright fixtures
|
|
|
+- ✅ 使用 Page Object 模式
|
|
|
+- ✅ Toast 消息使用 `data-sonner-toast` 选择器
|
|
|
+- ✅ 对话框使用 `role="dialog"` 或 `role="alertdialog"`
|
|
|
+
|
|
|
+**遵循项目的类型规范:**
|
|
|
+- ✅ 使用 TypeScript 严格模式
|
|
|
+- ✅ 使用 `ORDER_STATUS` 和 `ORDER_STATUS_LABELS` 常量
|
|
|
+- ✅ 使用 `WORK_STATUS` 和 `WORK_STATUS_LABELS` 常量
|
|
|
+- ✅ 订单状态类型使用 `OrderStatus` 类型别名
|
|
|
+- ✅ 工作状态类型使用 `WorkStatus` 类型别名
|
|
|
+
|
|
|
+### 测试隔离策略
|
|
|
+
|
|
|
+**每个测试的独立数据:**
|
|
|
+```typescript
|
|
|
+test('新增订单完整流程', async ({ adminLoginPage, orderManagementPage }) => {
|
|
|
+ // 使用时间戳确保唯一性
|
|
|
+ const timestamp = Date.now();
|
|
|
+ const testDataCounter = timestamp;
|
|
|
+
|
|
|
+ // 创建残疾人数据
|
|
|
+ const person = await createDisabledPersonViaAPI({
|
|
|
+ name: `残疾人_${testDataCounter}`,
|
|
|
+ idCard: generateTestIdCard(testDataCounter),
|
|
|
+ // ...
|
|
|
+ });
|
|
|
+
|
|
|
+ // 创建订单
|
|
|
+ const orderName = `订单_${testDataCounter}`;
|
|
|
+ await orderManagementPage.createOrder({
|
|
|
+ name: orderName,
|
|
|
+ // ...
|
|
|
+ });
|
|
|
+
|
|
|
+ // 添加人员
|
|
|
+ await orderManagementPage.addPersonToOrder({
|
|
|
+ personName: person.name,
|
|
|
+ // ...
|
|
|
+ });
|
|
|
+
|
|
|
+ // 验证...
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+### Page Object 方法使用清单
|
|
|
+
|
|
|
+**完整流程测试需要的 Page Object 方法:**
|
|
|
+
|
|
|
+| 方法 | 说明 | 来源 Story |
|
|
|
+|------|------|-----------|
|
|
|
+| `createOrder(data)` | 创建订单 | 10.1, 10.4 |
|
|
|
+| `openDetailDialog(orderName)` | 打开订单详情 | 10.1, 10.8 |
|
|
|
+| `closeDetailDialog()` | 关闭订单详情 | 10.1, 10.8 |
|
|
|
+| `addPersonToOrder(data)` | 添加人员到订单 | 10.1, 10.9 |
|
|
|
+| `openAddAttachmentDialog()` | 打开附件上传对话框 | 10.1, 10.10 |
|
|
|
+| `uploadAttachment(personId, fileName, mimeType)` | 上传附件 | 10.1, 10.10 |
|
|
|
+| `activateOrder()` | 激活订单 | 10.1, 10.7 |
|
|
|
+| `closeOrder()` | 关闭订单 | 10.1, 10.7 |
|
|
|
+| `getOrderStatus(orderName)` | 获取订单状态 | 10.1, 10.7 |
|
|
|
+| `getPersonListFromDetail()` | 获取人员列表 | 10.1, 10.8 |
|
|
|
+| `getAttachmentListFromDetail()` | 获取附件列表 | 10.1, 10.8 |
|
|
|
+| `editOrder(data)` | 编辑订单 | 10.1, 10.5 |
|
|
|
+
|
|
|
+### Project Structure Notes
|
|
|
+
|
|
|
+**测试文件位置:**
|
|
|
+```
|
|
|
+web/tests/e2e/
|
|
|
+├── pages/admin/
|
|
|
+│ └── order-management.page.ts (已有完整方法)
|
|
|
+└── specs/admin/
|
|
|
+ └── order-complete.spec.ts (新建)
|
|
|
+```
|
|
|
+
|
|
|
+**与其他测试的关系:**
|
|
|
+- `order-create.spec.ts`: 创建订单测试(子功能验证)
|
|
|
+- `order-edit.spec.ts`: 编辑订单测试(子功能验证)
|
|
|
+- `order-person.spec.ts`: 人员关联测试(子功能验证)
|
|
|
+- `order-attachment.spec.ts`: 附件管理测试(子功能验证)
|
|
|
+- `order-status.spec.ts`: 状态流转测试(子功能验证)
|
|
|
+- `order-complete.spec.ts`: **完整流程测试(端到端集成)**
|
|
|
+
|
|
|
+**本 Story 完成后的影响:**
|
|
|
+- 完成订单管理的最后一个核心测试
|
|
|
+- 验证所有子功能的集成正确性
|
|
|
+- 为 Story 10.12(运行测试并收集问题)提供完整测试覆盖
|
|
|
+- 为 Epic 10 的稳定性验证做好准备
|
|
|
+
|
|
|
+### References
|
|
|
+
|
|
|
+**Epic 需求来源:**
|
|
|
+- [Source: _bmad-output/planning-artifacts/epics.md](../planning-artifacts/epics.md) - Story 10.11 详细需求(行 2209-2235)
|
|
|
+
|
|
|
+**Page Object 现有实现:**
|
|
|
+- [Source: web/tests/e2e/pages/admin/order-management.page.ts](../../web/tests/e2e/pages/admin/order-management.page.ts) - 订单管理完整方法
|
|
|
+
|
|
|
+**前序 Story 学习:**
|
|
|
+- [Source: _bmad-output/implementation-artifacts/10-4-order-create-tests.md](10-4-order-create-tests.md) - 创建订单测试
|
|
|
+- [Source: _bmad-output/implementation-artifacts/10-5-order-edit-tests.md](10-5-order-edit-tests.md) - 编辑订单测试
|
|
|
+- [Source: _bmad-output/implementation-artifacts/10-7-order-status-tests.md](10-7-order-status-tests.md) - 状态流转测试
|
|
|
+- [Source: _bmad-output/implementation-artifacts/10-9-order-person-tests.md](10-9-order-person-tests.md) - 人员关联测试
|
|
|
+- [Source: _bmad-output/implementation-artifacts/10-10-order-attachment-tests.md](10-10-order-attachment-tests.md) - 附件管理测试
|
|
|
+
|
|
|
+**项目上下文:**
|
|
|
+- [Source: _bmad-output/project-context.md](../project-context.md) - 技术栈、测试规范、类型系统
|
|
|
+
|
|
|
+**Epic 9 并行执行决策:**
|
|
|
+- [Source: _bmad-output/implementation-artifacts/epic-9-retrospective-2026-01-12.md](epic-9-retrospective-2026-01-12.md) - 测试隔离和并行执行最佳实践
|
|
|
+
|
|
|
+## Dev Agent Record
|
|
|
+
|
|
|
+### Agent Model Used
|
|
|
+
|
|
|
+claude-opus-4-5-20251101
|
|
|
+
|
|
|
+### Debug Log References
|
|
|
+
|
|
|
+_待开发时填写_
|
|
|
+
|
|
|
+### Completion Notes List
|
|
|
+
|
|
|
+_待开发时填写_
|
|
|
+
|
|
|
+### File List
|
|
|
+
|
|
|
+_待开发时填写_
|