|
@@ -0,0 +1,341 @@
|
|
|
|
|
+# Story 10.3: 编写订单搜索和筛选测试
|
|
|
|
|
+
|
|
|
|
|
+Status: ready-for-dev
|
|
|
|
|
+
|
|
|
|
|
+<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
|
|
|
|
|
+
|
|
|
|
|
+## Story
|
|
|
|
|
+
|
|
|
|
|
+作为测试开发者,
|
|
|
|
|
+我想要编写订单搜索和筛选的 E2E 测试,
|
|
|
|
|
+以便验证多维度搜索和筛选功能。
|
|
|
|
|
+
|
|
|
|
|
+## Acceptance Criteria
|
|
|
|
|
+
|
|
|
|
|
+**Given** 订单列表 Page Object 已创建
|
|
|
|
|
+**When** 编写搜索和筛选测试用例
|
|
|
|
|
+**Then** 包含以下测试场景:
|
|
|
|
|
+
|
|
|
|
|
+1. **订单名称搜索**
|
|
|
|
|
+ - 输入订单名称关键词搜索
|
|
|
|
|
+ - 验证搜索结果正确过滤
|
|
|
|
|
+
|
|
|
|
|
+2. **订单状态筛选**
|
|
|
|
|
+ - 按订单状态筛选(草稿、已确认、进行中等)
|
|
|
|
|
+ - 验证筛选结果正确
|
|
|
|
|
+
|
|
|
|
|
+3. **工作状态筛选**
|
|
|
|
|
+ - 按工作状态筛选(未就业、待就业、已就业、已离职)
|
|
|
|
|
+ - 验证筛选结果正确
|
|
|
|
|
+
|
|
|
|
|
+4. **平台筛选**
|
|
|
|
|
+ - 选择平台进行筛选
|
|
|
|
|
+ - 使用 `selectRadixOption` 或 `selectRadixOptionAsync`
|
|
|
|
|
+ - 验证筛选结果正确
|
|
|
|
|
+
|
|
|
|
|
+5. **公司筛选**
|
|
|
|
|
+ - 选择公司进行筛选
|
|
|
|
|
+ - 验证筛选结果正确
|
|
|
|
|
+
|
|
|
|
|
+6. **渠道筛选**
|
|
|
|
|
+ - 选择渠道进行筛选
|
|
|
|
|
+ - 验证筛选结果正确
|
|
|
|
|
+
|
|
|
|
|
+7. **日期范围筛选**
|
|
|
|
|
+ - 选择开始日期和结束日期
|
|
|
|
|
+ - 验证日期范围内的订单正确显示
|
|
|
|
|
+
|
|
|
|
|
+8. **重置筛选**
|
|
|
|
|
+ - 重置所有筛选条件
|
|
|
|
|
+ - 验证显示全部订单
|
|
|
|
|
+
|
|
|
|
|
+**测试文件:** `web/tests/e2e/specs/admin/order-filter.spec.ts`
|
|
|
|
|
+
|
|
|
|
|
+## Tasks / Subtasks
|
|
|
|
|
+
|
|
|
|
|
+- [ ] 创建订单筛选测试文件 (AC: When)
|
|
|
|
|
+ - [ ] 创建 `web/tests/e2e/specs/admin/order-filter.spec.ts`
|
|
|
|
|
+ - [ ] 导入必要的测试依赖(Playwright fixtures、OrderManagementPage)
|
|
|
|
|
+ - [ ] 配置测试文件的基本结构
|
|
|
|
|
+- [ ] 编写订单名称搜索测试 (AC: Then #1)
|
|
|
|
|
+ - [ ] 测试按订单名称关键词搜索
|
|
|
|
|
+ - [ ] 验证搜索结果只包含匹配的订单
|
|
|
|
|
+ - [ ] 测试清空搜索条件
|
|
|
|
|
+- [ ] 编写订单状态筛选测试 (AC: Then #2)
|
|
|
|
|
+ - [ ] 测试按草稿状态筛选
|
|
|
|
|
+ - [ ] 测试按已确认状态筛选
|
|
|
|
|
+ - [ ] 测试按进行中状态筛选
|
|
|
|
|
+ - [ ] 测试按已完成状态筛选
|
|
|
|
|
+- [ ] 编写工作状态筛选测试 (AC: Then #3)
|
|
|
|
|
+ - [ ] 测试按未就业状态筛选
|
|
|
|
|
+ - [ ] 测试按待就业状态筛选
|
|
|
|
|
+ - [ ] 测试按已就业状态筛选
|
|
|
|
|
+ - [ ] 测试按已离职状态筛选
|
|
|
|
|
+- [ ] 编写平台筛选测试 (AC: Then #4)
|
|
|
|
|
+ - [ ] 测试打开平台选择器
|
|
|
|
|
+ - [ ] 测试选择特定平台
|
|
|
|
|
+ - [ ] 验证筛选结果只包含该平台的订单
|
|
|
|
|
+ - [ ] 使用 `selectRadixOption` 工具
|
|
|
|
|
+- [ ] 编写公司筛选测试 (AC: Then #5)
|
|
|
|
|
+ - [ ] 测试打开公司选择器
|
|
|
|
|
+ - [ ] 测试选择特定公司
|
|
|
|
|
+ - [ ] 验证筛选结果只包含该公司的订单
|
|
|
|
|
+- [ ] 编写渠道筛选测试 (AC: Then #6)
|
|
|
|
|
+ - [ ] 测试打开渠道选择器
|
|
|
|
|
+ - [ ] 测试选择特定渠道
|
|
|
|
|
+ - [ ] 验证筛选结果只包含该渠道的订单
|
|
|
|
|
+- [ ] 编写日期范围筛选测试 (AC: Then #7)
|
|
|
|
|
+ - [ ] 测试选择开始日期
|
|
|
|
|
+ - [ ] 测试选择结束日期
|
|
|
|
|
+ - [ ] 验证日期范围内的订单正确显示
|
|
|
|
|
+- [ ] 编写重置筛选测试 (AC: Then #8)
|
|
|
|
|
+ - [ ] 测试设置多个筛选条件
|
|
|
|
|
+ - [ ] 测试点击重置按钮
|
|
|
|
|
+ - [ ] 验证所有筛选条件被清除
|
|
|
|
|
+ - [ ] 验证显示全部订单
|
|
|
|
|
+- [ ] 确保所有测试通过 (AC: And)
|
|
|
|
|
+
|
|
|
|
|
+## 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 情报 (Story 10.1, 10.2)
|
|
|
|
|
+
|
|
|
|
|
+**Page Object 已有的搜索和筛选功能:**
|
|
|
|
|
+
|
|
|
|
|
+`web/tests/e2e/pages/admin/order-management.page.ts` 包含以下方法:
|
|
|
|
|
+
|
|
|
|
|
+1. **搜索功能:**
|
|
|
|
|
+ - `searchByName(name: string)` - 按订单名称搜索
|
|
|
|
|
+ - `searchInput` - 搜索输入框选择器
|
|
|
|
|
+ - `searchButton` - 搜索按钮选择器
|
|
|
|
|
+
|
|
|
|
|
+2. **筛选功能:**
|
|
|
|
|
+ - `openFilterDialog()` - 打开高级筛选对话框
|
|
|
|
|
+ - `setFilters(filters)` - 设置筛选条件
|
|
|
|
|
+ - `applyFilters()` - 应用筛选条件
|
|
|
|
|
+ - `clearFilters()` - 清空筛选条件
|
|
|
|
|
+
|
|
|
|
|
+3. **状态常量:**
|
|
|
|
|
+ ```typescript
|
|
|
|
|
+ // 订单状态
|
|
|
|
|
+ ORDER_STATUS_LABELS = {
|
|
|
|
|
+ draft: '草稿',
|
|
|
|
|
+ confirmed: '已确认',
|
|
|
|
|
+ in_progress: '进行中',
|
|
|
|
|
+ completed: '已完成',
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 工作状态
|
|
|
|
|
+ WORK_STATUS_LABELS = {
|
|
|
|
|
+ not_employed: '未就业',
|
|
|
|
|
+ pending: '待就业',
|
|
|
|
|
+ employed: '已就业',
|
|
|
|
|
+ resigned: '已离职',
|
|
|
|
|
+ }
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+### 测试文件结构参考
|
|
|
|
|
+
|
|
|
|
|
+参考 Story 10.2(订单列表查看测试)的测试结构:
|
|
|
|
|
+
|
|
|
|
|
+```typescript
|
|
|
|
|
+import { test, expect } from '../../utils/test-setup';
|
|
|
|
|
+
|
|
|
|
|
+test.describe.serial('订单搜索和筛选测试', () => {
|
|
|
|
|
+ test.beforeEach(async ({ adminLoginPage, orderManagementPage }) => {
|
|
|
|
|
+ await adminLoginPage.goto();
|
|
|
|
|
+ await adminLoginPage.login('admin', 'admin123');
|
|
|
|
|
+ await orderManagementPage.goto();
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test.describe('订单名称搜索', () => {
|
|
|
|
|
+ test('应该能按订单名称关键词搜索', async ({ orderManagementPage }) => {
|
|
|
|
|
+ await orderManagementPage.searchByName('测试');
|
|
|
|
|
+ // 验证搜索结果
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 更多测试...
|
|
|
|
|
+});
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 筛选对话框元素(待确认)
|
|
|
|
|
+
|
|
|
|
|
+**高级筛选对话框结构(预期):**
|
|
|
|
|
+- 打开方式:点击"筛选"或"高级筛选"按钮
|
|
|
|
|
+- 订单状态选择器:Radix UI Select
|
|
|
|
|
+- 工作状态选择器:Radix UI Select
|
|
|
|
|
+- 平台选择器:Radix UI Select(可能异步加载)
|
|
|
|
|
+- 公司选择器:Radix UI Select(可能异步加载)
|
|
|
|
|
+- 渠道选择器:Radix UI Select(可能异步加载)
|
|
|
|
|
+- 开始日期输入框:日期类型输入
|
|
|
|
|
+- 结束日期输入框:日期类型输入
|
|
|
|
|
+- 应用按钮:应用筛选条件
|
|
|
|
|
+- 重置按钮:清空所有筛选条件
|
|
|
|
|
+
|
|
|
|
|
+### 技术要求
|
|
|
|
|
+
|
|
|
|
|
+**导入依赖:**
|
|
|
|
|
+```typescript
|
|
|
|
|
+import { test, expect } from '../../utils/test-setup';
|
|
|
|
|
+import { OrderManagementPage, ORDER_STATUS, WORK_STATUS } from '../../pages/admin/order-management.page';
|
|
|
|
|
+import { selectRadixOption } from '@d8d/e2e-test-utils';
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**测试 Fixtures:**
|
|
|
|
|
+- 使用 `adminLoginPage` fixture 进行登录
|
|
|
|
|
+- 使用 `orderManagementPage` fixture 操作页面
|
|
|
|
|
+- 使用 `test.describe.serial()` 确保测试按顺序执行
|
|
|
|
|
+
|
|
|
|
|
+**断言策略:**
|
|
|
|
|
+- 验证搜索后列表更新
|
|
|
|
|
+- 验证筛选后只显示符合条件的订单
|
|
|
|
|
+- 验证重置后显示所有订单
|
|
|
|
|
+- 验证筛选条件正确应用
|
|
|
|
|
+
|
|
|
|
|
+### 工具使用
|
|
|
|
|
+
|
|
|
|
|
+**Select 工具使用(来自 Epic 1, 2):**
|
|
|
|
|
+```typescript
|
|
|
|
|
+import { selectRadixOption } from '@d8d/e2e-test-utils';
|
|
|
|
|
+
|
|
|
|
|
+// 静态选择器
|
|
|
|
|
+await selectRadixOption(page, '平台', '58同城');
|
|
|
|
|
+
|
|
|
|
|
+// 异步选择器(如需要)
|
|
|
|
|
+import { selectRadixOptionAsync } from '@d8d/e2e-test-utils';
|
|
|
|
|
+await selectRadixOptionAsync(page, '平台', '58同城', { timeout: 5000 });
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 测试标准参考
|
|
|
|
|
+
|
|
|
|
|
+遵循以下测试标准文档:
|
|
|
|
|
+- `docs/standards/testing-standards.md` - 测试规范
|
|
|
|
|
+- `docs/standards/web-ui-testing-standards.md` - Web UI 测试规范
|
|
|
|
|
+- `docs/standards/e2e-radix-testing.md` - Radix UI E2E 测试标准
|
|
|
|
|
+
|
|
|
|
|
+**选择器优先级:**
|
|
|
|
|
+1. `data-testid` - 最高优先级
|
|
|
|
|
+2. `aria-label + role`
|
|
|
|
|
+3. `text content + role` - 兜底
|
|
|
|
|
+
|
|
|
|
|
+### Project Structure Notes
|
|
|
|
|
+
|
|
|
|
|
+**文件位置:**
|
|
|
|
|
+- 测试文件: `web/tests/e2e/specs/admin/order-filter.spec.ts`
|
|
|
|
|
+- Page Object: `web/tests/e2e/pages/admin/order-management.page.ts`
|
|
|
|
|
+- Fixtures 目录: `web/tests/e2e/fixtures/`
|
|
|
|
|
+
|
|
|
|
|
+**对齐统一项目结构:**
|
|
|
|
|
+- 遵循 `project-context.md` 中的 TypeScript 严格模式规则
|
|
|
|
|
+- 函数参数、返回值必须有明确类型注解
|
|
|
|
|
+- 禁止使用 `any` 类型
|
|
|
|
|
+- 公共 API 必须包含完整 JSDoc 注释
|
|
|
|
|
+
|
|
|
|
|
+### 测试运行命令
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 在 web 目录下运行单个测试文件
|
|
|
|
|
+cd web
|
|
|
|
|
+pnpm test:e2e:chromium order-filter
|
|
|
|
|
+
|
|
|
|
|
+# 快速失败模式(推荐调试时使用)
|
|
|
|
|
+timeout 60 pnpm test:e2e:chromium order-filter
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 测试注意事项
|
|
|
|
|
+
|
|
|
|
|
+**搜索功能:**
|
|
|
|
|
+- 搜索框使用 `data-testid="search-order-name-input"` 定位
|
|
|
|
|
+- 搜索按钮使用 `data-testid="search-button"` 定位
|
|
|
|
|
+- 搜索后需要等待网络请求完成
|
|
|
|
|
+
|
|
|
|
|
+**筛选对话框:**
|
|
|
|
|
+- 筛选按钮可能使用文本"筛选"定位
|
|
|
|
|
+- 筛选对话框使用 `role="dialog"` 定位
|
|
|
|
|
+- 应用按钮可能使用"应用"、"确定"或"筛选"文本
|
|
|
|
|
+- 重置按钮可能使用"重置"或"清空"文本
|
|
|
|
|
+
|
|
|
|
|
+**日期选择:**
|
|
|
|
|
+- 日期输入框可能使用 `type="date"` 或自定义日期选择器
|
|
|
|
|
+- 如果使用自定义日期选择器,需要单独处理
|
|
|
|
|
+
|
|
|
|
|
+**数据假设:**
|
|
|
|
|
+- 测试应假设数据库中存在不同状态、不同平台、不同公司的订单
|
|
|
|
|
+- 如果没有测试数据,某些筛选测试可能无法验证结果
|
|
|
|
|
+
|
|
|
|
|
+### 测试覆盖场景清单
|
|
|
|
|
+
|
|
|
|
|
+**搜索功能:**
|
|
|
|
|
+- [ ] 订单名称关键词搜索
|
|
|
|
|
+- [ ] 搜索结果验证
|
|
|
|
|
+- [ ] 清空搜索条件
|
|
|
|
|
+
|
|
|
|
|
+**订单状态筛选:**
|
|
|
|
|
+- [ ] 草稿状态筛选
|
|
|
|
|
+- [ ] 已确认状态筛选
|
|
|
|
|
+- [ ] 进行中状态筛选
|
|
|
|
|
+- [ ] 已完成状态筛选
|
|
|
|
|
+
|
|
|
|
|
+**工作状态筛选:**
|
|
|
|
|
+- [ ] 未就业状态筛选
|
|
|
|
|
+- [ ] 待就业状态筛选
|
|
|
|
|
+- [ ] 已就业状态筛选
|
|
|
|
|
+- [ ] 已离职状态筛选
|
|
|
|
|
+
|
|
|
|
|
+**平台筛选:**
|
|
|
|
|
+- [ ] 平台选择器交互
|
|
|
|
|
+- [ ] 平台筛选结果验证
|
|
|
|
|
+
|
|
|
|
|
+**公司筛选:**
|
|
|
|
|
+- [ ] 公司选择器交互
|
|
|
|
|
+- [ ] 公司筛选结果验证
|
|
|
|
|
+
|
|
|
|
|
+**渠道筛选:**
|
|
|
|
|
+- [ ] 渠道选择器交互
|
|
|
|
|
+- [ ] 渠道筛选结果验证
|
|
|
|
|
+
|
|
|
|
|
+**日期范围筛选:**
|
|
|
|
|
+- [ ] 开始日期选择
|
|
|
|
|
+- [ ] 结束日期选择
|
|
|
|
|
+- [ ] 日期范围结果验证
|
|
|
|
|
+
|
|
|
|
|
+**重置功能:**
|
|
|
|
|
+- [ ] 重置单个筛选条件
|
|
|
|
|
+- [ ] 重置所有筛选条件
|
|
|
|
|
+- [ ] 重置后显示所有订单
|
|
|
|
|
+
|
|
|
|
|
+### References
|
|
|
|
|
+
|
|
|
|
|
+- [Source: _bmad-output/planning-artifacts/epics.md#Story 10.3](../planning-artifacts/epics.md)
|
|
|
|
|
+- [Source: _bmad-output/planning-artifacts/prd.md](../planning-artifacts/prd.md)
|
|
|
|
|
+- [Source: _bmad-output/planning-artifacts/architecture.md](../planning-artifacts/architecture.md)
|
|
|
|
|
+- [Source: web/tests/e2e/pages/admin/order-management.page.ts](../../web/tests/e2e/pages/admin/order-management.page.ts)
|
|
|
|
|
+- [Source: _bmad-output/implementation-artifacts/10-1-order-page-object.md](10-1-order-page-object.md)
|
|
|
|
|
+- [Source: _bmad-output/implementation-artifacts/10-2-order-list-tests.md](10-2-order-list-tests.md)
|
|
|
|
|
+
|
|
|
|
|
+## Dev Agent Record
|
|
|
|
|
+
|
|
|
|
|
+### Agent Model Used
|
|
|
|
|
+
|
|
|
|
|
+claude-opus-4-5-20251101
|
|
|
|
|
+
|
|
|
|
|
+### Debug Log References
|
|
|
|
|
+
|
|
|
|
|
+### Completion Notes List
|
|
|
|
|
+
|
|
|
|
|
+### File List
|