Ver código fonte

docs(epic-13): 强化 Epic 13 持续验证测试开发流程

更新 Epic 13 及相关 Story 文档,明确 Playwright MCP 持续验证理念:

- **Story 13.1**: 更新 Tasks/Subtasks 和 Dev Notes,添加持续验证策略
- **Story 13.2**: 创建 Story 文档,包含完整持续验证流程说明
- **Epic 13**: 更新 Epic 描述,添加测试开发流程指导

核心变更:
1. 强调 Playwright MCP 应在整个开发过程中持续使用,而非仅任务0
2. 添加各阶段(EXPLORE/RED/GREEN/REFACTOR)具体使用策略
3. 对比传统流程与持续验证流程的效率和返工成本
4. 提供完整开发流程示例和关键要点

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname 3 dias atrás
pai
commit
a744f33911

+ 84 - 2
_bmad-output/implementation-artifacts/13-1-order-create-sync.md

@@ -70,8 +70,21 @@ Status: in-progress
 
 ## Tasks / Subtasks
 
-> **测试开发流程(增强的 TDD)**: 本 Story 采用 Playwright MCP 优先的测试开发流程。**任务 0 必须在任务 1-6 之前完成**,它为后续任务提供验证过的选择器、交互模式和测试骨架。
-
+> **测试开发流程(增强的 TDD + 持续验证)**: 本 Story 采用 Playwright MCP 持续验证的测试开发流程。
+>
+> **核心原则**:
+> 1. **即时验证**: 在开发过程中立即使用 Playwright MCP 验证,不等到专门的 E2E Story
+> 2. **持续反馈**: 每完成一个功能模块立即验证,快速发现问题
+> 3. **减少返工**: 早期发现问题可以减少后期返工成本
+>
+> **Playwright MCP 使用时机**:
+> - ✅ 任务 0: 探索页面结构、验证流程可行性
+> - ✅ 任务 1-3: 每写一个测试就用 MCP 验证选择器、页面结构
+> - ✅ 任务 4-5: 每实现一个功能就用 MCP 验证是否正常工作
+> - ✅ 任务 6: 重构后用 MCP 确保功能未破坏
+>
+> **任务 0 必须在任务 1-6 之前完成**,它为后续任务提供验证过的选择器和基础模式。
+>
 > **注意**: 已移除 WebSocket 相关任务(原任务 4),因为小程序和后端服务未采用 WebSocket。
 
 ### 阶段 1: EXPLORE - Playwright MCP 探索(RED 之前)
@@ -168,6 +181,75 @@ Status: in-progress
 
 ## Dev Notes
 
+### Playwright MCP 持续验证策略
+
+> **核心理念**: Playwright MCP 不应该只在任务0使用一次,而应该作为整个开发过程中的**持续验证工具**。
+
+#### 为什么需要持续验证?
+
+| 对比维度 | 传统流程(只在任务0用 MCP) | 持续验证流程(整个开发过程用 MCP) |
+|---------|---------------------------|--------------------------------|
+| 问题发现时机 | 运行完整测试套件时发现 | 几秒钟内立即发现 |
+| 反馈速度 | 分钟级(重新编译+运行测试) | 秒级(直接在 MCP 中验证) |
+| 调试效率 | 只看截图和日志 | 完整页面状态+交互式调试 |
+| 认知负担 | 频繁在"写代码"和"跑测试"间切换 | 保持开发心流,即时验证 |
+| 返工成本 | 高(写很多代码后才发现问题) | 低(每步验证后继续) |
+
+#### 各阶段的具体使用策略
+
+**阶段 1: EXPLORE(任务 0)** ✅ 已完成
+```
+目标: 探索页面结构、验证流程可行性
+操作: 完整走一遍测试流程,记录选择器
+输出: 验证过的选择器、测试骨架
+```
+
+**阶段 2: RED(任务 1-3 - 编写测试)**
+```
+每写一个测试用例 → 用 MCP 验证选择器 → 发现选择器错误 → 修复测试
+
+示例:
+1. 编写测试: await page.click('[data-testid="create-button"]');
+2. MCP 验证: 发现选择器不存在
+3. 修复测试: 改为正确的选择器
+4. 重新验证: 确认可以点击
+5. 继续编写下一步
+```
+
+**阶段 3: GREEN(任务 4-5 - 实现代码)**
+```
+每实现一个功能 → 用 MCP 验证功能 → 发现字段没同步 → 调整代码
+
+示例:
+1. 实现创建订单功能: orderManagementPage.createOrder(...)
+2. MCP 验证: 创建后小程序数据没显示
+3. 调查原因: 发现同步时间不够
+4. 优化等待: 增加轮询等待时间
+5. 重新验证: 确认数据同步成功
+```
+
+**阶段 4: REFACTOR(任务 6 - 优化代码)**
+```
+重构代码 → 用 MCP 确保功能未破坏 → 发现回归 → 回退或修复
+
+示例:
+1. 重构: 提取公共方法到基类
+2. MCP 验证: 所有功能仍然正常
+3. 完成: 提交重构代码
+```
+
+#### Playwright MCP vs 自动化测试
+
+| 场景 | 使用 Playwright MCP | 运行自动化测试 |
+|-----|-------------------|--------------|
+| 编写新测试前 | ✅ 探索页面结构 | |
+| 编写测试中 | ✅ 验证选择器、交互 | |
+| 实现功能中 | ✅ 验证功能正确性 | |
+| 修复 bug 时 | ✅ 验证修复效果 | |
+| 代码重构后 | ✅ 快速验证 | |
+| 提交前 | | ✅ 完整测试套件 |
+| CI/CD | | ✅ 完整测试套件 |
+
 ### Epic 13 背景和依赖
 
 **Epic 13: 跨端数据同步测试 (Epic E)**

+ 715 - 0
_bmad-output/implementation-artifacts/13-2-order-edit-sync.md

@@ -0,0 +1,715 @@
+# Story 13.2: 后台编辑订单 → 企业小程序验证
+
+Status: ready-for-dev
+
+<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
+
+## Story
+
+作为测试开发者,
+我想要验证后台编辑订单后企业小程序的数据同步,
+以便确保跨端数据更新的正确性和时效性。
+
+## Acceptance Criteria
+
+### AC1: 后台编辑订单基础流程
+**Given** 后台订单管理功能已完成(Epic 10)
+**When** 测试者在管理后台编辑已有订单
+**Then** 测试应验证以下功能:
+- 使用 OrderManagementPage 编辑测试订单
+- 修改订单名称、预计开始日期等字段
+- 更换平台或公司(如适用)
+- 验证订单在后台列表中显示更新后的信息
+- 获取编辑订单的 ID 和更新后的关键信息
+
+### AC2: 企业小程序数据同步验证
+**Given** 管理后台已编辑订单
+**When** 企业用户登录小程序
+**Then** 测试应验证以下功能:
+- 使用 EnterpriseMiniPage 登录企业小程序
+- 验证编辑后的订单在小程序订单列表中显示更新后的信息
+- 验证订单名称、状态、日期等字段已同步
+- 验证数据同步在合理时间内完成(≤ 10 秒)
+
+### AC3: 多字段编辑同步验证
+**Given** 订单支持多种字段编辑
+**When** 执行编辑操作
+**Then** 测试应验证以下场景:
+- 编辑订单基本信息(名称、日期)后验证小程序同步
+- 更换平台或公司后验证小程序同步
+- 批量编辑多个字段后验证小程序同步
+
+### AC4: 多 Page 对象管理
+**Given** 测试需要同时操作后台和小程序
+**When** 执行跨端测试
+**Then** 测试应满足以下要求:
+- 使用独立的 Page 对象管理后台和小程序
+- 正确管理多个 browser context 或 page
+- 确保测试之间不会相互干扰
+
+### AC5: 测试数据隔离和清理
+**Given** 跨端测试涉及多个系统
+**When** 执行测试
+**Then** 测试应遵循以下策略:
+- 测试前置条件:创建测试订单(用于编辑)
+- 编辑操作不影响其他订单数据
+- 测试后可选择清理或恢复测试数据
+- 验证编辑后小程序显示正确数据
+
+### AC6: 数据同步时效性验证
+**Given** 网络延迟和系统负载
+**When** 编辑订单后查询小程序
+**Then** 测试应验证以下场景:
+- 在正常情况下,数据应在 5 秒内同步
+- 支持轮询等待机制(最多等待 10 秒)
+- 验证超时情况下的错误处理
+
+### AC7: 代码质量标准
+**Given** 遵循项目测试规范
+**When** 编写测试代码
+**Then** 代码应符合以下标准:
+- 使用 TIMEOUTS 常量定义超时
+- 使用 data-testid 选择器(优先级高于文本选择器)
+- 测试文件命名:`order-edit-sync.spec.ts`
+- 完整的测试描述和注释
+- TypeScript 类型安全
+- 通过 `pnpm typecheck` 类型检查
+
+## Tasks / Subtasks
+
+> **测试开发流程(增强的 TDD + 持续验证)**: 本 Story 采用 Playwright MCP 持续验证的测试开发流程。
+>
+> **核心原则**:
+> 1. **即时验证**: 在开发过程中立即使用 Playwright MCP 验证,不等到专门的 E2E Story
+> 2. **持续反馈**: 每完成一个功能模块立即验证,快速发现问题
+> 3. **减少返工**: 早期发现问题可以减少后期返工成本
+>
+> **Playwright MCP 使用时机**:
+> - ✅ 任务 0: 探索页面结构、验证流程可行性
+> - ✅ 任务 1-4: 每写一个测试就用 MCP 验证选择器、页面结构
+> - ✅ 任务 5-6: 每实现一个功能就用 MCP 验证是否正常工作
+> - ✅ 任务 7: 重构后用 MCP 确保功能未破坏
+>
+> **任务 0 必须在任务 1-6 之前完成**,它为后续任务提供验证过的选择器和基础模式。
+
+### 阶段 1: EXPLORE - Playwright MCP 探索(RED 之前)
+
+- [ ] **任务 0: Playwright MCP 探索验证**
+  - [ ] 0.1 启动子代理使用 Playwright MCP 手动验证完整测试流程
+    - 后台:创建订单 → 编辑订单 → 验证列表更新
+    - 小程序:登录 → 导航到订单列表 → 验证编辑后的数据
+  - [ ] 0.2 记录验证的选择器(优先 data-testid,避免文本选择器)
+  - [ ] 0.3 记录交互模式(点击编辑、填写字段、保存、等待、页面跳转)
+  - [ ] 0.4 记录数据流(编辑 API 调用、请求/响应格式、同步时间)
+  - [ ] 0.5 立即修复发现的应用层 bug(如果有)
+  - [ ] 0.6 生成测试代码骨架(基于验证的流程)
+  - [ ] 0.7 将探索结果更新到本文档 Dev Notes 的"Playwright MCP 探索结果"部分
+
+### 阶段 2: RED - 编写测试(基于任务 0 的探索结果)
+
+- [ ] 任务 1: 创建跨端测试文件和基础设施 (AC: #4, #7)
+  - [ ] 1.1 基于任务 0 的探索结果创建 `web/tests/e2e/specs/cross-platform/order-edit-sync.spec.ts`
+  - [ ] 1.2 配置测试 fixtures(使用任务 0 验证过的选择器)
+  - [ ] 1.3 添加测试前置条件(创建测试订单用于编辑)
+
+- [ ] 任务 2: 实现后台编辑订单测试 (AC: #1)
+  - [ ] 2.1 使用任务 0 验证的选择器编写"后台编辑订单成功"测试
+  - [ ] 2.2 验证编辑后订单在后台列表中显示更新
+  - [ ] 2.3 获取并存储编辑后的订单数据
+
+- [ ] 任务 3: 实现企业小程序验证测试 (AC: #2)
+  - [ ] 3.1 使用任务 0 验证的选择器编写"企业小程序显示编辑后订单"测试
+  - [ ] 3.2 验证订单信息更新完整性
+  - [ ] 3.3 实现数据同步等待机制(基于任务 0 实测的同步时间)
+
+- [ ] 任务 4: 实现多字段编辑同步测试 (AC: #3)
+  - [ ] 4.1 编写测试验证基本信息编辑后小程序同步
+  - [ ] 4.2 编写测试验证平台/公司更换后小程序同步
+  - [ ] 4.3 编写测试验证批量编辑后小程序同步
+
+### 阶段 3: GREEN - 实现代码(让测试通过)
+
+- [ ] 任务 5: 实现测试数据清理策略 (AC: #5)
+  - [ ] 5.1 添加测试前置钩子创建测试订单
+  - [ ] 5.2 添加 afterEach 钩子清理或恢复测试数据
+  - [ ] 5.3 验证清理后数据正确
+
+- [ ] 任务 6: 实现数据同步时效性验证 (AC: #6)
+  - [ ] 6.1 实现轮询等待机制
+  - [ ] 6.2 验证正常同步时间(基于任务 0 的实测数据,应 ≤ 5 秒)
+  - [ ] 6.3 验证超时处理(最长 10 秒)
+
+### 阶段 4: REFACTOR - 优化代码质量
+
+- [ ] 任务 7: 验证代码质量 (AC: #7)
+  - [ ] 7.1 运行 `pnpm typecheck` 验证类型检查
+  - [ ] 7.2 运行测试确保所有测试通过
+  - [ ] 7.3 验证使用 data-testid 选择器(任务 0 已确认)
+
+## Dev Notes
+
+### Playwright MCP 持续验证策略
+
+> **核心理念**: Playwright MCP 不应该只在任务0使用一次,而应该作为整个开发过程中的**持续验证工具**。
+
+#### 为什么需要持续验证?
+
+| 对比维度 | 传统流程(只在任务0用 MCP) | 持续验证流程(整个开发过程用 MCP) |
+|---------|---------------------------|--------------------------------|
+| 问题发现时机 | 运行完整测试套件时发现 | 几秒钟内立即发现 |
+| 反馈速度 | 分钟级(重新编译+运行测试) | 秒级(直接在 MCP 中验证) |
+| 调试效率 | 只看截图和日志 | 完整页面状态+交互式调试 |
+| 认知负担 | 频繁在"写代码"和"跑测试"间切换 | 保持开发心流,即时验证 |
+| 返工成本 | 高(写很多代码后才发现问题) | 低(每步验证后继续) |
+
+#### 开发循环模式
+
+```
+┌─────────────────────────────────────────────────────────┐
+│                    持续验证循环                          │
+├─────────────────────────────────────────────────────────┤
+│                                                         │
+│   编写/修改代码                                          │
+│        ↓                                                │
+│   立即用 Playwright MCP 验证                             │
+│        ↓                                                │
+│   发现问题?                                            │
+│        ├── 是 → 修复代码 → 重新验证                      │
+│        └── 否 → 继续下一步                               │
+│                                                         │
+└─────────────────────────────────────────────────────────┘
+```
+
+#### 各阶段的具体使用策略
+
+**阶段 1: EXPLORE(任务 0)**
+```
+目标: 探索页面结构、验证流程可行性
+操作: 完整走一遍测试流程,记录选择器
+输出: 验证过的选择器、测试骨架
+```
+
+**阶段 2: RED(任务 1-4 - 编写测试)**
+```
+每写一个测试用例 → 用 MCP 验证选择器 → 发现选择器错误 → 修复测试
+
+示例:
+1. 编写测试: await page.click('[data-testid="edit-button"]');
+2. MCP 验证: 发现选择器不存在
+3. 修复测试: 改为正确的选择器
+4. 重新验证: 确认可以点击
+5. 继续编写下一步
+```
+
+**阶段 3: GREEN(任务 5-6 - 实现代码)**
+```
+每实现一个功能 → 用 MCP 验证功能 → 发现字段没同步 → 调整代码
+
+示例:
+1. 实现编辑功能: orderManagementPage.editOrder(...)
+2. MCP 验证: 编辑后小程序数据没更新
+3. 调查原因: 发现同步时间不够
+4. 优化等待: 增加轮询等待时间
+5. 重新验证: 确认数据同步成功
+```
+
+**阶段 4: REFACTOR(任务 7 - 优化代码)**
+```
+重构代码 → 用 MCP 确保功能未破坏 → 发现回归 → 回退或修复
+
+示例:
+1. 重构: 提取公共方法到基类
+2. MCP 验证: 所有功能仍然正常
+3. 完成: 提交重构代码
+```
+
+#### Playwright MCP vs 自动化测试
+
+| 场景 | 使用 Playwright MCP | 运行自动化测试 |
+|-----|-------------------|--------------|
+| 编写新测试前 | ✅ 探索页面结构 | |
+| 编写测试中 | ✅ 验证选择器、交互 | |
+| 实现功能中 | ✅ 验证功能正确性 | |
+| 修复 bug 时 | ✅ 验证修复效果 | |
+| 代码重构后 | ✅ 快速验证 | |
+| 提交前 | | ✅ 完整测试套件 |
+| CI/CD | | ✅ 完整测试套件 |
+
+#### 实际示例:完整开发流程
+
+```
+【任务 0】探索阶段
+├─ MCP 验证完整流程 ✓
+├─ 记录选择器 ✓
+└─ 生成测试骨架 ✓
+
+【任务 1】编写测试 - 测试 1
+├─ 编写测试代码
+├─ MCP 验证选择器 → 发现选择器错误
+├─ 修复选择器
+├─ MCP 重新验证 ✓
+└─ 继续下一个测试
+
+【任务 2】编写测试 - 测试 2
+├─ 编写测试代码
+├─ MCP 验证页面结构 → 发现字段名错误
+├─ 修复字段名
+├─ MCP 重新验证 ✓
+└─ 继续下一个测试
+
+【任务 5】实现功能
+├─ 实现 Page Object 方法
+├─ MCP 验证功能 → 发现数据没保存
+├─ 调查原因: 缺少等待
+├─ 添加等待逻辑
+├─ MCP 重新验证 ✓
+└─ 继续下一个功能
+
+【任务 7】重构代码
+├─ 提取公共方法
+├─ MCP 验证所有功能 ✓
+└─ 完成重构
+
+【提交前】完整测试套件
+└─ pnpm test:e2e:chromium ✓
+```
+
+#### 关键要点
+
+1. **不要等到所有代码写完才验证** - 每个小步骤都立即验证
+2. **MCP 是交互式调试工具** - 可以实时尝试不同的操作和选择器
+3. **自动化测试是回归保障** - 在 MCP 验证通过后,用自动化测试确保持续正确
+4. **两者互补,不是替代** - MCP 提供快速反馈,自动化测试提供稳定性
+
+### Epic 13 背景和依赖
+
+**Epic 13: 跨端数据同步测试 (Epic E)**
+
+- **目标**: 验证后台操作后小程序端的数据同步,覆盖完整的业务流程
+- **业务分组**: Epic E(跨端数据同步测试)
+- **背景**: 真实用户旅程跨越管理后台和小程序,需要验证数据同步的正确性和时效性
+- **依赖**:
+  - Epic 10: ✅ 已完成(订单管理 E2E 测试)
+  - Epic 12: 🔄 进行中(小程序登录测试)
+
+**Epic 13 Story 依赖关系:**
+```
+Story 13.1: 后台创建订单 → 企业小程序验证 ✅ 已完成
+Story 13.2: 后台编辑订单 → 企业小程序验证 ← 当前 Story
+Story 13.3: 后台添加人员 → 人才小程序验证
+Story 13.4: 后台更新状态 → 双小程序验证
+Story 13.5: 跨端测试稳定性验证
+Story 13.6: 首页看板数据联动专项测试
+```
+
+### Playwright MCP 探索结果(任务 0 完成后更新)
+
+> **注意**: 本部分需要在任务 0 完成后填充。以下是预期探索的内容模板。
+
+**测试目标**: 验证后台编辑订单后,企业小程序能否正确显示更新后的订单信息
+
+**测试结果**: (待任务 0 完成后填写)
+
+**数据同步时效性**:
+- 实际同步时间: (待任务 0 完成后填写)
+- 要求: ≤ 10 秒
+- 结论: (待任务 0 完成后填写)
+
+**后台选择器(已验证可用)**:
+| 功能 | data-testid |
+|------|-------------|
+| 编辑按钮 | (待任务 0 完成后填写) |
+| 订单名称输入框 | (待任务 0 完成后填写) |
+| 预计开始日期 | (待任务 0 完成后填写) |
+| 平台选择器 | `platform-selector-edit` |
+| 公司选择器 | `company-selector-edit` |
+| 保存提交按钮 | (待任务 0 完成后填写) |
+
+**小程序选择器(已验证可用)**:
+| 功能 | data-testid |
+|------|-------------|
+| 手机号输入框 | `mini-phone-input` |
+| 登录按钮 | `mini-login-button` |
+| 订单列表项 | (待任务 0 完成后填写) |
+| 订单详情 | (待任务 0 完成后填写) |
+
+**测试流程(已验证)**:
+1. 后台登录 → 导航到订单管理 → 点击已有订单的编辑按钮
+2. 修改订单信息(名称、日期等)→ 提交保存
+3. 验证后台列表显示更新后的信息
+4. 小程序登录 → 导航到订单列表 → 验证订单信息已更新
+5. 点击订单详情 → 验证详情页信息完整
+
+**关键发现(任务 0 完成后更新)**:
+- (待任务 0 完成后填写)
+
+**待解决问题**:
+- (待任务 0 完成后填写)
+
+### Previous Story Intelligence: Story 13.1
+
+从 Story 13.1(后台创建订单 → 企业小程序验证)中学习到的关键经验:
+
+**Playwright MCP 探索经验**:
+- 必须先验证完整流程再编写测试,避免反复调试选择器
+- 优先使用 `data-testid` 选择器,避免文本选择器
+- 记录实际数据同步时间,而非使用假设值
+
+**关键发现(Story 13.1 探索结果)**:
+1. **公司关联问题**: 小程序用户关联的公司必须与后台选择的公司一致,否则小程序看不到订单
+   - 测试用户 13800001111 关联公司: "测试公司_1768346782396"
+   - 解决方案: 测试代码必须选择正确的公司
+
+2. **对话框检测**: 使用 `text=选择残疾人` 检测对话框标题比 `[role="dialog"]` 更可靠
+   - 确认按钮使用 `confirm-batch-button` data-testid
+
+3. **数据同步时间**: 实际同步时间 < 1秒,远超 ≤ 10 秒的要求
+
+**测试代码模式(Story 13.1)**:
+```typescript
+// 使用多 Page 对象管理
+const orderManagementPage = new OrderManagementPage(adminPage);
+const enterpriseMiniPage = new EnterpriseMiniPage(miniPage);
+
+// 创建订单(编辑测试的前置条件)
+const orderData = {
+  name: `跨端测试订单_${Date.now()}`,
+  expectedStartDate: '2026-01-15',
+  platformId: 1,
+  companyId: 1, // 必须与小程序用户关联的公司一致
+};
+
+const result = await orderManagementPage.createOrder(orderData);
+```
+
+**已知问题(Story 13.1 剩余)**:
+- 残疾人选择后测试在后续步骤超时(待 Story 13.1 完成时修复)
+- 需要进一步调试表格行点击逻辑
+
+### Epic 10 关键经验(订单编辑)
+
+从已完成的 Epic 10 Story 10.5 中学习到的订单编辑模式:
+
+**OrderManagementPage 编辑方法**:
+```typescript
+// 编辑订单
+async editOrder(orderName: string, data: OrderData): Promise<FormSubmitResult>
+
+// 订单数据结构(编辑支持的字段)
+interface OrderData {
+  name?: string;              // 订单名称(可编辑)
+  expectedStartDate?: string; // 预计开始日期(可编辑)
+  platformId?: number;       // 平台ID(可编辑)
+  companyId?: number;        // 公司ID(可编辑)
+  channelId?: number;        // 渠道ID(可编辑)
+  status?: string;           // 订单状态(可编辑)
+  workStatus?: string;       // 工作状态(可编辑)
+}
+```
+
+**订单编辑测试场景(Epic 10 Story 10.5)**:
+1. **编辑订单基本信息**: 修改订单名称、预计开始日期
+2. **编辑订单关联信息**: 更换平台、公司、渠道
+3. **编辑后验证列表更新**: 编辑订单后返回列表,验证列表中显示更新后的信息
+
+**编辑测试文件参考**: `web/tests/e2e/specs/admin/order-edit.spec.ts`
+
+### Epic 12 关键经验(小程序登录)
+
+从已完成的 Epic 12 中学习到的小程序模式:
+
+**EnterpriseMiniPage 可用方法**:
+```typescript
+// 页面导航
+async goto(): Promise<void>
+async expectToBeVisible(): Promise<void>
+
+// 登录方法
+async login(phone: string, password: string): Promise<void>
+
+// Token 管理
+async getToken(): Promise<string | null>
+async setToken(token: string): Promise<void>
+async clearAuth(): Promise<void>
+
+// 订单列表(待实现)
+async getOrderList(): Promise<OrderData[]>
+async waitForOrderToAppear(orderName: string, timeout?: number): Promise<boolean>
+```
+
+**企业小程序登录流程**:
+```typescript
+await enterpriseMiniPage.goto();
+await enterpriseMiniPage.login(
+  '13800138000',  // 企业用户手机号
+  'password123'
+);
+await enterpriseMiniPage.expectLoginSuccess();
+```
+
+### 多 Page 对象管理策略
+
+**方案 1: 使用多个 Browser Context(推荐)**
+```typescript
+import { test as base } from '@playwright/test';
+
+type CrossPlatformFixtures = {
+  adminPage: Page;
+  miniPage: Page;
+  orderManagementPage: OrderManagementPage;
+  enterpriseMiniPage: EnterpriseMiniPage;
+};
+
+export const test = base.extend<CrossPlatformFixtures>({
+  adminPage: async ({ browser }, use) => {
+    const context = await browser.newContext();
+    const page = await context.newPage();
+    await use(page);
+    await context.close();
+  },
+  miniPage: async ({ browser }, use) => {
+    const context = await browser.newContext();
+    const page = await context.newPage();
+    await use(page);
+    await context.close();
+  },
+  orderManagementPage: async ({ adminPage }, use) => {
+    const page = new OrderManagementPage(adminPage);
+    await use(page);
+  },
+  enterpriseMiniPage: async ({ miniPage }, use) => {
+    const page = new EnterpriseMiniPage(miniPage);
+    await use(page);
+  },
+});
+```
+
+**方案 2: 使用单个 Browser Context,多个 Page(备选)**
+```typescript
+test('跨端数据同步测试', async ({ page }) => {
+  // 后台操作
+  const adminPage = page;
+  const orderManagementPage = new OrderManagementPage(adminPage);
+
+  // 小程序操作(使用新的 page)
+  const miniContext = await adminPage.context().browser()?.newContext();
+  const miniPage = await miniContext?.newPage();
+  const enterpriseMiniPage = new EnterpriseMiniPage(miniPage!);
+  // ...
+});
+```
+
+### 数据同步等待策略
+
+**轮询等待模式(推荐)**:
+```typescript
+async waitForOrderToAppear(
+  orderName: string,
+  timeout: number = 10000
+): Promise<boolean> {
+  const startTime = Date.now();
+  while (Date.now() - startTime < timeout) {
+    const orders = await this.getOrderList();
+    if (orders.some(o => o.name === orderName)) {
+      return true;
+    }
+    await this.page.waitForTimeout(500); // 每 500ms 检查一次
+  }
+  return false;
+}
+```
+
+**使用 Playwright 的等待机制**:
+```typescript
+await expect(async () => {
+  const orders = await enterpriseMiniPage.getOrderList();
+  expect(orders.some(o => o.name === orderName)).toBe(true);
+}).toPass({
+  timeout: 10000,
+  intervals: [500, 1000], // 检查间隔
+});
+```
+
+### 测试数据准备策略
+
+**前置条件:**
+1. 需要测试平台数据(使用 Story 11.2 创建的平台)
+2. 需要测试公司数据(使用 Story 11.5 创建的公司)
+3. 需要企业用户数据(使用 Story 12.2 创建的企业用户)
+4. **需要测试订单数据**(测试前置步骤创建,用于编辑)
+
+**测试数据唯一性**:
+```typescript
+const timestamp = Date.now();
+const orderData = {
+  name: `跨端编辑测试_${timestamp}`,
+  expectedStartDate: '2026-01-15',
+};
+```
+
+**重要**: 编辑测试必须先创建订单,因此测试应该包含:
+1. 测试前置钩子(beforeEach 或 test.beforeAll):创建测试订单
+2. 测试主流程:编辑订单 → 验证后台 → 验证小程序
+3. 测试清理钩子(afterEach 或 test.afterAll):清理测试数据
+
+### 测试数据清理策略
+
+**清理方法**:
+```typescript
+test.afterEach(async ({ orderManagementPage, orderName }) => {
+  // 在后台删除测试订单
+  await orderManagementPage.goto();
+  await orderManagementPage.deleteOrder(orderName);
+});
+```
+
+**验证清理成功**:
+```typescript
+test('清理后小程序不显示订单', async ({ enterpriseMiniPage, orderName }) => {
+  const orders = await enterpriseMiniPage.getOrderList();
+  expect(orders.some(o => o.name === orderName)).toBe(false);
+});
+```
+
+### 小程序订单列表页面(待扩展)
+
+**预期页面元素(基于 Story 13.1)**:
+- 订单列表容器
+- 订单项(订单名称、状态、日期)
+- 订单详情按钮
+- 筛选器(可选)
+
+**如页面未实现,需要添加 data-testid**:
+```typescript
+private readonly selectors = {
+  orderList: '[data-testid="mini-order-list"]',
+  orderItem: '[data-testid="mini-order-item"]',
+  orderName: '[data-testid="mini-order-name"]',
+  orderStatus: '[data-testid="mini-order-status"]',
+  orderDate: '[data-testid="mini-order-date"]',
+};
+```
+
+### 项目结构
+
+**新建文件**:
+- `web/tests/e2e/specs/cross-platform/order-edit-sync.spec.ts`
+
+**需要扩展的文件**:
+- `web/tests/e2e/pages/mini/enterprise-mini.page.ts`(扩展订单列表方法,如需要)
+
+**相关参考文件**:
+- `web/tests/e2e/pages/admin/order-management.page.ts` (Epic 10) - 订单编辑方法
+- `web/tests/e2e/pages/mini/enterprise-mini.page.ts` (Epic 12)
+- `web/tests/e2e/specs/admin/order-edit.spec.ts` (Epic 10) - 编辑订单测试
+- `web/tests/e2e/specs/cross-platform/order-create-sync.spec.ts` (Story 13.1) - 跨端测试模式
+
+### 选择器策略
+
+**优先级(遵循项目标准)**:
+1. `data-testid` 属性(最高优先级)
+2. ARIA 属性 + role
+3. 文本内容(最低优先级,避免使用)
+
+**后台编辑表单选择器(参考 Epic 10)**:
+- 编辑按钮: `edit-button-{orderId}` 或列表项点击
+- 表单字段: 与创建表单相同(`platform-selector-edit`, `company-selector-edit` 等)
+- 保存按钮: `order-edit-submit-button`
+
+### TypeScript 类型定义
+
+**跨端测试数据类型**:
+```typescript
+interface CrossPlatformOrderEditData {
+  /** 后台订单 ID */
+  adminOrderId: string;
+  /** 编辑前订单名称 */
+  originalName: string;
+  /** 编辑后订单名称 */
+  editedName: string;
+  /** 编辑后的订单状态 */
+  status: string;
+  /** 编辑后的预计开始日期 */
+  expectedStartDate?: string;
+}
+
+interface SyncVerificationResult {
+  /** 同步是否成功 */
+  synced: boolean;
+  /** 同步耗时(毫秒) */
+  syncTime: number;
+  /** 后台订单数据(编辑后) */
+  adminOrder: OrderData;
+  /** 小程序订单数据(应与后台一致) */
+  miniOrder?: OrderData;
+}
+```
+
+### 测试超时配置
+
+**使用 TIMEOUTS 常量**:
+```typescript
+import { TIMEOUTS } from '../../utils/timeouts';
+
+// 数据同步等待时间
+const SYNC_TIMEOUT = TIMEOUTS.networkIdle; // 10000ms
+
+// 轮询检查间隔
+const POLL_INTERVAL = 500;
+```
+
+### 调试技巧
+
+**跨端测试调试**:
+1. 使用 `page.screenshot()` 在关键步骤截图
+2. 使用 `console.debug()` 输出订单编辑前后的信息
+3. 分别记录后台和小程序的操作时间
+
+**同步问题调试**:
+- 检查网络请求(使用 Playwright 的 network 监听)
+- 检查 localStorage 和 sessionStorage(token 存储)
+- 验证编辑 API 请求和响应
+
+### 参考文档
+
+**架构文档**:
+- `_bmad-output/planning-artifacts/epics.md#Epic 13`
+- `_bmad-output/project-context.md`
+- `docs/standards/e2e-radix-testing.md`
+
+**相关 Story 文档**:
+- `13-1-order-create-sync.md` - Story 13.1 完整文档(Playwright MCP 探索结果、测试模式)
+- `10-1-order-page-object.md` (订单管理 Page Object)
+- `10-5-order-edit-tests.md` (编辑订单测试)
+- `12-4-enterprise-mini-page-object.md` (企业小程序 Page Object)
+- `12-5-enterprise-mini-login.md` (企业小程序登录测试)
+
+## Dev Agent Record
+
+### Agent Model Used
+
+_Created by create-story workflow_
+
+### Debug Log References
+
+_Implementation phase - no debug yet_
+
+### Completion Notes List
+
+_Story created - ready for development_
+
+### File List
+
+**新建文件**:
+- `_bmad-output/implementation-artifacts/13-2-order-edit-sync.md` - 本 Story 文档
+
+**待创建文件**(开发阶段):
+- `web/tests/e2e/specs/cross-platform/order-edit-sync.spec.ts` - 跨端编辑同步测试
+
+## Change Log
+
+- 2026-01-14: Story 13.2 创建完成
+  - 后台编辑订单 → 企业小程序验证需求
+  - 多 Page 对象管理策略
+  - 数据同步等待策略
+  - 状态:ready-for-dev

+ 25 - 1
_bmad-output/planning-artifacts/epics.md

@@ -2456,9 +2456,33 @@ Order (订单) - 必须 companyId
 **技术要点:**
 - 多 Page 对象管理(后台 + 小程序)
 - 数据同步等待策略
-- WebSocket 通信验证(`/mini-ws`、`/talent-mini-ws`)
 - 测试隔离和清理
 
+**测试开发流程(增强的 TDD + 持续验证):**
+
+Epic 13 采用 **Playwright MCP 持续验证**的测试开发流程,核心原则如下:
+
+1. **即时验证**: 在开发过程中立即使用 Playwright MCP 验证,不等到专门的 E2E Story
+2. **持续反馈**: 每完成一个功能模块立即验证,快速发现问题
+3. **减少返工**: 早期发现问题可以减少后期返工成本
+
+**Playwright MCP 使用时机:**
+- ✅ 任务 0 (EXPLORE): 探索页面结构、验证流程可行性
+- ✅ 任务 1-4 (RED): 每写一个测试就用 MCP 验证选择器、页面结构
+- ✅ 任务 5-6 (GREEN): 每实现一个功能就用 MCP 验证是否正常工作
+- ✅ 任务 7 (REFACTOR): 重构后用 MCP 确保功能未破坏
+
+**开发循环模式:**
+```
+编写/修改代码 → 立即用 Playwright MCP 验证 → 发现问题?
+  ├── 是 → 修复代码 → 重新验证
+  └── 否 → 继续下一步
+```
+
+**参考文档:**
+- Story 13.1: `/mnt/code/188-179-template-6/_bmad-output/implementation-artifacts/13-1-order-create-sync.md` - 包含完整的 Playwright MCP 持续验证策略说明
+- Story 13.2: `/mnt/code/188-179-template-6/_bmad-output/implementation-artifacts/13-2-order-edit-sync.md` - 包含详细的持续验证流程和实际示例
+
 **Epic 13 回顾:**
 - 验证完整的跨端业务流程
 - 确保数据同步正确性