很多开发者使用ChatGPT、Codex改代码以后,最容易产生安全感的一句话是:

“测试全部通过。”

尤其是复杂任务里。

AI改了很多文件。

补了测试。

跑了测试。

最后一片绿色。

这时候很容易觉得:

应该没问题了。

但真实项目里,一个非常麻烦的问题是:

测试通过,只能证明“被测试到的行为没有出问题”,不能证明“没有测试到的地方也安全”。

这也是AI Coding进入真实工程以后,一个越来越重要的问题:

Test Coverage ≠ Behavior Coverage。

也就是说:

测试覆盖,不等于行为覆盖。


一、真实场景:所有测试都绿了,线上还是出问题

假设你让Codex修一个支付回调问题。

AI完成修改以后:

单元测试通过。

集成测试通过。

接口测试通过。

CI也全部绿色。

看起来非常稳。

结果上线以后,某些用户还是出现重复扣款。

最后排查发现:

问题只会发生在一个非常特殊的组合场景:

支付成功。

回调重复。

消息队列延迟。

订单状态还没有同步。

这个路径没有任何单独测试失败。

因为:

单个模块都正常。

真正出问题的是:

多个正确模块在某个时序下组合以后,行为变错了。

这类Bug最麻烦。

因为它不是“某个函数错了”。

而是:

系统行为覆盖不完整。


二、为什么会发生?因为测试天然只能验证“已知问题空间”

任何测试都需要先知道:

要测试什么。

比如:

登录成功。

登录失败。

Token过期。

权限不足。

这些都是已经被定义出来的行为。

但真实系统里还有大量:

你没有想到的组合。

没有写进测试的历史行为。

没有记录的边界条件。

没有显式定义的上下游依赖。

所以测试本质上只能覆盖:

Known Cases。

但事故往往来自:

Unknown Combinations。

这就是为什么:

测试越多,不代表风险自动归零。


三、工程机制:真正的问题不是Coverage低,而是Coverage维度不完整

很多团队讨论测试质量时,会看:

代码覆盖率。

比如:

80%。

90%。

95%。

但代码覆盖率回答的是:

哪些代码被执行过。

它并不能回答:

这些代码组合起来的所有行为是否都被验证。

举个简单例子。

一个函数有三个分支:

A。

B。

C。

测试可能全部跑到。

代码覆盖率100%。

但如果真实Bug来自:

A之后紧接着B,再进入C。

单独覆盖每个分支,也不代表这个组合路径被验证。

所以真正应该区分:

Code Coverage

代码有没有跑到。

和:

Behavior Coverage

关键行为有没有被验证。

AI Coding时代,后者越来越重要。


四、为什么AI更容易制造“测试全绿”的错觉?

因为AI特别擅长补测试。

它改完代码以后,很容易顺手:

增加单元测试。

增加边界测试。

增加异常测试。

这当然是好事。

但也会带来一个心理效应:

测试数量变多。

人就更容易相信:

“应该已经覆盖得很全面。”

问题是:

AI生成的测试通常和它当前理解的问题空间高度一致。

也就是说:

AI先假设问题是什么。

然后按这个假设修代码。

再围绕这个假设补测试。

如果最开始的问题模型就漏掉了一个关键变量,

后面的测试也可能一起漏掉。

这时候就会出现:

代码和测试同时对同一个错误假设保持一致。

表面上看:

完美绿色。

实际上:

只是一起漏了同一个问题。


五、为什么复杂系统里“组合行为”比单点测试更危险?

因为真实系统通常不是一个函数。

而是很多模块联动:

认证。

缓存。

数据库。

消息队列。

支付。

订单。

权限。

单独看:

每个模块都正常。

但组合起来,可能因为:

顺序。

延迟。

重试。

并发。

状态变化。

产生新的行为。

这就是典型的:

Interaction Risk。

测试如果只验证模块内部,

就容易漏掉:

模块之间的组合风险。

AI一次改多个模块时,这个问题尤其明显。


六、为什么未来这个问题会越来越严重?

因为Agent一次处理的任务会越来越大。

以前:

AI改一个函数。

测试范围也比较小。

现在:

跨多个文件。

跨多个模块。

以后:

整个Feature。

甚至整个业务链。

任务范围越大:

行为组合数量越多。

理论上可能出现的状态空间也越大。

测试不可能穷举所有组合。

所以未来AI Coding不能只追求:

更多测试。

而要追求:

更关键的测试。

也就是:

最可能暴露系统风险的那些路径。


七、自测指标:测试盲区率

这里可以建立一个简单指标:

测试盲区率

它不是看测试数量。

而是看:

关键业务行为里,有多少只能靠“我们觉得应该没问题”来判断。

可以问自己:

第一,关键业务有没有跨模块测试?

如果只有单元测试:

盲区可能较大。

第二,异常组合有没有覆盖?

比如:

超时 + 重试。

缓存失效 + 并发。

消息重复 + 状态延迟。

如果完全没测:

盲区高。

第三,AI修改的行为有没有历史兼容测试?

如果旧行为没人定义:

风险高。

第四,测试失败时,你能不能确定它对应真实业务风险?

如果测试只是机械覆盖:

价值有限。


八、怎么降低测试盲区?

第一:从“测代码”转向“测行为”

不要只问:

这几个函数有没有测试。

要问:

用户真正会经历哪些关键路径?

比如订单:

创建。

支付。

取消。

退款。

重试。

异常。

围绕业务路径设计测试,比围绕函数更有价值。


第二:增加组合场景测试

复杂系统最容易出问题的地方是组合。

尤其:

并发。

重试。

超时。

状态切换。

这些场景应该成为AI改代码后的重点验证区域。


第三:让AI主动列出“未覆盖行为”

任务完成以后,不只让AI说:

“测试通过。”

还要让它回答:

哪些关键行为目前没有测试?

哪些依赖关系只做了推断?

哪些场景仍然需要人工验证?

这比单纯看绿色CI更有价值。


第四:把历史事故变成长期测试资产

真正有价值的测试,很多来自:

以前出过的问题。

每一次线上事故,都应该沉淀成:

回归测试。

边界测试。

监控规则。

这样系统的Behavior Coverage才会真正积累。


九、为什么测试全绿时,不应该盲目增加AI产出?

如果现在AI每天生成越来越多代码。

但你的测试主要还是:

单元级。

局部级。

缺乏跨模块验证。

那么扩大AI产出,只会让测试盲区更大。

因为:

生成速度上去了。

但Behavior Coverage没有同步提升。

所以先补:

测试结构。

关键路径。

组合场景。

再扩大Agent执行规模。


十、Plus什么时候通常够用?

如果你的任务主要是:

小模块。

明确Bug。

局部功能。

依赖简单。

AI改动范围小。

测试也容易覆盖关键行为。

那么:

Plus通常已经够用。

因为你的测试盲区本身比较有限。


十一、什么时候Pro才真正匹配?

更接近Pro的状态是:

你已经有成熟测试体系。

包括:

单元测试。

集成测试。

关键业务路径。

组合场景。

回归测试。

AI修改后可以快速暴露大部分风险。

但真实工作仍然需要:

大型Repository。

跨模块Agent任务。

复杂系统分析。

长时间执行。

多任务并行。

这时候更高AI能力才更容易真正转化成效率。

判断逻辑不是:

“测试越多,所以我要Pro。”

而是:

“我已经有能力验证更大范围的AI修改,现在AI侧能力才成为瓶颈。”


最后:AI时代真正重要的不是“测试有没有绿”,而是“我们到底测到了什么”

测试全通过当然是好事。

但它不是终点。

真正应该问的是:

这些测试覆盖了哪些行为?

还有哪些关键路径没有覆盖?

哪些风险来自模块组合?

哪些假设仍然没有被证明?

因为未来最危险的情况,不一定是:

测试失败。

而可能是:

测试全部通过,但测试根本没有问到真正危险的问题。

如果你的项目简单、行为边界清楚:

Plus通常够用。

如果测试体系已经成熟,而复杂Agent任务持续扩大:

Pro才真正开始匹配。

未来AI Coding真正可靠的标准,不是:

“CI全绿。”

而是:

关键行为真的被验证过。

持续更新Codex、大模型开发相关技术内容。
长期使用各类代码大模型,整理了稳定的AI会员订阅渠道,有需要可自取!

Logo

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。

更多推荐