当 AI 接管编码工作,软件工程的重心全面收拢到两端:精准定义需求与严格验证交付。传统 Gherkin 缺乏严密的守卫条件,容易让 Agent 脑补规则。引入清晰的条件守卫与双 Agent 隔离,是解决测试假绿灯的关键路径。

如果 AI Agent 已经能独立编写业务代码,人类工程师的阵地就只剩下流水线的两端:说清楚要做什么,以及验证它是否真的做对了。
但这套流水线的下游验证环节,正在遭遇新的挑战。
让 Agent 直接从验收标准(Acceptance Criteria)生成测试用例,通常会走向两种极端,且都会导致验证失效:
现金存量 ≥ 取款金额。生成的测试全部亮绿灯,逻辑自洽,却在实际面额找零逻辑上全盘皆错。没人会察觉异常,因为代码和测试看起来都“完美符合预期”。扩展后的需求格式改变了这一现状,它将不同的语义直接映射到对应的测试层级:
可组合找零)完全符合定义者声明的逻辑。规则不再需要 Agent 去猜。它被明确写在 Provided 守卫中,其术语在词汇表里有据可查。如果某个概念未被定义,Agent 会立刻停下来报告缺口,而不是悄悄替人类做决定。
比语法格式更重要的,是一条架构原则:测试代码与业务代码绝不能来自同一个上下文。
如果同一个 Agent 基于它对需求文档的同一次理解,既写了业务代码又写了测试用例,它犯下的逻辑错误就会在两端完美同步。测试变成了给代码背书,而不是检验代码。只有当两种解读完全独立时,验证才有实际意义。
更合理的工作流应当引入双 Agent 机制:
一种更为激进的做法是:让编码 Agent 只能看到测试用例,完全接触不到原始需求。测试本身构成了全部的交付契约。测试 Agent 没能转译出来的逻辑,编码 Agent 就绝不会去实现。这种模式能强迫所有隐性假设浮出水面,但也伴随着三大风险:
if amount == 80: return false)。基于属性的测试能遏制这种投机,但单纯的用例测试防不住。为了规避这些问题,可以借用机器学习中的**留出集(Hold-out set)**机制:无论允许编码 Agent 查看多少测试,都必须保留一部分隐藏的测试用例(最好是基于属性的测试)专门用于最终验收。如果在可见测试上全绿、在隐藏测试上报错,就说明代码出现了过拟合。
这种思路并不新鲜。早在 20 世纪 80 年代,IBM 联邦系统部门推行的洁净室软件工程(Cleanroom Software Engineering)就规定:测试必须由完全不了解内部实现的独立认证团队负责。开发人员在交工前甚至不允许自行运行代码。在过去,由于人力成本高昂,洁净室工程只能局限在极少数要求严苛的工程团队中;但在多 Agent 协作体系下,双重隔离的边际成本几乎归零。
人工肉眼审阅单条业务规则并不难,但一个运行多年的中大型系统往往堆积了成百上千条规则。显式的守卫条件(Guard)让整套系统具备了形式化分析的可能,使三类冲突无所遁形:
只要词汇表对业务条件的定义足够精准,Agent 就能将守卫逻辑转化为形式化表达式,直接交给 Z3 等约束求解器(Constraint Solver)。Agent 负责翻译,求解器负责计算裁决。判断两个守卫是否存在逻辑冲突,不再依赖工程师对自然语言文字游戏的推敲。而在传统的自然语言需求里,这些冲突通常被掩埋在字里行间,直到线上出故障才被发现。
同时,规则集本身必须动态维护。它应当是当前系统行为的活文档,而不是历史用例的垃圾堆。过期的废弃规则必须剔除,否则相互矛盾的陈旧示例会让系统维护成本呈指数级上升。增量检测应该发生在变更的瞬间:每次新增或修改规则时,只校验该规则及其邻近依赖,而非全局无休止全量重跑。
现实中总有一些盲区只能在线上暴露:客诉工单、线上故障、用户意想不到的操作习惯。这些反馈必须快速回流到规则集与词汇表中。失去这层闭环,所谓的“前置精确规范”无非是预算更高的瀑布模型。
这一套方案并不能打造出在数学上绝对正确的完美软件。形式化验证只能证明“代码是否忠实于需求规范”,却永远无法自证明“需求规范本身是否正确”。检验者本身也需要被检验。
在项目初期,验收标准本质上只是团队关于“什么功能有用”的猜想。将其当作既定真理并固化为绿灯测试,只会用确定的假象掩盖真实的不确定性。规范语法的价值不在于消除不确定性,而在于将其显性化:未定义的术语、缺失的兜底逻辑、未从正反两面校验的边界守卫,都会被摆上台面。
务实的目标不是零缺陷,而是尽早且低成本地暴露错误。Guarded Gherkin 所做的,就是给条件守卫一个专属位置,让负向场景成为必填项,让模糊地带作为未定义术语直接报错,阻断下游 Agent 自作主张替人类做决策的漏洞。
免费获取企业 AI 成熟度诊断报告,发现转型机会
关注公众号

扫码关注,获取最新 AI 资讯
3 步完成企业诊断,获取专属转型建议
已有 200+ 企业完成诊断