|
@@ -292,16 +292,27 @@ Error: Radix Select 等待超时
|
|
|
|--------|------|------|
|
|
|--------|------|------|
|
|
|
| FR1-FR6 | Epic 1 | Radix UI Select 测试支持(静态和异步) |
|
|
| FR1-FR6 | Epic 1 | Radix UI Select 测试支持(静态和异步) |
|
|
|
| FR25-FR32 | Epic 1 | 包基础设施(package.json、类型定义、配置) |
|
|
| FR25-FR32 | Epic 1 | 包基础设施(package.json、类型定义、配置) |
|
|
|
-| FR7-FR24, FR46-FR50 | Epic 3 | 扩展工具集(文件上传、表单、列表、对话框、可扩展性) |
|
|
|
|
|
-| FR41-FR45 | Epic 2 & 4 | 质量与稳定性(Select 验证、全面验证、稳定性测试) |
|
|
|
|
|
-| FR33-FR40 | Epic 5 | 文档与开发者体验(README、示例、迁移指南) |
|
|
|
|
|
-
|
|
|
|
|
-**Epic 规划变更说明(2026-01-09):**
|
|
|
|
|
|
|
+| FR7-FR10 | Epic 3 | 文件上传测试支持(文件上传工具与验证) |
|
|
|
|
|
+| FR11-FR15 | Epic 4 | 表单交互测试支持(表单工具与验证) |
|
|
|
|
|
+| FR16-FR24 | Epic 5 | 列表和对话框测试支持(列表和对话框工具与验证) |
|
|
|
|
|
+| FR41-FR45 | Epic 2, 3, 4, 5, 6 | 质量与稳定性(各工具验证、全面验证、稳定性测试) |
|
|
|
|
|
+| FR33-FR40 | Epic 7 | 文档与开发者体验(README、示例、迁移指南) |
|
|
|
|
|
+| FR46-FR50 | Epic 3, 4, 5 | 可扩展性(各工具的配置和扩展支持) |
|
|
|
|
|
+
|
|
|
|
|
+**Epic 规划变更说明(2026-01-10):**
|
|
|
- Epic 1: ✅ 已完成(Select 工具基础框架)
|
|
- Epic 1: ✅ 已完成(Select 工具基础框架)
|
|
|
-- Epic 2: 🆕 新增(在现有 E2E 测试中验证 Select 工具)
|
|
|
|
|
-- Epic 3: 原 Epic 2(扩展工具集)
|
|
|
|
|
-- Epic 4: 原 Epic 3(全面验证工具包)
|
|
|
|
|
-- Epic 5: 原 Epic 4(完善文档与开发者体验)
|
|
|
|
|
|
|
+- Epic 2: ✅ 已完成(在现有 E2E 测试中验证 Select 工具)
|
|
|
|
|
+- Epic 3: 🆕 文件上传工具开发与验证(遵循 Epic 2 成功模式)
|
|
|
|
|
+- Epic 4: 🆕 表单工具开发与验证(遵循 Epic 2 成功模式)
|
|
|
|
|
+- Epic 5: 🆕 列表和对话框工具开发与验证(遵循 Epic 2 成功模式)
|
|
|
|
|
+- Epic 6: 完整验证(残疾人管理)
|
|
|
|
|
+- Epic 7: 文档与开发者体验
|
|
|
|
|
+
|
|
|
|
|
+**"先验证再扩展"策略:**
|
|
|
|
|
+基于 Epic 2 的成功经验,每个工具都遵循"开发 → E2E 验证 → 稳定性验证"的模式:
|
|
|
|
|
+- Epic 3: 文件上传工具(优先解决当前测试超时问题)
|
|
|
|
|
+- Epic 4: 表单工具
|
|
|
|
|
+- Epic 5: 列表和对话框工具
|
|
|
|
|
|
|
|
## Epic List
|
|
## Epic List
|
|
|
|
|
|
|
@@ -309,6 +320,8 @@ Error: Radix Select 等待超时
|
|
|
|
|
|
|
|
**目标:** 测试开发者可以安装 `@d8d/e2e-test-utils` 包,立即使用 Select 工具测试 Radix UI Select 组件(最常用、最关键的测试场景)。
|
|
**目标:** 测试开发者可以安装 `@d8d/e2e-test-utils` 包,立即使用 Select 工具测试 Radix UI Select 组件(最常用、最关键的测试场景)。
|
|
|
|
|
|
|
|
|
|
+**状态:** ✅ Done
|
|
|
|
|
+
|
|
|
**交付物:**
|
|
**交付物:**
|
|
|
- 完整的包结构和配置(package.json, tsconfig.json, vitest.config.ts)
|
|
- 完整的包结构和配置(package.json, tsconfig.json, vitest.config.ts)
|
|
|
- `selectRadixOption()` 和 `selectRadixOptionAsync()` 函数
|
|
- `selectRadixOption()` 和 `selectRadixOptionAsync()` 函数
|
|
@@ -319,77 +332,111 @@ Error: Radix Select 等待超时
|
|
|
|
|
|
|
|
**FRs covered:** FR1-FR6, FR25-FR32
|
|
**FRs covered:** FR1-FR6, FR25-FR32
|
|
|
|
|
|
|
|
-**用户价值:**
|
|
|
|
|
-- 可以安装并立即使用 Select 工具
|
|
|
|
|
-- 无需深入了解 Radix UI DOM 结构
|
|
|
|
|
-- 自动处理时序问题
|
|
|
|
|
-- 清晰的错误提示
|
|
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+### Epic 2: 在现有 E2E 测试中验证 Select 工具
|
|
|
|
|
+
|
|
|
|
|
+**目标:** 在 `web/tests/e2e/` 的残疾人管理测试中使用 Select 工具,验证工具在真实场景中的可用性和稳定性。
|
|
|
|
|
+
|
|
|
|
|
+**状态:** ✅ Done
|
|
|
|
|
+
|
|
|
|
|
+**交付物:**
|
|
|
|
|
+- Select 工具在残疾人管理测试中的实际应用
|
|
|
|
|
+- 5 处静态 Select 迁移(残疾类型、等级等)
|
|
|
|
|
+- 2 处异步 Select 迁移(省份、城市)
|
|
|
|
|
+- DOM 结构问题修复(listbox → option)
|
|
|
|
|
+
|
|
|
|
|
+**FRs covered:** FR41-FR45 (部分)
|
|
|
|
|
+
|
|
|
|
|
+**关键经验:**
|
|
|
|
|
+- DOM 结构假设必须验证
|
|
|
|
|
+- 真实 E2E 测试不可替代
|
|
|
|
|
+- "先验证再扩展"策略有效
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Epic 2: 扩展工具集(文件上传、表单、列表、对话框)
|
|
|
|
|
|
|
+### Epic 3: 文件上传工具开发与验证
|
|
|
|
|
+
|
|
|
|
|
+**目标:** 遵循 Epic 2 成功模式,开发文件上传工具并在真实 E2E 测试中验证,解决当前测试超时阻塞问题。
|
|
|
|
|
|
|
|
-**目标:** 测试开发者可以使用完整的 6 个核心工具函数,覆盖所有常见 E2E 测试场景。
|
|
|
|
|
|
|
+**状态:** 🆕 Backlog
|
|
|
|
|
+
|
|
|
|
|
+**模式:** 工具开发 → 真实 E2E 测试验证 → 问题修复 → 稳定性验证
|
|
|
|
|
+
|
|
|
|
|
+**交付物:**
|
|
|
|
|
+- `uploadFileToField()` 文件上传工具
|
|
|
|
|
+- 单元测试(Vitest)
|
|
|
|
|
+- 在残疾人管理测试中验证(至少 3 处文件上传)
|
|
|
|
|
+- 稳定性验证(10次连续运行)
|
|
|
|
|
+
|
|
|
|
|
+**FRs covered:** FR7-FR10, FR46-FR50 (部分), FR41-FR45 (部分)
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+### Epic 4: 表单工具开发与验证
|
|
|
|
|
+
|
|
|
|
|
+**目标:** 开发表单辅助工具并在真实 E2E 测试中验证。
|
|
|
|
|
+
|
|
|
|
|
+**状态:** Backlog (等待 Epic 3 完成)
|
|
|
|
|
+
|
|
|
|
|
+**模式:** 工具开发 → 真实 E2E 测试验证 → 稳定性验证
|
|
|
|
|
|
|
|
**交付物:**
|
|
**交付物:**
|
|
|
-- `uploadFileToField()` - 文件上传工具
|
|
|
|
|
- `fillMultiStepForm()`, `scrollToSection()` - 表单辅助工具
|
|
- `fillMultiStepForm()`, `scrollToSection()` - 表单辅助工具
|
|
|
-- `addDynamicListItem()`, `deleteDynamicListItem()` - 动态列表工具
|
|
|
|
|
-- `handleDialog()`, `waitForDialogClosed()`, `cancelDialog()` - 对话框工具
|
|
|
|
|
-- Fixtures 目录结构示例
|
|
|
|
|
- 单元测试
|
|
- 单元测试
|
|
|
|
|
+- 在残疾人管理测试中验证
|
|
|
|
|
+- 稳定性验证
|
|
|
|
|
+
|
|
|
|
|
+**FRs covered:** FR11-FR15, FR46-FR50 (部分), FR41-FR45 (部分)
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
|
|
|
-**FRs covered:** FR7-FR24, FR46-FR50
|
|
|
|
|
|
|
+### Epic 5: 列表和对话框工具开发与验证
|
|
|
|
|
+
|
|
|
|
|
+**目标:** 开发动态列表和对话框工具并在真实 E2E 测试中验证。
|
|
|
|
|
+
|
|
|
|
|
+**状态:** Backlog (等待 Epic 4 完成)
|
|
|
|
|
+
|
|
|
|
|
+**模式:** 工具开发 → 真实 E2E 测试验证 → 稳定性验证
|
|
|
|
|
+
|
|
|
|
|
+**交付物:**
|
|
|
|
|
+- `addDynamicListItem()`, `deleteDynamicListItem()` - 动态列表工具
|
|
|
|
|
+- `handleDialog()`, `waitForDialogClosed()` - 对话框工具
|
|
|
|
|
+- 单元测试
|
|
|
|
|
+- 在残疾人管理测试中验证
|
|
|
|
|
+- 稳定性验证
|
|
|
|
|
|
|
|
-**用户价值:**
|
|
|
|
|
-- 完整的工具集覆盖所有常见测试场景
|
|
|
|
|
-- 统一的 API 设计和错误处理
|
|
|
|
|
-- 支持可配置和扩展
|
|
|
|
|
|
|
+**FRs covered:** FR16-FR24, FR46-FR50 (部分), FR41-FR45 (部分)
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Epic 3: 在残疾人管理中验证工具包
|
|
|
|
|
|
|
+### Epic 6: 完整验证(残疾人管理)
|
|
|
|
|
+
|
|
|
|
|
+**目标:** 工具包在真实的残疾人管理 E2E 测试中完整验证,证明所有工具函数可用且稳定。
|
|
|
|
|
|
|
|
-**目标:** 工具包在真实的残疾人管理 E2E 测试中验证,证明工具函数可用且稳定,提供完整的参考示例。
|
|
|
|
|
|
|
+**状态:** Backlog (等待 Epic 5 完成)
|
|
|
|
|
|
|
|
**交付物:**
|
|
**交付物:**
|
|
|
-- 残疾人管理 E2E 测试(使用工具函数)
|
|
|
|
|
-- 照片上传功能测试
|
|
|
|
|
-- 银行卡管理功能测试
|
|
|
|
|
-- 备注功能测试
|
|
|
|
|
-- 回访功能测试
|
|
|
|
|
-- 完整流程测试
|
|
|
|
|
|
|
+- 残疾人管理完整流程测试(使用所有工具)
|
|
|
- 稳定性验证(20次连续运行 100% 通过)
|
|
- 稳定性验证(20次连续运行 100% 通过)
|
|
|
|
|
|
|
|
**FRs covered:** FR38, FR41-FR45
|
|
**FRs covered:** FR38, FR41-FR45
|
|
|
|
|
|
|
|
-**用户价值:**
|
|
|
|
|
-- 验证工具包的可用性和稳定性
|
|
|
|
|
-- 提供完整的参考示例
|
|
|
|
|
-- 证明工具包符合性能标准
|
|
|
|
|
-
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Epic 4: 完善文档与开发者体验
|
|
|
|
|
|
|
+### Epic 7: 完善文档与开发者体验
|
|
|
|
|
|
|
|
**目标:** 测试开发者可以在 30 分钟内上手使用工具包,有完整的文档、示例和迁移指南。
|
|
**目标:** 测试开发者可以在 30 分钟内上手使用工具包,有完整的文档、示例和迁移指南。
|
|
|
|
|
|
|
|
|
|
+**状态:** Backlog (等待 Epic 6 完成)
|
|
|
|
|
+
|
|
|
**交付物:**
|
|
**交付物:**
|
|
|
- 完整的 README(安装、快速入门、API 文档)
|
|
- 完整的 README(安装、快速入门、API 文档)
|
|
|
-- 每个工具函数的详细使用示例
|
|
|
|
|
-- 迁移指南(从现有测试代码到工具函数)
|
|
|
|
|
-- 常见问题和解决方案
|
|
|
|
|
-- 残疾人管理测试作为完整示例
|
|
|
|
|
-- JSDoc 完整注释
|
|
|
|
|
|
|
+- VS Code snippets
|
|
|
|
|
+- 迁移指南
|
|
|
|
|
|
|
|
**FRs covered:** FR33-FR40
|
|
**FRs covered:** FR33-FR40
|
|
|
|
|
|
|
|
-**用户价值:**
|
|
|
|
|
-- 快速上手(30 分钟内编写第一个测试)
|
|
|
|
|
-- 清晰的文档和示例
|
|
|
|
|
-- 降低学习曲线
|
|
|
|
|
-- 便于团队采用
|
|
|
|
|
-
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
## Epic 1: 测试工具包基础框架与 Select 支持
|
|
## Epic 1: 测试工具包基础框架与 Select 支持
|
|
@@ -655,17 +702,40 @@ Error: Radix Select 等待超时
|
|
|
- 9/10 次通过 = 90% 稳定性,需要分析失败原因 ⚠️
|
|
- 9/10 次通过 = 90% 稳定性,需要分析失败原因 ⚠️
|
|
|
- < 9/10 次通过 = 稳定性不足,需要修复 ❌
|
|
- < 9/10 次通过 = 稳定性不足,需要修复 ❌
|
|
|
|
|
|
|
|
|
|
+**Epic 2 状态:** ✅ Done
|
|
|
|
|
+**回顾文档:** `_bmad-output/implementation-artifacts/epic-2-retrospective.md`
|
|
|
|
|
+
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-## Epic 3: 扩展工具集(文件上传、表单、列表、对话框)
|
|
|
|
|
|
|
+## Epic 3: 文件上传工具开发与验证
|
|
|
|
|
+
|
|
|
|
|
+**目标:** 遵循 Epic 2 的成功模式,开发文件上传工具并在 `web/tests/e2e/` 的真实测试中验证,解决当前测试超时阻塞问题。
|
|
|
|
|
+
|
|
|
|
|
+**背景:**
|
|
|
|
|
+- Epic 1 和 Epic 2 已证明"先验证再扩展"策略的有效性
|
|
|
|
|
+- 当前残疾人管理测试在文件上传阶段超时(60秒),阻塞了完整验证
|
|
|
|
|
+- 优先开发文件上传工具,解决当前阻塞问题
|
|
|
|
|
+
|
|
|
|
|
+**范围:**
|
|
|
|
|
+- ✅ 开发文件上传工具 `uploadFileToField()`
|
|
|
|
|
+- ✅ 编写单元测试(Vitest)
|
|
|
|
|
+- ✅ 在 `web/tests/e2e/` 中验证工具
|
|
|
|
|
+- ✅ 收集反馈并修复问题
|
|
|
|
|
+- ✅ 稳定性验证(10次连续运行)
|
|
|
|
|
+
|
|
|
|
|
+**模式:** 工具开发 → 真实 E2E 测试验证 → 问题修复 → 稳定性验证
|
|
|
|
|
|
|
|
-**目标:** 测试开发者可以使用完整的 6 个核心工具函数,覆盖所有常见 E2E 测试场景。
|
|
|
|
|
|
|
+**依赖:**
|
|
|
|
|
+- Epic 1: ✅ 已完成(类型定义、错误处理、基础设施)
|
|
|
|
|
|
|
|
-**说明:** 本 Epic 原 Epic 2,已在 Epic 2 完成后重新编号。
|
|
|
|
|
|
|
+**验收标准:**
|
|
|
|
|
+1. 文件上传工具在至少 3 处真实 E2E 测试中使用
|
|
|
|
|
+2. 所有测试连续运行 10 次,100% 通过率
|
|
|
|
|
+3. 测试超时问题已解决
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Story 3.1: 实现文件上传工具
|
|
|
|
|
|
|
+### Story 3.1: 开发文件上传工具函数
|
|
|
|
|
|
|
|
作为测试开发者,
|
|
作为测试开发者,
|
|
|
我想要使用 `uploadFileToField()` 函数上传文件,
|
|
我想要使用 `uploadFileToField()` 函数上传文件,
|
|
@@ -680,10 +750,146 @@ Error: Radix Select 等待超时
|
|
|
**And** 支持相对路径(相对于 fixtures 目录)
|
|
**And** 支持相对路径(相对于 fixtures 目录)
|
|
|
**And** 错误时提供清晰消息(文件路径、选择器、失败原因)
|
|
**And** 错误时提供清晰消息(文件路径、选择器、失败原因)
|
|
|
**And** 操作在 5 秒内完成(NFR9)
|
|
**And** 操作在 5 秒内完成(NFR9)
|
|
|
|
|
+**And** 配置对象继承 `BaseOptions`
|
|
|
|
|
+
|
|
|
|
|
+**函数签名:**
|
|
|
|
|
+```typescript
|
|
|
|
|
+export async function uploadFileToField(
|
|
|
|
|
+ page: Page,
|
|
|
|
|
+ selector: string,
|
|
|
|
|
+ fileName: string,
|
|
|
|
|
+ options?: FileUploadOptions
|
|
|
|
|
+): Promise<void>
|
|
|
|
|
+
|
|
|
|
|
+export interface FileUploadOptions extends BaseOptions {
|
|
|
|
|
+ /** fixtures 目录路径,默认为 'tests/fixtures' */
|
|
|
|
|
+ fixturesDir?: string;
|
|
|
|
|
+ /** 是否等待上传完成,默认为 true */
|
|
|
|
|
+ waitForUpload?: boolean;
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**参考架构决策:**
|
|
|
|
|
+- 遵循 `docs/standards/e2e-radix-testing.md` 中的文件上传规范
|
|
|
|
|
+- 使用 `DEFAULT_TIMEOUTS` 常量定义超时
|
|
|
|
|
+- 错误处理使用 `E2ETestError` 和 `ErrorContext`
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Story 3.2: 实现表单辅助工具
|
|
|
|
|
|
|
+### Story 3.2: 编写文件上传单元测试
|
|
|
|
|
+
|
|
|
|
|
+作为测试开发者,
|
|
|
|
|
+我想要文件上传工具有充分的单元测试,
|
|
|
|
|
+以便确保函数的正确性和稳定性。
|
|
|
|
|
+
|
|
|
|
|
+**验收标准:**
|
|
|
|
|
+
|
|
|
|
|
+**Given** 文件上传工具函数已实现
|
|
|
|
|
+**When** 创建 `tests/unit/file-upload.test.ts`
|
|
|
|
|
+**Then** 测试覆盖率 ≥ 80%(NFR29)
|
|
|
|
|
+**And** 测试用例包括:成功上传、文件不存在、选择器无效、超时
|
|
|
|
|
+**And** 使用 Vitest 运行测试
|
|
|
|
|
+**And** 所有测试通过
|
|
|
|
|
+
|
|
|
|
|
+**⚠️ Epic 2 关键经验应用:**
|
|
|
|
|
+- 单元测试无法发现真实 DOM 问题,但可验证基本逻辑
|
|
|
|
|
+- 必须添加集成测试使用真实 Playwright API
|
|
|
|
|
+- 使用 Playwright Page mock 验证文件上传逻辑
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+### Story 3.3: 在 web/tests/e2e 中验证文件上传工具
|
|
|
|
|
+
|
|
|
|
|
+作为测试开发者,
|
|
|
|
|
+我想要在 `web/tests/e2e/` 的残疾人管理测试中使用文件上传工具,
|
|
|
|
|
+以便验证工具在真实场景中的可用性。
|
|
|
|
|
+
|
|
|
|
|
+**验收标准:**
|
|
|
|
|
+
|
|
|
|
|
+**Given** 文件上传工具和单元测试已完成
|
|
|
|
|
+**When** 在 `web/tests/e2e/specs/admin/disability-person-complete.spec.ts` 中使用工具
|
|
|
|
|
+**Then** 至少迁移 3 处文件上传操作(身份证照片、残疾证照片)
|
|
|
|
|
+**And** 移除原有的自定义文件上传方法
|
|
|
|
|
+**And** 测试在真实浏览器中通过
|
|
|
|
|
+**And** 无测试超时问题
|
|
|
|
|
+
|
|
|
|
|
+**验证场景:**
|
|
|
|
|
+- 身份证照片上传(正面、反面)
|
|
|
|
|
+- 残疾证照片上传
|
|
|
|
|
+- 个人照片上传(如果有)
|
|
|
|
|
+
|
|
|
|
|
+**参考 Epic 2.2-2.3 的迁移模式:**
|
|
|
|
|
+- 渐进式迁移:先迁移部分测试
|
|
|
|
|
+- 保留原有方法作为 TODO 备份
|
|
|
|
|
+- 验证通过后再完全替换
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+### Story 3.4: 收集反馈并修复问题
|
|
|
|
|
+
|
|
|
|
|
+作为测试开发者,
|
|
|
|
|
+我想要运行使用文件上传工具的测试并收集反馈,
|
|
|
|
|
+以便发现潜在问题并改进工具。
|
|
|
|
|
+
|
|
|
|
|
+**验收标准:**
|
|
|
|
|
+
|
|
|
|
|
+**Given** 文件上传工具已在真实测试中使用
|
|
|
|
|
+**When** 运行完整的 E2E 测试套件
|
|
|
|
|
+**Then** 记录所有问题(失败的测试、错误消息、使用体验)
|
|
|
|
|
+**Then** 分类问题:工具 bug vs 使用错误 vs 改进建议
|
|
|
|
|
+**And** 所有标记为"工具 bug"的问题已修复
|
|
|
|
|
+**And** 测试连续运行 5 次通过
|
|
|
|
|
+**And** 无 flaky 失败
|
|
|
|
|
+
|
|
|
|
|
+**优先级:**
|
|
|
|
|
+- HIGH: 影响测试结果的问题(如上传失败、超时)
|
|
|
|
|
+- MEDIUM: 影响开发体验的问题(如错误消息不清晰)
|
|
|
|
|
+- LOW: 优化建议(如性能改进)
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+### Story 3.5: 文件上传稳定性验证
|
|
|
|
|
+
|
|
|
|
|
+作为测试开发者,
|
|
|
|
|
+我想要验证文件上传工具的稳定性,
|
|
|
|
|
+以便确保工具可以可靠地使用。
|
|
|
|
|
+
|
|
|
|
|
+**验收标准:**
|
|
|
|
|
+
|
|
|
|
|
+**Given** 所有问题已修复
|
|
|
|
|
+**When** 连续运行文件上传相关测试 10 次
|
|
|
|
|
+**Then** 所有测试 100% 通过
|
|
|
|
|
+**And** 无超时失败
|
|
|
|
|
+**And** 平均执行时间 ≤ 5 秒/文件
|
|
|
|
|
+
|
|
|
|
|
+**测试场景:**
|
|
|
|
|
+- `pnpm test:e2e:chromium disability-person-complete.spec.ts` 运行 10 次
|
|
|
|
|
+- 重点验证文件上传相关步骤
|
|
|
|
|
+
|
|
|
|
|
+**成功标准:**
|
|
|
|
|
+- 10/10 次通过 = 100% 稳定性 ✅
|
|
|
|
|
+- 9/10 次通过 = 90% 稳定性,需要分析失败原因 ⚠️
|
|
|
|
|
+- < 9/10 次通过 = 稳定性不足,需要修复 ❌
|
|
|
|
|
+
|
|
|
|
|
+**Epic 3 回顾:**
|
|
|
|
|
+- 如果 100% 通过,可以进入 Epic 4
|
|
|
|
|
+- 如果 < 100%,需要分析并修复问题后再验证
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## Epic 4: 表单工具开发与验证
|
|
|
|
|
+
|
|
|
|
|
+**目标:** 开发表单辅助工具并在 `web/tests/e2e/` 的真实测试中验证。
|
|
|
|
|
+
|
|
|
|
|
+**说明:** 遵循 Epic 2 和 Epic 3 的成功模式。
|
|
|
|
|
+
|
|
|
|
|
+**依赖:** Epic 3 完成
|
|
|
|
|
+
|
|
|
|
|
+**模式:** 工具开发 → 真实 E2E 测试验证 → 稳定性验证
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+### Story 4.1: 开发表单辅助工具函数
|
|
|
|
|
|
|
|
作为测试开发者,
|
|
作为测试开发者,
|
|
|
我想要使用 `fillMultiStepForm()` 和 `scrollToSection()` 函数,
|
|
我想要使用 `fillMultiStepForm()` 和 `scrollToSection()` 函数,
|
|
@@ -700,157 +906,158 @@ Error: Radix Select 等待超时
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Story 3.3: 实现动态列表工具
|
|
|
|
|
|
|
+### Story 4.2: 编写表单工具单元测试
|
|
|
|
|
|
|
|
作为测试开发者,
|
|
作为测试开发者,
|
|
|
-我想要使用 `addDynamicListItem()` 和 `deleteDynamicListItem()` 函数,
|
|
|
|
|
-以便测试银行卡管理、备注管理等动态列表功能。
|
|
|
|
|
|
|
+我想要表单工具有充分的单元测试,
|
|
|
|
|
+以便确保函数的正确性和稳定性。
|
|
|
|
|
|
|
|
**验收标准:**
|
|
**验收标准:**
|
|
|
|
|
|
|
|
-**Given** 类型定义已存在
|
|
|
|
|
-**When** 实现 `src/dynamic-list.ts` 中的动态列表函数
|
|
|
|
|
-**Then** `addDynamicListItem(page, itemType, data)` 添加新列表项
|
|
|
|
|
-**And** `deleteDynamicListItem(page, itemType, index)` 删除指定索引的项
|
|
|
|
|
-**And** 支持不同类型列表项(银行卡、备注等)
|
|
|
|
|
-**And** 验证列表状态变化
|
|
|
|
|
-**And** 处理异步更新场景
|
|
|
|
|
|
|
+**Given** 表单辅助工具函数已实现
|
|
|
|
|
+**When** 创建 `tests/unit/form-helper.test.ts`
|
|
|
|
|
+**Then** 测试覆盖率 ≥ 80%(NFR29)
|
|
|
|
|
+**And** 测试用例包括:成功填写、滚动操作、验证错误等
|
|
|
|
|
+**And** 使用 Vitest 运行测试
|
|
|
|
|
+**And** 所有测试通过
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Story 3.4: 实现对话框操作工具
|
|
|
|
|
|
|
+### Story 4.3: 在 web/tests/e2e 中验证表单工具
|
|
|
|
|
|
|
|
作为测试开发者,
|
|
作为测试开发者,
|
|
|
-我想要使用 `handleDialog()`, `waitForDialogClosed()`, `cancelDialog()` 函数,
|
|
|
|
|
-以便统一操作 Radix UI Dialog。
|
|
|
|
|
|
|
+我想要在残疾人管理测试中使用表单辅助工具,
|
|
|
|
|
+以便验证工具在真实场景中的可用性。
|
|
|
|
|
|
|
|
**验收标准:**
|
|
**验收标准:**
|
|
|
|
|
|
|
|
-**Given** 类型定义已存在
|
|
|
|
|
-**When** 实现 `src/dialog.ts` 中的对话框操作函数
|
|
|
|
|
-**Then** `handleDialog(page, action)` 支持 confirm/cancel/close 操作
|
|
|
|
|
-**And** `waitForDialogClosed(page)` 等待对话框完全关闭
|
|
|
|
|
-**And** `cancelDialog(page)` 提供取消操作的快捷方式
|
|
|
|
|
-**And** 理解 Radix UI Dialog 的 DOM 结构(`role="dialog"`)
|
|
|
|
|
-**And** 等待对话框关闭后再继续后续操作
|
|
|
|
|
|
|
+**Given** 表单工具和单元测试已完成
|
|
|
|
|
+**When** 在残疾人管理测试中使用工具
|
|
|
|
|
+**Then** 验证多步骤表单填写
|
|
|
|
|
+**And** 验证滚动操作
|
|
|
|
|
+**And** 测试在真实浏览器中通过
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Story 3.5: 更新主导出和 Fixtures 示例
|
|
|
|
|
|
|
+### Story 4.4: 表单稳定性验证
|
|
|
|
|
|
|
|
作为测试开发者,
|
|
作为测试开发者,
|
|
|
-我想要可以导入所有新增的工具函数,
|
|
|
|
|
-并参考 Fixtures 目录结构示例。
|
|
|
|
|
|
|
+我想要验证表单工具的稳定性,
|
|
|
|
|
+以便确保工具可以可靠地使用。
|
|
|
|
|
|
|
|
**验收标准:**
|
|
**验收标准:**
|
|
|
|
|
|
|
|
-**Given** 所有扩展工具函数已实现
|
|
|
|
|
-**When** 更新 `src/index.ts` 和创建 Fixtures 目录示例
|
|
|
|
|
-**Then** `index.ts` 导出所有新函数(uploadFileToField, fillMultiStepForm 等)
|
|
|
|
|
-**And** 创建 `tests/fixtures/` 目录结构示例
|
|
|
|
|
-**And** Fixtures 包含 `images/` 和 `documents/` 子目录
|
|
|
|
|
-**And** 提供示例测试文件(sample-id-card.jpg 等)
|
|
|
|
|
-**And** 所有函数有完整的 JSDoc 注释
|
|
|
|
|
|
|
+**Given** 所有问题已修复
|
|
|
|
|
+**When** 连续运行表单相关测试 10 次
|
|
|
|
|
+**Then** 所有测试 100% 通过
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Story 3.6: 扩展工具集单元测试
|
|
|
|
|
|
|
+## Epic 5: 列表和对话框工具开发与验证
|
|
|
|
|
|
|
|
-作为测试开发者,
|
|
|
|
|
-我想要所有扩展工具函数有充分的单元测试,
|
|
|
|
|
-以便确保函数的正确性和稳定性。
|
|
|
|
|
|
|
+**目标:** 开发动态列表和对话框工具并在 `web/tests/e2e/` 的真实测试中验证。
|
|
|
|
|
|
|
|
-**验收标准:**
|
|
|
|
|
|
|
+**说明:** 遵循 Epic 2-4 的成功模式。
|
|
|
|
|
|
|
|
-**Given** 扩展工具函数已实现
|
|
|
|
|
-**When** 创建 `tests/unit/` 下的测试文件
|
|
|
|
|
-**Then** 测试覆盖率 ≥ 80%(NFR29)
|
|
|
|
|
-**And** 测试文件包括:file-upload.test.ts, form-helper.test.ts, dynamic-list.test.ts, dialog.test.ts
|
|
|
|
|
-**And** 每个函数的成功和失败场景都有测试
|
|
|
|
|
-**And** 使用 Vitest 运行,所有测试通过
|
|
|
|
|
|
|
+**依赖:** Epic 4 完成
|
|
|
|
|
+
|
|
|
|
|
+**模式:** 工具开发 → 真实 E2E 测试验证 → 稳定性验证
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-## Epic 4: 在残疾人管理中验证工具包
|
|
|
|
|
|
|
+### Story 5.1: 开发动态列表和对话框工具函数
|
|
|
|
|
|
|
|
-**目标:** 工具包在真实的残疾人管理 E2E 测试中验证,证明工具函数可用且稳定,提供完整的参考示例。
|
|
|
|
|
|
|
+作为测试开发者,
|
|
|
|
|
+我想要使用 `addDynamicListItem()`、`deleteDynamicListItem()` 和对话框工具,
|
|
|
|
|
+以便测试银行卡管理、备注管理等动态列表功能。
|
|
|
|
|
|
|
|
-**说明:** 本 Epic 原 Epic 3,已在 Epic 2 完成后重新编号。
|
|
|
|
|
|
|
+**验收标准:**
|
|
|
|
|
|
|
|
-**注意:** 原 Epic 3 的范围需要调整,因为 Epic 2 已涵盖 Select 工具的验证。
|
|
|
|
|
|
|
+**Given** 类型定义已存在
|
|
|
|
|
+**When** 实现 `src/dynamic-list.ts` 和 `src/dialog.ts` 中的函数
|
|
|
|
|
+**Then** `addDynamicListItem(page, itemType, data)` 添加新列表项
|
|
|
|
|
+**And** `deleteDynamicListItem(page, itemType, index)` 删除指定索引的项
|
|
|
|
|
+**And** `handleDialog(page, action)` 支持 confirm/cancel/close 操作
|
|
|
|
|
+**And** `waitForDialogClosed(page)` 等待对话框完全关闭
|
|
|
|
|
+**And** 支持不同类型列表项(银行卡、备注等)
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Story 4.2: 照片上传功能测试(使用现有测试)
|
|
|
|
|
|
|
+### Story 5.2: 编写列表和对话框单元测试
|
|
|
|
|
|
|
|
作为测试开发者,
|
|
作为测试开发者,
|
|
|
-我想要在现有的残疾人管理 E2E 测试中使用文件上传工具,
|
|
|
|
|
-以便验证 `uploadFileToField()` 的可用性。
|
|
|
|
|
|
|
+我想要列表和对话框工具有充分的单元测试,
|
|
|
|
|
+以便确保函数的正确性和稳定性。
|
|
|
|
|
|
|
|
**验收标准:**
|
|
**验收标准:**
|
|
|
|
|
|
|
|
-**Given** Epic 3 已完成,文件上传工具已实现
|
|
|
|
|
-**When** 在 `web/tests/e2e/specs/admin/disability-person-complete.spec.ts` 中使用 `uploadFileToField()`
|
|
|
|
|
-**Then** 上传身份证照片(正面、反面)
|
|
|
|
|
-**And** 上传残疾证照片
|
|
|
|
|
-**And** 验证文件上传成功
|
|
|
|
|
-**And** 测试使用 `web/tests/e2e/fixtures/images/` 中的示例文件
|
|
|
|
|
|
|
+**Given** 列表和对话框工具函数已实现
|
|
|
|
|
+**When** 创建 `tests/unit/dynamic-list.test.ts` 和 `dialog.test.ts`
|
|
|
|
|
+**Then** 测试覆盖率 ≥ 80%(NFR29)
|
|
|
|
|
+**And** 测试用例包括:添加、删除、打开/关闭对话框等
|
|
|
|
|
+**And** 使用 Vitest 运行测试
|
|
|
|
|
+**And** 所有测试通过
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Story 4.3: 银行卡管理功能测试(使用现有测试)
|
|
|
|
|
|
|
+### Story 5.3: 在 web/tests/e2e 中验证列表和对话框工具
|
|
|
|
|
|
|
|
作为测试开发者,
|
|
作为测试开发者,
|
|
|
-我想要在现有的残疾人管理 E2E 测试中使用动态列表和对话框工具,
|
|
|
|
|
-以便验证这些工具的可用性。
|
|
|
|
|
|
|
+我想要在残疾人管理测试中使用列表和对话框工具,
|
|
|
|
|
+以便验证工具在真实场景中的可用性。
|
|
|
|
|
|
|
|
**验收标准:**
|
|
**验收标准:**
|
|
|
|
|
|
|
|
-**Given** Epic 3 已完成,对话框和动态列表工具已实现
|
|
|
|
|
-**When** 在现有测试中使用 `handleDialog()`, `addDynamicListItem()`, `deleteDynamicListItem()`
|
|
|
|
|
-**Then** 打开添加银行卡对话框
|
|
|
|
|
-**And** 填写银行卡信息(银行名称、卡号、持卡人)
|
|
|
|
|
-**And** 添加银行卡到列表
|
|
|
|
|
-**And** 验证列表状态变化
|
|
|
|
|
|
|
+**Given** 列表和对话框工具及单元测试已完成
|
|
|
|
|
+**When** 在残疾人管理测试中使用工具
|
|
|
|
|
+**Then** 验证银行卡管理(添加、删除)
|
|
|
|
|
+**And** 验证备注管理
|
|
|
|
|
+**And** 测试在真实浏览器中通过
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Story 4.4: 备注和回访功能测试(使用现有测试)
|
|
|
|
|
|
|
+### Story 5.4: 列表和对话框稳定性验证
|
|
|
|
|
|
|
|
作为测试开发者,
|
|
作为测试开发者,
|
|
|
-我想要在现有的残疾人管理 E2E 测试中使用表单辅助工具,
|
|
|
|
|
-以便验证表单工具的综合使用。
|
|
|
|
|
|
|
+我想要验证列表和对话框工具的稳定性,
|
|
|
|
|
+以便确保工具可以可靠地使用。
|
|
|
|
|
|
|
|
**验收标准:**
|
|
**验收标准:**
|
|
|
|
|
|
|
|
-**Given** Epic 3 已完成,表单辅助工具已实现
|
|
|
|
|
-**When** 在现有测试中使用 `fillMultiStepForm()`, `scrollToSection()`
|
|
|
|
|
-**Then** 填写备注表单
|
|
|
|
|
-**And** 滚动到回访区域
|
|
|
|
|
-**And** 添加备注到列表
|
|
|
|
|
-**And** 验证表单提交和列表更新
|
|
|
|
|
|
|
+**Given** 所有问题已修复
|
|
|
|
|
+**When** 连续运行列表和对话框相关测试 10 次
|
|
|
|
|
+**Then** 所有测试 100% 通过
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## Epic 6: 完整验证(残疾人管理)
|
|
|
|
|
+
|
|
|
|
|
+**目标:** 工具包在真实的残疾人管理 E2E 测试中完整验证,证明所有工具函数可用且稳定。
|
|
|
|
|
+
|
|
|
|
|
+**依赖:** Epic 5 完成
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Story 4.5: 完整流程验证
|
|
|
|
|
|
|
+### Story 6.1: 完整流程测试
|
|
|
|
|
|
|
|
作为测试开发者,
|
|
作为测试开发者,
|
|
|
-我想要在现有的完整流程测试中使用所有工具,
|
|
|
|
|
|
|
+我想要在残疾人管理完整流程测试中使用所有工具,
|
|
|
以便演示所有工具函数的综合使用。
|
|
以便演示所有工具函数的综合使用。
|
|
|
|
|
|
|
|
**验收标准:**
|
|
**验收标准:**
|
|
|
|
|
|
|
|
-**Given** Epic 2-4 的所有工具已在部分测试中验证
|
|
|
|
|
|
|
+**Given** Epic 1-5 的所有工具已实现并验证
|
|
|
**When** 确保 `disability-person-complete.spec.ts` 使用所有工具
|
|
**When** 确保 `disability-person-complete.spec.ts` 使用所有工具
|
|
|
**Then** 基本信息:使用 `selectRadixOption` 和 `selectRadixOptionAsync`
|
|
**Then** 基本信息:使用 `selectRadixOption` 和 `selectRadixOptionAsync`
|
|
|
-**And** 照片上传:使用 `uploadFileToField`
|
|
|
|
|
-**And** 银行卡管理:使用 `handleDialog`, `addDynamicListItem`, `deleteDynamicListItem`
|
|
|
|
|
-**And** 备注添加:使用 `fillMultiStepForm`, `scrollToSection`, `addDynamicListItem`
|
|
|
|
|
|
|
+**And** 照片上传:使用 `uploadFileToField` (来自 Epic 3)
|
|
|
|
|
+**And** 表单操作:使用 `fillMultiStepForm`, `scrollToSection` (来自 Epic 4)
|
|
|
|
|
+**And** 银行卡管理:使用 `handleDialog`, `addDynamicListItem`, `deleteDynamicListItem` (来自 Epic 5)
|
|
|
|
|
+**And** 备注添加:使用 `addDynamicListItem` (来自 Epic 5)
|
|
|
**And** 所有测试通过
|
|
**And** 所有测试通过
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Story 4.6: 稳定性测试(使用现有测试)
|
|
|
|
|
|
|
+### Story 6.2: 稳定性测试
|
|
|
|
|
|
|
|
作为测试开发者,
|
|
作为测试开发者,
|
|
|
我想要有稳定性测试验证工具包的可靠性,
|
|
我想要有稳定性测试验证工具包的可靠性,
|
|
@@ -859,7 +1066,7 @@ Error: Radix Select 等待超时
|
|
|
**验收标准:**
|
|
**验收标准:**
|
|
|
|
|
|
|
|
**Given** 完整流程测试已编写
|
|
**Given** 完整流程测试已编写
|
|
|
-**When** 创建 `tests/stability/repeat-run.spec.ts`
|
|
|
|
|
|
|
+**When** 创建稳定性测试或运行现有测试 20 次
|
|
|
**Then** 测试连续运行 20 次完整流程
|
|
**Then** 测试连续运行 20 次完整流程
|
|
|
**And** 验证 100% 通过率(NFR1)
|
|
**And** 验证 100% 通过率(NFR1)
|
|
|
**And** 测试执行时间符合性能标准(NFR8-NFR11)
|
|
**And** 测试执行时间符合性能标准(NFR8-NFR11)
|
|
@@ -868,15 +1075,15 @@ Error: Radix Select 等待超时
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-## Epic 5: 完善文档与开发者体验
|
|
|
|
|
|
|
+## Epic 7: 完善文档与开发者体验
|
|
|
|
|
|
|
|
**目标:** 测试开发者可以在 30 分钟内上手使用工具包,有完整的文档、示例和迁移指南。
|
|
**目标:** 测试开发者可以在 30 分钟内上手使用工具包,有完整的文档、示例和迁移指南。
|
|
|
|
|
|
|
|
-**说明:** 本 Epic 原 Epic 4,已在 Epic 2 完成后重新编号。
|
|
|
|
|
|
|
+**依赖:** Epic 6 完成
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-### Story 5.1: 完善 README、API 文档和示例
|
|
|
|
|
|
|
+### Story 7.1: 完善 README、API 文档和示例
|
|
|
|
|
|
|
|
作为测试开发者,
|
|
作为测试开发者,
|
|
|
我想要有完整的 README 和 API 文档,
|
|
我想要有完整的 README 和 API 文档,
|
|
@@ -884,7 +1091,7 @@ Error: Radix Select 等待超时
|
|
|
|
|
|
|
|
**验收标准:**
|
|
**验收标准:**
|
|
|
|
|
|
|
|
-**Given** Epic 1-4 的所有功能已实现
|
|
|
|
|
|
|
+**Given** Epic 1-6 的所有功能已实现
|
|
|
**When** 完善 `README.md` 和 API 文档
|
|
**When** 完善 `README.md` 和 API 文档
|
|
|
**Then** README 包含:项目简介、安装说明、快速入门、API 文档
|
|
**Then** README 包含:项目简介、安装说明、快速入门、API 文档
|
|
|
**And** 每个工具函数都有完整的使用示例
|
|
**And** 每个工具函数都有完整的使用示例
|
|
@@ -894,4 +1101,21 @@ Error: Radix Select 等待超时
|
|
|
**And** 残疾人管理测试作为完整示例
|
|
**And** 残疾人管理测试作为完整示例
|
|
|
**And** 所有函数有完整的 JSDoc 注释
|
|
**And** 所有函数有完整的 JSDoc 注释
|
|
|
|
|
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+### Story 7.2: VS Code Snippets 和开发体验
|
|
|
|
|
+
|
|
|
|
|
+作为测试开发者,
|
|
|
|
|
+我想要有 VS Code 代码片段,
|
|
|
|
|
+以便加速测试开发。
|
|
|
|
|
+
|
|
|
|
|
+**验收标准:**
|
|
|
|
|
+
|
|
|
|
|
+**Given** README 和 API 文档已完成
|
|
|
|
|
+**When** 创建 VS Code snippets 配置
|
|
|
|
|
+**Then** 提供常用代码片段(selectRadixOption, uploadFileToField 等)
|
|
|
|
|
+**And** 片段有清晰的触发词和描述
|
|
|
|
|
+**And** 文档说明如何安装和使用 snippets
|
|
|
|
|
+**And** 开发者可以在 30 分钟内使用工具包编写第一个测试
|
|
|
|
|
+
|
|
|
|
|
|