qa: 画布往返 spec 用 PNG 字节体量比当判据(阈值 0.15,实测 0.158 判红)——它挡不住想挡的东西,却会被自己注释里承认的 1–2px 噪声打红
- Dominant language
- TypeScript
- Stars
- 0
- Forks
- 0
- Avg merge
- 1h 7m
- Merged PRs (30d)
- 969
Description
## 结论
`chat-diagram-save-reopen-roundtrip.spec.ts:278` 的收尾判据用**两张 PNG 的字节体量比**
近似「画的是同一份内容」,阈值 0.15。本趟实测 **0.15800883179446007**,
以 0.008 之差判红。
判定类型:**spec 脆弱(判据本身不可靠)**,不是产品缺陷——至少这一条断言红不能说明产品坏了。
## 实测 SHA
`f5c9064ed4304160318968bb618110a4ca1188bb`(`origin/main`),run
[34253214380](https://github.com/boardx/workspacex/actions/runs/34253214380)。
`verify:chat-read` 121 条:112 passed / 3 failed / 6 skipped。
```
1) [chat-read] › chat-diagram-save-reopen-roundtrip.spec.ts:278:5 › 只读预览挂载即读回:保存后立即可见 + reload 不点最大化也可见(issue #1668)
Error: expect(received).toBeLessThan(expected)
Expected: < 0.15
Received: 0.15800883179446007
at chat-diagram-save-reopen-roundtrip.spec.ts:412:21
```
⚠ 这条在同 SHA 的另一个基线上是绿的:`9de57821e` 上三趟 `chat-read` 里
`chat-diagram-save-reopen-roundtrip` 两条**趟趟全绿**(run 34238087140 / 34238069791 / 34238127530)。
**单趟不足以判它是回归还是抖动**,我不下这个结论。
## 为什么说判据不可靠
spec 自己的注释已经把理由写清楚了(:399-408,逐字):逐字节比对「在真实浏览器里偏脆」,
因为同一份 mermaid 源两次独立渲染,容器宽度会因滚动条状态差 1–2px 而重算。
于是改用**字节体量近似**:
```ts
const sizeRatio =
Math.abs(afterReloadNoClickScreenshot.length - afterSaveNoReloadScreenshot.length)
/ Math.max(afterReloadNoClickScreenshot.length, afterSaveNoReloadScreenshot.length);
expect(sizeRatio).toBeLessThan(0.15);
```
但 PNG 字节体量是**压缩后**的大小,对内容的微小视觉差异是高度非线性的:
差 1–2px 的宽度会改变整幅图的像素网格,进而改变压缩率——体量差跑到 15% 以上
完全可能来自那条注释自己承认的 1–2px 重算,而不是「画的根本不是同一份内容」。
换句话说,**这个阈值挡不住它想挡的东西,却会被它自己承认的噪声源打红**。
0.158 这个数字离阈值只有 0.008,正是这种噪声判据的典型形状。
## 建议方向(不由我实施)
判据想说的是「reload 之后看到的仍是编辑后的版本」。更接近这句话、且不吃渲染噪声的取法:
- **A**:断言语义而非像素——从画布读回它渲染所用的 mermaid 源 / 版本号
(`data-*` 或权威读接口),断言等于保存的那一版。
- **B**:保留像素对照,但改成「与**原始版**明显不同」这一侧(`equals(originalScreenshot) === false`
两条**已经在断言了**,:401-402),删掉这条体量比——它在现有两条之上没有新增拦截能力,
只增加了噪声。
- **C**:真要做视觉回归,用像素级 diff 比例(`toHaveScreenshot` 的 `maxDiffPixelRatio`)
而不是压缩后字节数。
无论选哪条,按老规矩改完造一次反证(让 reload 后真的读回旧版本,确认会红)。
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with chat-diagram-save-reopen-roundtrip.spec.ts around lines 278 and 399-412, then run the verify:chat-read test to understand the existing screenshot assertions. Resolve which proposed criterion is intended before changing the spec. Done means the check is not driven by PNG byte size and an adversarial case where reload reads the old version still fails.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- playwright, typescript
- Domain
- testing-qa
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Needs clarification
- Newbie friendliness
- 45/100