

当 AI Agent 被引入测试流程时,大多数团队最初的感受是惊喜:它能读懂需求、生成脚本、自动执行、输出报告,像一个不知疲倦的初级工程师。但很快,第二种感受接踵而至——困惑,甚至恐慌。
Agent 开始“编造”测试路径。它自信地调用了一个并不存在的接口,断言了一个从未在代码中定义过的字段,或者针对一个早已废弃的模块生成了一整套用例。这些错误不是偶发的,而是系统性的。因为 Agent 的核心能力来自语言模型,而语言模型天然擅长“听起来合理”,而不是“事实正确”。
这就是“幻觉”问题在测试场景中的具体形态,也是本文要正面回应的核心矛盾。
解决这个问题,本质上是在讨论两种不同的 Agent 设计哲学的对比:“纯语言驱动”与“语言 + 静态分析驱动”。前者依赖模型对上下文的推断,后者在此基础上嵌入了对代码结构的确定性理解。这两种模式的差距,不是性能优化层面的差距,而是可靠性架构层面的本质分野。
文章将从以下维度展开:
语言模型的工作机制,是在给定上下文中预测最可能的下一个 token。这意味着它非常擅长做模式匹配和类比推断,但对于“这个函数在当前代码库中是否真实存在”这类需要精确事实查询的问题,它的回答本质上是一种概率估计,而非确定性查找。
一个典型场景:测试 Agent 被要求为用户登录模块生成接口测试用例。它根据 PRD 的描述,生成了调用 /api/v2/user/login的测试脚本。然而当前代码库的接口版本早已升级到 v3,v2 端点已被删除。Agent 不知道这件事,因为它没有被告知,也没有能力自己去查。
这不是 Agent 不够聪明,这是设计边界问题。
在文本生成、代码补全等场景中,幻觉的代价是“质量略差”;但在测试场景中,幻觉的代价是虚假的安全感。一套基于幻觉生成的测试用例,不仅不能发现缺陷,还会让团队误以为这个功能已经被覆盖了。这是测试领域最危险的状态——不是没有测试,而是有了“假测试”。
静态分析与语言模型的本质区别正在于此:静态分析处理的是代码事实,语言模型处理的是语言概率。两者并非对立,而是需要在架构层面明确各自的职责边界。
一个没有静态分析支持的测试 Agent,对代码库的理解方式类似于一个只读过需求文档、从未看过代码的新人测试工程师。他能写出“看起来合理”的用例,但无法保证用例中引用的接口、参数、数据结构与实际代码一致。
这种模式在代码库稳定、规模较小时问题不突出。一旦代码库进入快速迭代期,接口频繁变更,Agent 生成的脚本与真实代码之间的“漂移”会迅速累积。
静态分析工具(如 AST 解析器、类型检查器、代码图谱工具)能从代码本身提取确定性信息:
把这张“代码地图”作为 Agent 的输入上下文,等于给了它一套可信的事实基准。它不再需要推断接口是否存在——它知道。
这一步的核心价值,是把 Agent 的工作从“全概率推断”变成“在事实约束内的推断”,将幻觉的发生空间从整个代码宇宙压缩到一个有边界的已知集合。
一种常见的工程思路是:让 Agent 先生成测试脚本,再用静态分析工具对生成结果做校验,过滤掉引用了不存在接口的用例。
这个思路逻辑上成立,实践中有两个明显缺陷。
第一,校验成本高。Agent 可能生成了 200 条用例,其中 40 条因引用了幻觉接口而被过滤,但这 40 条用例所对应的测试意图是真实的,需要人工重新补写,代价并未消除,只是被推后了。
第二,无法校验语义错误。静态分析能发现“这个接口不存在”,但发现不了“这个接口存在,但 Agent 对它的行为理解是错误的”。后处理校验解决的是引用错误,不能解决理解错误。
更有效的架构是在 Agent 生成之前,就把静态分析的结果作为结构化上下文注入 prompt:
一个实际案例:某金融科技团队在引入这种架构前,测试 Agent 生成的脚本中约有 23% 因接口幻觉需要人工修正。引入前置注入后,这一比率降至 4% 以下,且剩余错误主要集中在业务逻辑理解层面,而非接口引用层面。
前置注入的核心优势是把约束前移,让错误不发生,而不是事后发现并修复。这是测试工程中一个古老的原则:缺陷越早被阻断,成本越低。
架构上并不复杂,但落地阻力来自两个方向。
第一是工具链的割裂。静态分析工具(ESLint、Pyright、Tree-sitter 等)和 Agent 框架(LangChain、AutoGen 等)通常由不同团队维护,缺乏统一的集成接口。
第二是上下文窗口的成本。把完整的接口清单注入 prompt,对于大型代码库可能意味着数万 token 的上下文,这既有成本压力,也有性能影响。
第一步:增量分析,只注入相关接口
不需要把整个代码库的接口都注入。根据当前测试任务的模块范围,用静态分析提取相关子图,只注入与任务直接相关的接口信息。这将上下文规模控制在可接受范围内。
第二步:变更触发,动态更新接口快照
在 CI 流程中,代码提交时自动触发静态分析,更新接口快照缓存。Agent 每次任务启动时拉取最新快照,确保事实基准与代码库同步,而不是依赖定期批量更新。
第三步:双轨验证,前置注入 + 轻量后处理
前置注入解决 80% 的引用幻觉,轻量后处理(只校验函数名和路由是否存在,不做深度语义校验)作为兜底。两者组合,在成本可控的前提下最大化可靠性。
有人会问:这套架构的投入是否值得?是否只有大团队才有条件做?
值得与否,取决于你如何评估“假测试”的风险成本。一套幻觉驱动的测试体系,给团队提供了虚假的覆盖率数字,这种虚假的安全感比没有测试更危险,因为它会抑制团队对真实风险的警觉。
这不是工具层面的优化,而是一次可靠性思维的重建。纯语言驱动的 Agent,本质上是一个“尽力而为”的系统;嵌入静态分析后,它变成一个“在事实约束内尽力而为”的系统。这个区别,决定了它能不能真正承载生产级别的测试责任。
给有意推进这件事的团队几条建议:
测试的核心价值,从来不是生成了多少用例,而是为团队提供了多少真实可信的质量信号。当 Agent 的每一条输出都有事实锚点作为支撑,这个信号才真正值得信赖。
这件事做好了,技术团队获得的不只是效率,而是对自己系统质量的真实掌控感——这是比任何自动化指标都更重要的工程成熟度标志。