ChatGPT、Codex实战:为什么AI测试全通过,你还是不能确定代码真的安全?
很多开发者使用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会员订阅渠道,有需要可自取!
葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。
更多推荐

所有评论(0)