我们最近招了一个大厂出来的测试,他给我们的项目生成了 4000 多个单元测试,每次改代码,都要全绿了才能合并。
我仔细一看,这些单元测试里,几乎全是基于实现的白盒测试,以及大量 mock。
这些东西在 AI 时代大部分是负资产。
而且它会导致 Codex 出现一个很傻的行为:你让它重构代码,它不会只盯着新的设计目标,而是会拼命想办法让那些已经过时的单元测试也继续通过。结果就是旧接口不敢删,旧调用链不敢动,兼容层越堆越多,最后制造出一个 Frankenstein。
更荒谬的是,功能其实已经做完了,Codex 还可能再花一个小时去“修测试”。不是在修产品,而是在造一套新的单元测试,为下次改造代码制造同样的障碍。
让 AI 根据当前实现批量生成单元测试,本质上就是在给一套随时可能被重构的实现浇水泥。真正应该保护的是外部行为、API contract、业务 invariant、integration 和 E2E,而不是历史代码到底调用了哪个函数、走了哪条内部路径。
我直接跟老板说:大规模、基于实现和 mock 的白盒单元测试,应该从 Agent-native engineering 里移除。否则代价就是浪费token和开发时间。
测试应该保护系统行为,而不是保护代码的历史形状。