Status: done
作为测试开发者, 我想要验证后台添加残疾人到订单后人才小程序的数据同步, 以便确保跨端人员关联的正确性和时效性。
Given 后台订单管理和残疾人管理功能已完成(Epic 9、Epic 10) When 测试者在管理后台为订单添加残疾人 Then 测试应验证以下功能:
Given 管理后台已为订单添加残疾人 When 人才用户登录小程序 Then 测试应验证以下功能:
Given 订单支持添加多个残疾人 When 执行批量添加人员操作 Then 测试应验证以下场景:
Given 测试需要同时操作后台和小程序 When 执行跨端测试 Then 测试应满足以下要求:
Given 跨端测试涉及多个系统 When 执行测试 Then 测试应遵循以下策略:
Given 网络延迟和系统负载 When 添加人员后查询小程序 Then 测试应验证以下场景:
Given 遵循项目测试规范 When 编写测试代码 Then 代码应符合以下标准:
person-add-sync.spec.tspnpm typecheck 类型检查测试开发流程(增强的 TDD + 持续验证): 本 Story 采用 Playwright MCP 持续验证的测试开发流程。
核心原则:
- 即时验证: 在开发过程中立即使用 Playwright MCP 验证,不等到专门的 E2E Story
- 持续反馈: 每完成一个功能模块立即验证,快速发现问题
- 减少返工: 早期发现问题可以减少后期返工成本
Playwright MCP 使用时机:
- ✅ 任务 0: 探索页面结构、验证流程可行性
- ✅ 任务 1-3: 每写一个测试就用 MCP 验证选择器、页面结构
- ✅ 任务 4-5: 每实现一个功能就用 MCP 验证是否正常工作
- ✅ 任务 6: 重构后用 MCP 确保功能未破坏
任务 0 必须在任务 1-6 之前完成,它为后续任务提供验证过的选择器和基础模式。
[ ] 任务 1: 创建跨端测试文件和基础设施 (AC: #4, #7)
web/tests/e2e/specs/cross-platform/person-add-sync.spec.ts[ ] 任务 2: 实现后台添加人员测试 (AC: #1)
[ ] 任务 3: 实现人才小程序验证测试 (AC: #2)
[ ] 任务 4: 实现多人员添加同步测试 (AC: #3)
[ ] 任务 5: 实现测试数据清理策略 (AC: #5)
[ ] 任务 6: 实现数据同步时效性验证 (AC: #6)
pnpm typecheck 验证类型检查核心理念: Playwright MCP 不应该只在任务0使用一次,而应该作为整个开发过程中的持续验证工具。
参考 Story 13.1 和 13.2 的详细说明,核心要点:
开发循环模式:
编写/修改代码 → 立即用 Playwright MCP 验证 → 发现问题?
├── 是 → 修复代码 → 重新验证
└── 否 → 继续下一步
Epic 13: 跨端数据同步测试 (Epic E)
Epic 13 Story 依赖关系:
Story 13.1: 后台创建订单 → 企业小程序验证 ✅ 已完成
Story 13.2: 后台编辑订单 → 企业小程序验证 🔄 进行中
Story 13.3: 后台添加人员 → 人才小程序验证 ← 当前 Story
Story 13.4: 后台更新状态 → 双小程序验证
Story 13.5: 跨端测试稳定性验证
Story 13.6: 首页看板数据联动专项测试 ✅ 已完成
完成时间: 2026-01-14 探索方法: 使用 Playwright MCP 工具手动验证完整测试流程
测试目标: 验证后台添加残疾人到订单后,人才小程序能否正确显示关联的订单
测试结果: ✅ 后台添加人员流程已完整验证
数据同步时效性:
后台选择器(已验证):
| 功能 | data-testid | 说明 |
|------|-------------|------|
| 订单菜单触发器 | order-menu-trigger-{orderId} | 打开订单操作菜单 |
| 查看详情按钮 | view-order-detail-button-{orderId} | 打开订单详情对话框 |
| 添加人员按钮 | order-detail-card-add-persons-button | 在订单详情对话框中 |
| 残疾人复选框 | person-checkbox-{personId} | 在选择残疾人对话框中 |
| 确认选择按钮 | confirm-batch-button | 选择残疾人后确认 |
| 确认添加按钮 | confirm-add-persons-button | 确认添加到订单 |
测试流程(已验证):
后台添加人员流程:
/admin/orders)person-checkbox-{personId})小程序验证流程(基于 Story 13.1/13.2 经验):
/mini/#/mini/pages/login/index)关键发现:
实际测试数据:
小程序选择器(参考 Story 13.1/13.2):
| 功能 | data-testid |
|------|-------------|
| 手机号输入框 | mini-phone-input |
| 登录按钮 | mini-login-button |
从 Story 13.1 和 13.2 中学习到的关键经验:
Playwright MCP 探索经验:
data-testid 选择器,避免文本选择器关键发现(Story 13.1 探索结果):
text=选择残疾人 检测对话框标题比 [role="dialog"] 更可靠关键发现(Story 13.2 探索结果):
从已完成的 Epic 10 Story 10.9 中学习到的订单人员管理模式:
OrderManagementPage 人员管理方法:
// 打开订单人员管理对话框
async openPersonManagementDialog(orderName: string): Promise<void>
// 添加残疾人到订单
async addPersonToOrder(personData: {
personId: number;
joinDate?: string;
salary?: number;
}): Promise<FormSubmitResult>
// 获取订单的人员列表
async getOrderPersons(orderName: string): Promise<PersonData[]>
人员数据结构:
interface PersonData {
id: number;
name: string;
idCard: string;
joinDate?: string;
salary?: number;
workStatus?: string;
}
从已完成的 Epic 12 Story 12.7 中学习到的模式:
TalentMiniPage 可用方法:
// 页面导航
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 getMyOrders(): Promise<OrderData[]>
async waitForOrderToAppear(orderName: string, timeout?: number): Promise<boolean>
人才小程序登录流程:
await talentMiniPage.goto();
await talentMiniPage.login(
'13800138000', // 人才用户手机号
'password123'
);
await talentMiniPage.expectLoginSuccess();
参考 Story 13.1 的多 Page 对象管理模式:
方案 1: 使用多个 Browser Context(推荐)
import { test as base } from '@playwright/test';
type CrossPlatformFixtures = {
adminPage: Page;
talentMiniPage: Page;
orderManagementPage: OrderManagementPage;
talentMini: TalentMiniPage;
};
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();
},
talentMiniPage: 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);
},
talentMini: async ({ talentMiniPage }, use) => {
const page = new TalentMiniPage(talentMiniPage);
await use(page);
},
});
轮询等待模式(推荐):
async waitForOrderToAppear(
orderName: string,
timeout: number = 10000
): Promise<boolean> {
const startTime = Date.now();
while (Date.now() - startTime < timeout) {
const orders = await this.getMyOrders();
if (orders.some(o => o.name === orderName)) {
return true;
}
await this.page.waitForTimeout(500); // 每 500ms 检查一次
}
return false;
}
前置条件:
重要: 添加人员测试需要:
测试数据唯一性:
const timestamp = Date.now();
const personData = {
name: `跨端测试残疾人_${timestamp}`,
idCard: generateTestIdCard(timestamp),
// ...
};
清理方法:
test.afterEach(async ({ orderManagementPage, orderId, personId }) => {
// 方案1: 移除人员关联
await orderManagementPage.removePersonFromOrder(orderId, personId);
// 方案2: 删除测试订单(如不需要保留)
await orderManagementPage.deleteOrder(orderId);
});
验证清理成功:
test('清理后小程序不显示订单', async ({ talentMini, orderName }) => {
const orders = await talentMini.getMyOrders();
expect(orders.some(o => o.name === orderName)).toBe(false);
});
预期页面元素:
如页面未实现,需要添加 data-testid:
private readonly selectors = {
myOrdersList: '[data-testid="talent-my-orders-list"]',
orderItem: '[data-testid="talent-order-item"]',
orderName: '[data-testid="talent-order-name"]',
orderCompany: '[data-testid="talent-order-company"]',
orderStatus: '[data-testid="talent-order-status"]',
};
新建文件:
web/tests/e2e/specs/cross-platform/person-add-sync.spec.ts需要扩展的文件:
web/tests/e2e/pages/mini/talent-mini.page.ts(扩展"我的订单"方法)web/tests/e2e/pages/admin/order-management.page.ts(扩展人员管理方法,如需要)相关参考文件:
web/tests/e2e/pages/admin/order-management.page.ts (Epic 10) - 订单人员管理web/tests/e2e/pages/mini/talent-mini.page.ts (Epic 12) - 人才小程序web/tests/e2e/specs/admin/order-person.spec.ts (Epic 10) - 人员关联测试web/tests/e2e/specs/cross-platform/order-create-sync.spec.ts (Story 13.1) - 跨端测试模式web/tests/e2e/specs/cross-platform/order-edit-sync.spec.ts (Story 13.2) - 跨端编辑测试优先级(遵循项目标准):
data-testid 属性(最高优先级)后台人员管理选择器(参考 Epic 10):
manage-persons-button-{orderId} 或订单详情页add-person-button跨端测试数据类型:
interface CrossPlatformPersonData {
/** 残疾人 ID */
personId: number;
/** 残疾人姓名 */
personName: string;
/** 身份证号 */
idCard: string;
/** 入职日期 */
joinDate?: string;
/** 薪资 */
salary?: number;
}
interface PersonSyncVerificationResult {
/** 同步是否成功 */
synced: boolean;
/** 同步耗时(毫秒) */
syncTime: number;
/** 后台订单数据 */
adminOrder: OrderData;
/** 小程序订单数据 */
miniOrder?: OrderData;
/** 残疾人信息 */
person: CrossPlatformPersonData;
}
使用 TIMEOUTS 常量:
import { TIMEOUTS } from '../../utils/timeouts';
// 数据同步等待时间
const SYNC_TIMEOUT = TIMEOUTS.networkIdle; // 10000ms
// 轮询检查间隔
const POLL_INTERVAL = 500;
跨端测试调试:
page.screenshot() 在关键步骤截图console.debug() 输出人员关联信息同步问题调试:
架构文档:
_bmad-output/planning-artifacts/epics.md#Epic 13_bmad-output/project-context.mddocs/standards/e2e-radix-testing.md相关 Story 文档:
13-1-order-create-sync.md - Story 13.1 完整文档(Playwright MCP 探索结果、测试模式)13-2-order-edit-sync.md - Story 13.2 完整文档(小程序缓存问题、验证策略)10-9-order-person-tests.md (订单人员关联测试)12-6-talent-mini-page-object.md (人才小程序 Page Object)12-7-talent-mini-login.md (人才小程序登录测试)Created by create-story workflow
Implementation phase - no debug yet
Story created - ready for development
新建文件:
_bmad-output/implementation-artifacts/13-3-person-add-sync.md - 本 Story 文档待创建文件(开发阶段):
web/tests/e2e/specs/cross-platform/person-add-sync.spec.ts - 跨端人员添加同步测试验证方法: 使用 Playwright MCP 工具手动验证完整测试流程
验证结果: ✅ 后台功能全部正常,⚠️ 人才小程序功能缺失
[data-testid^="person-checkbox-"]:not([disabled]) 正常工作问题 1: 人才小程序缺少"我的订单"功能入口
问题 2: 测试数据准备问题
已完成的工作:
测试数据: