10-11-order-complete-tests.md 11 KB

Story 10.11: 编写订单完整流程测试

Status: ready-for-dev

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 成功模式):

// 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_STATUSORDER_STATUS_LABELS 常量
  • ✅ 使用 WORK_STATUSWORK_STATUS_LABELS 常量
  • ✅ 订单状态类型使用 OrderStatus 类型别名
  • ✅ 工作状态类型使用 WorkStatus 类型别名

测试隔离策略

每个测试的独立数据:

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 需求来源:

Page Object 现有实现:

前序 Story 学习:

项目上下文:

Epic 9 并行执行决策:

Dev Agent Record

Agent Model Used

claude-opus-4-5-20251101

Debug Log References

待开发时填写

Completion Notes List

待开发时填写

File List

待开发时填写