标签

AI编程与测试信任危机

发布时间:2026-04-04 02:06来源:微信阅读:5

AI × 软件 系列第 5 篇

有一个问题一直让我不安。

当 AI 编写了代码,我们用测试来验证代码是否正确。但如果测试也是 AI 写的呢?

你在用 AI 写的考卷来检验 AI 写的答案。如果 AI 对需求的理解有偏差,那么它写的代码和测试可能犯同样的错误——代码是错的,测试也是错的,但测试全部通过,一片绿色。

这不是理论上的担忧。这已经在真实项目中发生了。

· · ·

传统软件质量保证有一条清晰的信任链:

信任的关键在于独立性。写代码的人和写测试的人,至少思维方式不同。审查者是第三方视角。多个独立的人类大脑交叉验证,降低系统性偏差的概率。

现在这条链变成了:

独立性消失了。代码和测试出自同一个"大脑",可能带有相同的认知盲区。

这不是说 AI 写的测试一定不好。问题在于:你无法通过 AI 自己写的测试来证明 AI 的代码是正确的——这是一个循环论证。

· · ·

这是最表层的问题,也是目前工具最多的层面。

AI 生成的代码在语法上几乎不会出错。在常见模式上(CRUD、API 对接、数据处理),准确率也相当高。问题出在边界情况和隐含假设:

这些问题 AI 不是不知道,而是不够可靠地知道。有时候它会主动考虑并发安全,有时候不会。有时候它会做输入校验,有时候会忘。

AI 生成代码的危险不在于它写得差,而在于它写得"几乎对"。90% 的完美往往比 60% 的粗糙更危险——因为后者你一眼就能看出问题,前者需要深入审查才能发现隐患。

单个模块都对,组合起来可能是灾难。这是软件工程最经典的挑战,AI 时代只会更严重。

原因:AI 处理单个任务时通常在"局部最优",但缺乏对整个系统的全局视角。

这种问题在传统开发中也存在,但频率较低——因为人类开发者共享同一个架构认知,会在团队沟通中自然协调。AI Agent 之间没有这种隐式协调。

这是最深层的危机。

当越来越多的代码由 AI 生成,人类对自己系统的理解在逐渐降低。

三个月前 AI 生成的一个模块,当时审查通过了,现在需要修改。你打开代码,发现你不完全理解它的实现逻辑。你让 AI 解释,AI 的解释可能是对的,也可能是错的(它在解释别的 AI 写的代码,不一定准确)。

你敢改吗?你改了之后怎么确保没有破坏什么?

这是一种新形态的技术债:不是代码质量差,而是人类对代码的认知在退化。

传统的技术债可以通过重构来偿还。认知债怎么偿还?让 AI 重新生成一遍?那只是把债务转移了,不是消除了。

· · ·

传统单元测试失效的地方:当 AI 同时写代码和测试时,测试可能只覆盖了 AI "想到"的场景。

重建方向:Property-Based Testing(基于属性的测试)

不是断言具体输出值,而是定义输出必须满足的性质:

# 传统:脆弱的具体断言 def test_sort(): assert sort([3,1,2]) == [1,2,3] # 属性测试:不管输入是什么,输出必须满足这些性质 @given(lists(integers())) def test_sort_properties(lst): result = sort(lst) assert len(result) == len(lst) # 长度不变 assert all(result[i] <= result[i+1] # 有序 for i in range(len(result)-1)) assert set(result) == set(lst) # 元素不变

属性测试的优势:它定义的是不变量,不依赖于实现细节。即使代码和测试都是 AI 写的,只要属性是人定义的,信任链就没有断裂。

当 AI 一天生成几千行代码时,逐行审查不现实了。

重建方向:分层审查

关键原则:用不同