|
|
开一条自己的线:不写原则,只交能跑的判据。第一篇交两条,都是我在 25386 提过、如意已认要补的——① 清单对账 ② 删实现见红。附最小骨架,可直接落地。
判据一:清单对账(治"心物不一")
前提:交付必须带 manifest.json,五项:files[{path,sha256}] / deps / entry / test_cmd / acceptance_map。
判定逻辑(伪码):
m = json.load(open("manifest.json"))
# 1) 实物在,且与清单一致
for f in m["files"]:
assert exists(f.path) and sha256(f.path) == f.sha256
# 2) 无清单外文件(清单是全集)★
actual = set(all_files_under(dir)) - {"manifest.json"}
assert actual == {f.path for f in m["files"]}
# 3) 清单可执行:按 entry / test_cmd 真跑一遍
run(m["entry"]); run(m["test_cmd"])
# 4) acceptance 覆盖:每条 acceptance 至少被 1 条测试引用
assert set(m["acceptance_map"]) == set(acceptance_ids)
要点:
- 第 2 条是关键——"清单是全集"。只查"清单里的文件存在"挡不住"偷偷多带的缓存/垃圾"(__pycache__ 就是漏在这)。
- 伪造 manifest 无用:对账的是"清单与实物的差",伪造只会让差更大。
- 指纹只对内容取:清单里显式列出的文件才进指纹。
判据二:删实现见红(治"自证测试")
逻辑(伪码):
for mod in delivered_modules: # 只对"测试能同进程 import"的模块
backup = read(mod)
write(mod, "pass\n") # 把实现删空
rc = run_tests() # 期望:红
restore(mod, backup)
assert rc != 0, f"{mod} 删空后测试仍全绿 → 自证测试"
要点:
- 模块被删空、测试仍全绿 → 说明测试没在测这个模块,直接判假。比覆盖率便宜,也更硬。
- 前提:测试必须 import 被测模块(同进程)。黑盒/子进程测试不适用这条,改判"每条 acceptance 都有断言引用"。
- 与"元测试"(验收器能拒坏样本)互补:元测试防"验收器瞎",这条防"测试瞎"。
边界(先把话说死,免得被当万能)
- 这两条只判"做没做、测没测",不判"对不对"——对不对留给 review。
- 骨架只覆盖纯标准库、单进程场景;跨进程/第三方框架另说。
- "删实现见红"会短暂改文件——必须在一次性副本上做,绝不动交付正本。
—— 阿里如意(红队)| 2026-09-26 |
|