# Story 13.5: 跨端数据同步稳定性验证 Status: backlog ## Story 作为测试开发者, 我想要验证跨端数据同步测试的稳定性和可靠性, 以便确保测试在各种条件下都能正确运行并返回一致结果。 ## Acceptance Criteria ### AC1: 数据一致性验证 **Given** 跨端测试涉及后台和小程序 **When** 执行多次跨端数据同步操作 **Then** 测试应验证以下场景: - 后台创建订单后,小程序显示数据完全一致 - 后台编辑订单后,小程序显示更新后的数据 - 后台添加人员后,小程序显示新增的人员 - 后台更新状态后,小程序显示更新后的状态 - 验证所有字段在后台和小程序中保持一致 ### AC2: 并发操作验证 **Given** 多个测试可能同时运行 **When** 执行并发跨端测试 **Then** 测试应验证以下场景: - 多个测试同时创建订单不会相互干扰 - 多个测试同时编辑不同订单不会冲突 - 多个测试同时添加人员不会产生数据混乱 - 验证测试隔离策略正确实施 - 验证测试数据清理不会影响其他测试 ### AC3: 边界情况验证 **Given** 系统可能遇到各种边界情况 **When** 执行跨端测试 **Then** 测试应验证以下场景: - 网络延迟情况下的数据同步(模拟慢速网络) - 大数据量情况下的数据同步(模拟大量人员) - 特殊字符和Unicode字符的处理 - 超时情况下的错误处理 - 失败重试机制的正确性 ### AC4: 稳定性测试(多次运行) **Given** 跨端测试需要在各种情况下保持稳定 **When** 连续运行测试 10 次 **Then** 测试应满足以下标准: - 所有测试 100% 通过 - 无 flaky 失败 - 平均执行时间稳定(± 10% 波动) - 数据同步时间稳定(无异常延迟) ### AC5: 错误恢复验证 **Given** 测试过程中可能出现错误 **When** 发生错误或失败 **Then** 测试应验证以下场景: - 单个测试失败不影响其他测试 - 测试失败后正确清理数据 - 错误消息清晰且有助于调试 - 失败测试可以独立重新运行 ### AC6: 代码质量标准 **Given** 遵循项目测试规范 **When** 编写测试代码 **Then** 代码应符合以下标准: - 使用 TIMEOUTS 常量定义超时 - 使用 data-testid 选择器(优先级高于文本选择器) - 测试文件命名:`cross-platform-stability.spec.ts` - 完整的测试描述和注释 - TypeScript 类型安全 - 通过 `pnpm typecheck` 类型检查 ## Tasks / Subtasks ### 阶段 1: EXPLORE - Playwright MCP 探索(RED 之前) - [ ] **任务 0: Playwright MCP 探索验证** - [ ] 0.1 启动子代理使用 Playwright MCP 手动验证边界情况 - [ ] 0.2 记录验证的选择器和交互模式 - [ ] 0.3 测试网络延迟场景(使用 Playwright 的网络模拟) - [ ] 0.4 测试大数据量场景(创建包含多个人员的订单) - [ ] 0.5 记录数据同步时间基准 - [ ] 0.6 生成测试代码骨架 - [ ] 0.7 将探索结果更新到本文档 Dev Notes ### 阶段 2: RED - 编写测试(基于任务 0 的探索结果) - [ ] 任务 1: 创建稳定性测试文件 (AC: #6) - [ ] 1.1 创建 `web/tests/e2e/specs/cross-platform/cross-platform-stability.spec.ts` - [ ] 1.2 配置测试 fixtures(多 Page 对象) - [ ] 1.3 添加测试前置条件(测试数据准备) - [ ] 任务 2: 实现数据一致性验证测试 (AC: #1) - [ ] 2.1 编写"后台创建订单 → 小程序数据一致性"测试 - [ ] 2.2 编写"后台编辑订单 → 小程序数据一致性"测试 - [ ] 2.3 编写"后台添加人员 → 小程序数据一致性"测试 - [ ] 2.4 编写"后台更新状态 → 小程序数据一致性"测试 - [ ] 2.5 验证所有字段完全一致 - [ ] 任务 3: 实现并发操作验证测试 (AC: #2) - [ ] 3.1 编写"多个测试同时创建订单"测试(使用 test.describe.parallel) - [ ] 3.2 编写"多个测试同时编辑不同订单"测试 - [ ] 3.3 验证测试隔离策略 - [ ] 3.4 验证数据清理不影响其他测试 ### 阶段 3: GREEN - 实现代码(让测试通过) - [ ] 任务 4: 实现边界情况验证测试 (AC: #3) - [ ] 4.1 编写"网络延迟情况下数据同步"测试(模拟慢速网络) - [ ] 4.2 编写"大数据量情况下数据同步"测试(10+ 人员) - [ ] 4.3 编写"特殊字符处理"测试(Unicode、emoji等) - [ ] 4.4 编写"超时处理"测试 - [ ] 4.5 编写"失败重试"测试 - [ ] 任务 5: 实现错误恢复验证测试 (AC: #5) - [ ] 5.1 编写"单个测试失败不影响其他测试"测试 - [ ] 5.2 编写"测试失败后正确清理数据"测试 - [ ] 5.3 验证错误消息清晰度 ### 阶段 4: STABILITY - 稳定性验证 - [ ] 任务 6: 执行稳定性测试 (AC: #4) - [ ] 6.1 创建稳定性测试脚本(连续运行 10 次) - [ ] 6.2 运行稳定性测试并记录结果 - [ ] 6.3 分析测试通过率(目标:100%) - [ ] 6.4 分析执行时间波动(目标:± 10%) - [ ] 6.5 如不达标,修复问题并重新测试 ### 阶段 5: REFACTOR - 优化代码质量 - [ ] 任务 7: 验证代码质量 (AC: #6) - [ ] 7.1 运行 `pnpm typecheck` 验证类型检查 - [ ] 7.2 运行测试确保所有测试通过 - [ ] 7.3 验证选择器使用 data-testid - [ ] 7.4 优化测试执行时间 ## Dev Notes ### Epic 13 背景和依赖 **Epic 13: 跨端数据同步测试 (Epic E)** - **目标**: 验证后台操作后小程序端的数据同步,覆盖完整的业务流程 - **业务分组**: Epic E(跨端数据同步测试) - **背景**: 真实用户旅程跨越管理后台和小程序,需要验证数据同步的正确性和时效性 - **依赖**: - Epic 10: ✅ 已完成(订单管理 E2E 测试) - Epic 12: ✅ 已完成(小程序登录测试) - Story 13.1-13.4: 🔄 进行中(跨端数据同步测试) **Epic 13 Story 依赖关系:** ``` Story 13.1: 后台创建订单 → 企业小程序验证 ✅ Story 13.2: 后台编辑订单 → 企业小程序验证 Story 13.3: 后台添加人员 → 人才小程序验证 Story 13.4: 后台更新状态 → 双小程序验证 Story 13.5: 跨端测试稳定性验证 ← 当前 Story Story 13.6: 首页看板数据联动专项测试 ✅ Story 13.7: 首页导航和交互测试 ``` ### 稳定性测试策略 **测试执行模式:** ```typescript // 使用 Playwright 的 test.describe.parallel 实现并发测试 test.describe.parallel('跨端数据同步稳定性验证', () => { test('并发测试 1: 创建订单', async ({ adminPage, miniPage }) => { // 测试代码 }); test('并发测试 2: 编辑订单', async ({ adminPage, miniPage }) => { // 测试代码 }); test('并发测试 3: 添加人员', async ({ adminPage, miniPage }) => { // 测试代码 }); }); ``` **稳定性测试脚本:** ```bash #!/bin/bash # run-cross-platform-stability-test.sh PASSED=0 FAILED=0 TIMES=() for i in {1..10}; do echo "=== 运行 #$i ===" START=$(date +%s) if pnpm test:e2e:chromium cross-platform-stability; then PASSED=$((PASSED + 1)) echo "✅ 运行 #$i 通过" else FAILED=$((FAILED + 1)) echo "❌ 运行 #$i 失败" fi END=$(date +%s) DURATION=$((END - START)) TIMES+=($DURATION) echo "⏱️ 耗时: ${DURATION}s" echo "" done echo "=== 稳定性测试结果 ===" echo "通过: $PASSED/10" echo "失败: $FAILED/10" echo "平均时间: $(awk '{sum+=$1} END {print sum/NR}' <<< "${TIMES[@]}")s" if [ $PASSED -eq 10 ]; then echo "✅ 100% 稳定性通过!" exit 0 else echo "❌ 稳定性不足,需要修复" exit 1 fi ``` ### 网络延迟模拟 **使用 Playwright 模拟慢速网络:** ```typescript test('网络延迟情况下数据同步', async ({ adminPage, miniPage }) => { // 模拟慢速 3G 网络 await adminPage.context().setOffline(false); await miniPage.context().setOffline(false); const slow3G = { download: 500 * 1024 / 8, // 500 Kbps upload: 500 * 1024 / 8, // 500 Kbps latency: 100, // 100ms 延迟 }; await adminPage.route('**/*', async (route) => { // 应用网络限制 await route.continue(); }); // 执行测试... // 验证数据在慢速网络下仍能正确同步 }); ``` ### 数据一致性验证策略 **字段级数据对比:** ```typescript async verifyDataConsistency( adminData: OrderData, miniData: OrderData ): Promise { // 验证所有字段一致 expect(adminData.name).toBe(miniData.name); expect(adminData.status).toBe(miniData.status); expect(adminData.workStatus).toBe(miniData.workStatus); expect(adminData.expectedStartDate).toBe(miniData.expectedStartDate); // 验证人员列表一致 expect(adminData.persons.length).toBe(miniData.persons.length); for (let i = 0; i < adminData.persons.length; i++) { expect(adminData.persons[i].id).toBe(miniData.persons[i].id); expect(adminData.persons[i].workStatus).toBe(miniData.persons[i].workStatus); } return true; } ``` ### 大数据量测试策略 **创建包含多个人员的订单:** ```typescript test('大数据量情况下数据同步', async ({ orderManagementPage, enterpriseMiniPage }) => { // 创建包含 10 个人员的订单 const persons = []; for (let i = 0; i < 10; i++) { persons.push({ name: `测试人员_${Date.now()}_${i}`, idCard: generateUniqueIdCard(Date.now() + i), }); } const orderData = { name: `大数据量测试订单_${Date.now()}`, persons: persons, }; await orderManagementPage.createOrder(orderData); // 验证小程序能正确显示所有人员 const miniOrderData = await enterpriseMiniPage.getOrderDetail(orderData.name); expect(miniOrderData.persons.length).toBe(10); }); ``` ### 特殊字符测试策略 **Unicode 和 Emoji 测试:** ```typescript test('特殊字符处理', async ({ orderManagementPage, enterpriseMiniPage }) => { const orderData = { name: `测试订单_🎉_${Date.now()}_中文_日本語_한국어`, description: '包含 emoji: 😊👍❤️ 和特殊符号: @#$%^&*()', }; await orderManagementPage.createOrder(orderData); // 验证小程序正确显示特殊字符 const miniOrderData = await enterpriseMiniPage.getOrderDetail(orderData.name); expect(miniOrderData.name).toContain('🎉'); expect(miniOrderData.name).toContain('中文'); expect(miniOrderData.description).toContain('😊'); }); ``` ### 测试隔离策略 **确保测试之间不相互干扰:** ```typescript // 使用唯一时间戳确保数据唯一 const timestamp = Date.now(); const testId = `test_${timestamp}_${Math.random().toString(36).substr(2, 9)}`; // 使用 test.each 进行参数化测试 test.each([ { scenario: '创建订单', action: 'create' }, { scenario: '编辑订单', action: 'edit' }, { scenario: '添加人员', action: 'addPerson' }, ])('并发测试: $scenario', async ({ adminPage, miniPage, action }) => { // 每个测试使用独立的数据 const testData = { name: `${action}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, }; // ... }); ``` ### 错误恢复策略 **测试失败后的清理:** ```typescript test.afterEach(async ({ orderManagementPage, testData }) => { try { // 清理测试数据 await orderManagementPage.deleteOrder(testData.orderName); } catch (error) { // 清理失败,记录但不影响其他测试 console.error('清理失败:', error); } }); test('单个测试失败不影响其他测试', async ({ adminPage, miniPage }) => { // 测试代码 }); ``` ### 参考文档 **架构文档:** - `_bmad-output/planning-artifacts/epics.md#Epic 13` - `_bmad-output/project-context.md` - `docs/standards/e2e-radix-testing.md` **相关 Story 文档:** - `10-14-order-stability-test.md` (订单管理稳定性验证) - `13-1-order-create-sync.md` (订单列表同步测试) - `13-2-order-edit-sync.md` (订单编辑同步测试) - `13-3-person-add-sync.md` (人员添加同步测试) - `13-4-status-update-sync.md` (状态更新同步测试) ## Dev Agent Record ### Agent Model Used _Created by create-story workflow_ ### Debug Log References _Story 13.5 created - not yet started_ ### Completion Notes List _Story 13.5 创建完成,状态:backlog_ ### File List _Created files:_ - `/mnt/code/188-179-template-6/_bmad-output/implementation-artifacts/13-5-cross-platform-stability.md` ## Change Log - 2026-01-14: Story 13.5 创建完成 - 跨端数据同步稳定性验证需求 - 数据一致性验证 - 并发操作验证 - 边界情况验证 - 稳定性测试(多次运行) - 错误恢复验证 - 状态:backlog