Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0150a87496 |
@@ -0,0 +1,94 @@
|
||||
# TASK:两个会误报的测试(2026-11-12)
|
||||
|
||||
- Gitea:#205
|
||||
- 分支:`codex/flaky-tests-20261112`(基于 staging `017e650fdafac4a841487dbba4aca803c761dad8`)
|
||||
- Bug 编号:BUG-1850。开工时核对 `docs/BUG_HISTORY.md` 末尾;若已被占用,顺延,并在 PROGRESS 写明。
|
||||
- 负责验收:Claude(jyotisha-de)
|
||||
|
||||
不得自行写“产品决定/裁定”;任务书没写的取舍一律选需拍板。
|
||||
|
||||
不得修改或删除既有断言来让测试通过;确需修改必须写原值/新值/原因,并在 PROGRESS 里逐条列出。
|
||||
|
||||
## 一、回答时钟测试靠真实计时,CI 负载高时会失败
|
||||
|
||||
测试:`frontend/tests/consult-evidence-lookup-20260927.test.ts:280`,
|
||||
「a lookup does not reset the answer clock: the same 70 s signal bounds the whole answer phase」。
|
||||
|
||||
用例的写法:
|
||||
|
||||
- `answerMs: 300`;
|
||||
- 查表延迟 40 ms;
|
||||
- 回答分 6 段,每段延迟 25 ms;
|
||||
- 期望结果是 `run.failed:answer_truncated`。
|
||||
|
||||
实际情况:
|
||||
|
||||
- CI 运行 7208、7230 各失败过一次,单独重跑那一项就通过。
|
||||
- 本机在负载下得到的是 `empty_answer`,不是 `answer_truncated`。
|
||||
|
||||
要做的:
|
||||
|
||||
1. 先查清楚负载下为什么会变成 `empty_answer`。在 PROGRESS 写明,是测试的时间预算问题,还是产品代码在边界上真的有分支差异。
|
||||
- 如果是**产品**问题:停下来,选需拍板,不要改产品代码。
|
||||
2. 如果是测试的问题,把这个用例改成不依赖真实耗时:
|
||||
- 用注入的时钟或可控的 signal,让“回答阶段超时”在确定的那一步发生;
|
||||
- 保留四个断言的含义:结果是 `answer_truncated`;`charges` 为 0;回答时钟只启动一次;有 `compose-abort`。
|
||||
3. 用同样的方式检查同文件里其他依赖 `delayMs` 和预算的用例。只改那些在 4 倍 CPU 负载下会失败的,逐个列进 PROGRESS。
|
||||
4. 本机验证:开 4 个后台 `yes > /dev/null` 加负载(Windows 用等效做法),同文件连续跑 20 遍,0 失败。验证完结束这些负载进程,按 PID 结束,**不要按名字批量结束进程**。
|
||||
|
||||
## 二、预置资料库测试默认读旧导出
|
||||
|
||||
测试:`tests/test_preset_evidence_library.py::test_every_her_file_exists_sha_matches_and_quotes_are_verbatim`。
|
||||
|
||||
- 它默认读 `/workspace/up-run-r40`(`scripts/preset_evidence/library.py` 里的 `DEFAULT_HER_EXPORT`)。
|
||||
- 资料库现在钉的是她来源仓的 `1b33aff61d733213d9df67906ddf16473aafc9bb`,见 `references/preset_evidence_library/VERIFIED.json`。
|
||||
- 本机如果存在旧的 r40 导出,这个测试会因 `scripts/dasha_analyzer.py` 的哈希不同而失败。CI 上没有这个目录,测试会跳过。
|
||||
|
||||
要做的:
|
||||
|
||||
1. 去掉对 `/workspace/up-run-r40` 的默认值。只有设置了环境变量 `PRESET_EVIDENCE_HER_EXPORT` 时,才跑需要导出的测试;没设置就跳过,并在 skip 原因里写明。
|
||||
2. 设置了环境变量时,先核对这个目录和 `VERIFIED.json` 记录的来源是否一致。
|
||||
- 有 `.git` 的,比对 HEAD;
|
||||
- 没有的,比对 `VERIFIED.json` 里的文件哈希。
|
||||
- 不一致时,测试**失败**,并给出明确信息:“来源与 VERIFIED.json 固定的版本不一致”。不能跳过。
|
||||
3. CLI `python -m scripts.preset_evidence.library` 的 `--her-export` 改为必填,`--skip-her-export` 除外。帮助文字里写明要指向固定版本的来源仓。
|
||||
4. 同步更新 `SCHEMA.md` 里关于导出目录的说明。
|
||||
|
||||
## 要改的文件
|
||||
|
||||
- `frontend/tests/consult-evidence-lookup-20260927.test.ts`。如果需要注入时钟,测试辅助文件也可以改;**不改 `frontend/src`**,除非第一节查明是产品问题,那种情况选需拍板。
|
||||
- `scripts/preset_evidence/library.py`:只改默认路径和 CLI 参数。
|
||||
- `tests/test_preset_evidence_library.py`、`tests/test_preset_library_gates_20261112.py`:只改导出相关的跳过和核对逻辑。
|
||||
- `references/preset_evidence_library/SCHEMA.md`:只改导出目录的说明。
|
||||
- `docs/BUG_HISTORY.md`:只在末尾追加一条。
|
||||
- `docs/tasks/PROGRESS-flaky-tests-20261112.md`
|
||||
|
||||
## 不要碰
|
||||
|
||||
- `frontend/src/**`
|
||||
- `frontend/src/lib/consult-preset-prompts.ts`
|
||||
- 资料库条目和 `VERIFIED.json`
|
||||
- 冻结文件
|
||||
|
||||
## 自测命令
|
||||
|
||||
```
|
||||
cd frontend && npm test
|
||||
python -m pytest -q tests/test_preset_evidence_library.py tests/test_preset_library_gates_20261112.py
|
||||
PRESET_EVIDENCE_HER_EXPORT=<固定版本来源目录> python -m pytest -q tests/test_preset_evidence_library.py
|
||||
python scripts/run_quality_gate.py --profile quick --skip-frontend-runtime
|
||||
```
|
||||
|
||||
## 进度记录
|
||||
|
||||
写在 `docs/tasks/PROGRESS-flaky-tests-20261112.md`,内容包括:
|
||||
|
||||
- `empty_answer` 的原因;
|
||||
- 改了哪些用例,加负载连续 20 遍的结果;
|
||||
- 资料库测试分别在三种情况下的表现:未设置环境变量、设置为一致的来源、设置为不一致的来源;
|
||||
- 测试结果,以及在 staging 上也复现的基线失败。
|
||||
|
||||
## 何时停下来选“需拍板”
|
||||
|
||||
- `empty_answer` 是产品代码的边界问题,不是测试的问题。
|
||||
- 要稳定这个测试,只能放宽断言。
|
||||
Reference in New Issue
Block a user