变异测试 252/252 全灭却是假象:一次 eval 基线失效复盘
Grimmoner · reddit · 2026-10-19
作者用 Claude Code 构建家庭自动化 Python 工具,并对其测试套件跑变异测试(mutation testing)——故意逐个破坏代码,验证每个变异体都会被某个测试抓住。一次运行三小时、252 个变异体全部被「击杀」,看似完美,但随后的对照检查失败了,整轮结果作废。
根因:运行器会把代码和测试复制到临时目录再跑。三天前有个测试开始读取代码旁的数据文件,但没人把它加入复制清单——于是每一份副本(无论是否变异)里该测试都失败,所有变异体「死于」同一个缺失文件。基线跑在源目录上,文件存在,因此没暴露问题。同一 bug 此前还让一条已上线变更的「11/11 killed」记录失效了三天。
更早的事故:一轮跑过午夜后,/tmp 下的测试 venv 配置文件疑似被 macOS 临时目录清理掉,pytest 起不来,「套件跑不起来也算全灭」,午夜后的所有结果都失真。
作者现在的防线:
- 每轮加一个「只改注释」的对照变异体,它必须存活;若对照也死了,整轮作废
- 对照体要走运行器自己的复制流程,源目录基线会掩盖复制缺文件的问题
- 「killed」本身不是证据:日志须列出每次击杀的失败测试名,若全部指向同一个测试,那是测试坏了不是套件强
- 测试新增文件依赖时,同一变更必须同步更新复制清单
- 长跑用 wrapper 对源目录前后做指纹校验(名称/大小/哈希),有变动即标 VOID——因为 Claude 曾在运行中途擅自加测试,导致前后变异体跑在不同测试集上
作者将结论推广到 eval 和 LLM judge:每轮都要跑一个必过的和一个必挂的用例、走完全相同的 harness。100% 通过率应该让你起疑,而不是开心。
「编程与Agent」频道最新
- Monid 发布按真实 agent 交易量排名的工具榜:TinyFish 居首 — HeyAmit_ · 2026-10-23
- 视频导出从 2.6 小时缩到 20 分钟:让 Claude 重构服务器而非修补 — byhewar · 2026-10-23
- OpenJet 引擎宣称 Qwen3.8-27B 推理速度达 llama.cpp 1.9 倍 — JeremyCMorgan · 2026-10-23
- 用 Hermes 搭建全自动 SEO 智能体:三个 skill 覆盖关键词到建站 — EXM7777 · 2026-10-23
- 从赛事研究到链上下单:一个「默认需人工批准」的下注 agent 架构复盘 — Dry-Comfortable-2678 · 2026-10-23
- Capy 0.5.0 支持复用 Claude Pro/Max 订阅额度,并新增 OIDC 云端访问 — garrytan · 2026-10-23