修复 CreatorPages 回关用例在并发负载下的偶发失败(修 CI flaky) #646

Merged
suzmii merged 1 commits from fix/creator-follow-flaky into master 2026-10-06 15:23:05 +08:00
Member

关联 Issue #644(合并时自动关闭:Closes #644)

概述

仅修 master 上既有的 flaky 用例(由已并入 master 的 PR #638 引入),与买断制功能无关,不涉及任何产品代码。改动 1 file changed, +7/-2,仅 src/components/creator/CreatorPages.test.tsx。

机理

  1. 「行已在 DOM、relationship store 尚未 seed」的那一帧,按钮 disabled=true,但文本已经是「回关」(followed 默认 false)→ findByRole('回关') 会在这一帧就命中。
  2. React 对 disabled 交互元素不派发 onClick → fireEvent.click 被吞,写入从未发生(实测 onClick 命中 0 次)。
  3. 之后 store 才 seed,按钮保持「回关」,测试等的是一个永远不会出现的「取消关注」(CreatorPages.test.tsx:145)。
  4. 加大 findBy 超时无效——该帧之后 DOM 不再变化;只有 CPU 严重超卖(CI runner 上 5 个 job 并发)时才会带着首帧 DOM 继续执行,故表现为偶发。

改动

const back = (await screen.findByRole('button', { name: '回关' })) as HTMLButtonElement;
await waitFor(() => expect(back.disabled).toBe(false));
fireEvent.click(back);

先等按钮从 disabled 变为可用再点击。仓库内已有同款先例:src/components/game-distribution/GameDistributionPages.test.tsx:237-242。

验证证据

  • 修复前(12 workers × 12 iterations):runs=144 failures=3 seconds=78 exit=1,失败签名与 CI run 3548 一致(CreatorPages.test.tsx:145 / Unable to find role="button" and name "取消关注");另有一次 140 次尝试记录了 2 次失败。
  • 修复后(同一条命令):runs=144 failures=0 seconds=70 exit=0。
  • 扩展(12 workers × 20 iterations):runs=240 failures=0 seconds=148 exit=0。
  • 合计 384 次跑 0 失败(若未修复,384 次全绿的概率约 0.03%)。
  • 目标用例 npx vitest run src/components/creator/CreatorPages.test.tsx ×10 → 10/10 全绿(每次 13 tests)。
  • 本机全量 npm run test:ci:frontend → exit 0,Test Files 253 passed (253)、Tests 2861 passed | 12 skipped。
    • 说明:CI 在 Linux 上是 254 files / 2925 passed;本机 Windows 有 12 条按 process.platform 显式跳过的用例,文件/用例总数由 vitest.frontend-ci.config.ts 的 glob 固定,单文件改动不会改变它。

影响面

修掉后不再随机让任何 PR 的 Frontend tests 变红,省去人工重跑与排查成本。

关联 Issue #644(合并时自动关闭:Closes #644) ## 概述 仅修 master 上既有的 flaky 用例(由已并入 master 的 PR #638 引入),**与买断制功能无关**,不涉及任何产品代码。改动 `1 file changed, +7/-2`,仅 `src/components/creator/CreatorPages.test.tsx`。 ## 机理 1. 「行已在 DOM、relationship store 尚未 seed」的那一帧,按钮 `disabled=true`,但文本已经是「回关」(`followed` 默认 false)→ `findByRole('回关')` 会在这一帧就命中。 2. React 对 disabled 交互元素**不派发 `onClick`** → `fireEvent.click` 被吞,写入从未发生(实测 onClick 命中 0 次)。 3. 之后 store 才 seed,按钮保持「回关」,测试等的是一个永远不会出现的「取消关注」(`CreatorPages.test.tsx:145`)。 4. **加大 `findBy` 超时无效**——该帧之后 DOM 不再变化;只有 CPU 严重超卖(CI runner 上 5 个 job 并发)时才会带着首帧 DOM 继续执行,故表现为偶发。 ## 改动 ```ts const back = (await screen.findByRole('button', { name: '回关' })) as HTMLButtonElement; await waitFor(() => expect(back.disabled).toBe(false)); fireEvent.click(back); ``` 先等按钮从 `disabled` 变为可用再点击。仓库内已有同款先例:`src/components/game-distribution/GameDistributionPages.test.tsx:237-242`。 ## 验证证据 - **修复前**(12 workers × 12 iterations):`runs=144 failures=3 seconds=78 exit=1`,失败签名与 CI run 3548 一致(`CreatorPages.test.tsx:145` / `Unable to find role="button" and name "取消关注"`);另有一次 140 次尝试记录了 2 次失败。 - **修复后**(同一条命令):`runs=144 failures=0 seconds=70 exit=0`。 - **扩展**(12 workers × 20 iterations):`runs=240 failures=0 seconds=148 exit=0`。 - 合计 **384 次跑 0 失败**(若未修复,384 次全绿的概率约 0.03%)。 - 目标用例 `npx vitest run src/components/creator/CreatorPages.test.tsx` ×10 → **10/10 全绿**(每次 13 tests)。 - 本机全量 `npm run test:ci:frontend` → **exit 0**,`Test Files 253 passed (253)`、`Tests 2861 passed | 12 skipped`。 - 说明:CI 在 Linux 上是 254 files / 2925 passed;本机 Windows 有 12 条按 `process.platform` 显式跳过的用例,文件/用例总数由 `vitest.frontend-ci.config.ts` 的 glob 固定,单文件改动不会改变它。 ## 影响面 修掉后不再随机让任何 PR 的 `Frontend tests` 变红,省去人工重跑与排查成本。
suzmii added the Kind/Bug label 2026-10-06 15:04:39 +08:00
suzmii self-assigned this 2026-10-06 15:04:39 +08:00
suzmii added 1 commit 2026-10-06 15:04:39 +08:00
修复 CreatorPages 回关用例在并发负载下点击被吞导致的偶发失败
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m1s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m48s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m8s
Project CI / Frontend tests (pull_request) Successful in 2m39s
Project CI / Backend tests (pull_request) Successful in 7m54s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m27s
Project CI / Repository checks (pull_request) Successful in 7m10s
Project CI / Native shell tests (pull_request) Successful in 9m41s
3b99da832f
- 在「自己的粉丝支持回关和取消回关,移除须确认且只移除该行」用例中,先取到「回关」按钮并保留引用,不再取到后立即同步点击
- 新增等待该按钮 disabled 变为 false 再 fireEvent.click,避免关系 store 尚未 seed、按钮仍是 disabled 时 React 不派发 onClick 而把这次点击吞掉
- 补充简短中文注释,说明行首帧早于关系 store seed、必须等按钮可用再点
suzmii merged commit 49131fcb40 into master 2026-10-06 15:23:05 +08:00
suzmii deleted branch fix/creator-follow-flaky 2026-10-06 15:23:05 +08:00
Sign in to join this conversation.