JianFeeeee
d01712a697
test(harness): 变异测试拒绝在脏工作区上运行
两个变异 harness(Go 版 discover、Python 版 quota)都是「把变异写进源码
文件、跑测试、再还原」。这个形状有两个陷阱,上一轮都真踩到了:
一、脏工作区上的 baseline 是错的
变异被覆盖写入实现文件。如果文件本来就有未提交改动(上一轮被 background
task 超时杀掉、Ctrl-C 中断、编辑器里改了一半),那么:
- 捕获的「原始内容」不是已提交的源码,baseline 跑的是别的东西
- 留下的那个变异会被下一轮当成 baseline
两种情况下所有裁决都毫无意义,而 harness 仍然报出干净的分数 —— 正是
「判据失效」最坏的一种:它不报错。
改为直接拒绝运行(Go 版 t.Fatalf,Python 版退出码 2),并且不自动 checkout:
脚本分不清「残留变异」和「人正在改」,静默回退真实改动比停下来更糟。
二、注入必须原子,还原必须覆盖所有退出路径
Python 版原来用 open(path,"w"),就地截断。与它并发的构建(background
go test、编辑器 gofmt、编译器自己读文件)可能看到写了一半的文件,报
syntax error,然后被当成 COMPILE 静默豁免 —— 一个真实的变异就这样被放过。
改为 tempfile + os.replace。还原登记到 atexit 与 SIGINT/SIGTERM。
三、路径必须相对当前目录
Go 版最初用 cwd=包目录 + 仓根相对路径,git 匹配不到任何东西,守卫永远不
触发。两个 harness 现在都用 ./name,各自在自己目录里跑 git。
两个方向都验证过:干净时全杀(discover 11/11、quota 12/12),脏时拒绝运行。
2026-10-07 03:58:51 +08:00
..
2026-10-06 23:43:04 +08:00
2026-10-04 14:50:46 +08:00
2026-09-27 17:12:03 +08:00
2026-10-06 14:53:15 +08:00
2026-10-02 12:55:54 +08:00
2026-10-02 12:55:54 +08:00
2026-08-28 12:02:46 +08:00
2026-10-06 14:53:15 +08:00
2026-10-06 14:53:15 +08:00
2026-09-27 17:12:03 +08:00
2026-10-02 15:44:50 +08:00
2026-10-06 14:53:15 +08:00
2026-10-06 14:53:15 +08:00
2026-10-06 14:53:15 +08:00
2026-10-07 03:58:51 +08:00
2026-10-06 14:53:15 +08:00
2026-10-06 14:53:15 +08:00
2026-10-06 14:53:15 +08:00
2026-09-28 23:42:48 +08:00
2026-10-02 08:47:08 +08:00
2026-10-03 07:45:54 +08:00
2026-09-28 23:42:48 +08:00
2026-09-27 18:44:41 +08:00
2026-09-27 18:44:41 +08:00
2026-09-27 18:44:41 +08:00
2026-09-28 23:42:48 +08:00
2026-10-03 07:45:54 +08:00
2026-08-30 08:04:22 +08:00
2026-09-27 17:12:03 +08:00
2026-10-04 14:50:46 +08:00
2026-10-04 14:50:46 +08:00
2026-10-02 01:03:39 +08:00
2026-10-04 14:50:46 +08:00
2026-10-04 21:56:45 +08:00
2026-10-06 14:53:15 +08:00
2026-10-01 20:36:48 +08:00
2026-10-01 18:15:29 +08:00
2026-10-01 23:37:17 +08:00
2026-10-03 10:32:51 +08:00
2026-10-04 14:50:46 +08:00
2026-10-02 12:26:26 +08:00
2026-08-30 09:29:42 +08:00
2026-10-04 14:50:47 +08:00
2026-09-28 22:19:12 +08:00
2026-10-01 20:36:48 +08:00
2026-10-06 14:53:15 +08:00
2026-10-06 23:43:04 +08:00
2026-10-04 07:05:36 +08:00
2026-10-04 14:50:46 +08:00
2026-09-27 19:02:13 +08:00