一个编码 agent 一周能开 40+ 个 pull request,而一个人一小时只能认真读懂几个 diff。当代码生成的速度提升了 2-5 倍、而测试和验证还停留在人肉速度时,多出来的速度不是生产力——是一队排得越来越长的、没人检查过的变更。
这篇文章深读的对象有点特别:不是论文,不是框架源码,而是一份厂商术语表——AI 测试公司 Shiplight 发布的 AI 测试词汇表,20 个词条。我用 scrapling 把全部词条页面抓下来通读了一遍。
如果你只带走一句话,就带走这个:
AI agent 接管代码编写之后,软件工程的稀缺资源从”写代码的手”变成了”验证代码的注意力”。谁先给这个新瓶颈里的概念命名,谁就拿到了这个品类的定义权——这份术语表就是一次公开的命名行动。
所以这篇文章要做两件事:一是把术语表里真实存在的工程问题和值得偷走的心智模型挖出来(这部分有独立学术研究背书);二是示范怎么带着防伪眼镜读厂商内容——哪些是真问题,哪些是抢定义权,哪些是营销数字。
先交代读法:一份术语表的三层成分
打开这份术语表的任何一个词条,结构都一样:定义、为什么重要、和相邻概念的区别——然后不出意外地拐到”这正是 Shiplight 解决的问题”。20 个词条,每一个都通向同一个产品。
这不是缺点,是体裁。厂商术语表是一种经典的品类营销:HubSpot 定义了 “inbound marketing”,HashiCorp 定义了 “infrastructure as code” 的一半词汇。创造词汇的人不需要说服你买它的产品,只需要让你用它的词思考问题。 读这类内容的正确姿势是分三层拆:
- 真问题层:它描述的工程矛盾是否真实存在?——需要独立来源交叉验证;
- 概念层:它铸造的术语和区分是否有认知价值?——好的区分即使脱离产品也站得住;
- 数字层:“效率提升 10 倍"" QA 时间从 60% 降到接近零”——这些是客户案例式营销数字,默认不可迁移到你的团队。
下面按这个顺序来。
真问题:速度失衡是结构性的
术语表里最有分量的两个词是 Coverage Decay(覆盖率衰减)和 AI Test Debt(AI 测试债),它们描述同一个失衡的两个侧面。
覆盖率衰减的洞察在于把覆盖率从”状态”改成了”速率”:
覆盖率缺口(gap)是一个状态,衰减(decay)是一个速率。一个团队可以带着 90% 的总覆盖率,同时只有 30% 的”近期变更覆盖率”——前者是虚荣指标,后者才是真信号。
这个区分是有牙齿的。总覆盖率是滞后指标,衡量的是历史上写过多少测试;变更表面覆盖率(changed-surface-area coverage,最近 30 天被修改的代码里有直接测试覆盖的比例)衡量的是你的测试是否跟得上当下的变更速度。当 agent 把代码速度拉高 2-5 倍而测试还靠人写时,衰减速率转正,缺口每个 sprint 复利式扩大。
AI 测试债则把这笔债拆成三种成分,这个分类学值得记下来:
| 债务成分 | 是什么 | 症状 |
|---|---|---|
| 覆盖债 | 新代码路径没有测试就上线 | 变更覆盖率持续走低 |
| 稳定债 | flaky 测试堆积,被隔离后无人修复 | 隔离名单只增不减 |
| 归因债 | 测试靠”选错了元素”侥幸通过,真回归被掩盖 | 测试通过率很高,生产事故却在上升 |
第三种最阴险:测试全绿和生产事故率同时上升,说明你的测试在测一个已经不存在的应用。
这个失衡有独立研究背书吗?有。关键在于 AI 生成代码的错误形态和人类不同。两项实证研究值得引用:
- 《Bugs in Large Language Models Generated Code》(arXiv:2403.08937)分析了 333 个 LLM 生成代码的 bug,归纳出 10 种模式——误解需求、遗漏边界情况、幻觉对象、prompt 偏置代码等,多数能通过编译、看起来合理;
- 《What’s Wrong with Your Code Generated by Large Language Models?》(arXiv:2407.06153)直接给出了术语表反复引用的那个判断的学术版本:LLM 代码幻觉指”语法上可信(syntactically plausible)但功能不正确或语义无意义”的生成。
也就是说,“AI 代码常常语法正确但语义错误”不是厂商发明的恐吓,是实证文献的一致发现。人类写错代码往往错得明显(编译不过、逻辑乱),LLM 写错代码错得体面——这正是”看 diff”式人工审查失效的原因:reviewer 无法在脑子里执行代码,而 AI 的错误恰好只在执行时暴露。
顺带一提,“让 AI 写测试来追上 AI 写代码”这条路也已有工业级证据:Meta 的 TestGen-LLM(arXiv:2402.09171)在 Instagram/Facebook 上部署 LLM 改进单元测试,75% 的生成测试能构建、57% 稳定通过、25% 提升了覆盖率,73% 的推荐被工程师接受进入生产。注意这些数字的诚实之处:远不是全自动,但方向成立。
概念层之一:一根轴分清四个容易混的词
术语表里最有认知价值的部分,是它花了四个词条去区分四个市场上被用烂的标签:AI-augmented、AI-native、agentic、agent-native。拆开来其实是两个独立的问题:
- 谁在操作测试循环?——人操作、AI 辅助(augmented);还是 AI 操作、人审结果(native / agentic);
- 谁能调用这个工具?——只有人能点 dashboard(human-only);还是编码 agent 能通过 MCP 之类的协议直接调用(agent-native)。
| 术语 | 回答的问题 | 一句话判据 |
|---|---|---|
| AI-augmented | 谁操作循环 | 人开车,AI 是副驾:智能定位器、用例建议、脚本补全 |
| AI-native / agentic | 谁操作循环 | AI 开车:从意图生成测试、执行、解读结果、自愈,人定政策审结果 |
| Agent-native | 谁能调用 | 工具把核心能力暴露成 agent 可调用的接口(典型是 MCP),编码 agent 是一等用户 |
这两个维度是正交的:一个系统可以内部跑满 agent(agentic)但不对外暴露任何 agent 可调用接口(非 agent-native);也可以只是暴露了 API 但自身毫无自主行为。术语表给出的防伪测试很实用——“一个编码 agent 能不能在任务中间自主调用这个工具?还是必须由人切换到另一个界面去操作?” 如果是后者,无论营销文案怎么写 “AI-native”,它都是 augmented。
这个区分对读者的价值超出测试领域:2026 年几乎所有开发工具都在做同样的架构转身——从”给人用的产品里加 AI 功能”到”把产品能力暴露给别人的 agent 调用”。MCP(Anthropic 于 2024 年 11 月发布)之所以重要,就是因为它把第二个问题标准化了。
概念层之二:值得偷走的心智模型——定位器是缓存
20 个词条里最漂亮的一个想法藏在 Intent-Cache-Heal 模式里,可以概括成一句话:
测试的真值(ground truth)是”用户想操作的那个元素”,CSS 选择器只是上一次解析这个真值得到的缓存。UI 变了,不是测试坏了,是缓存失效了。
传统 E2E 测试的脆弱性由此有了一个干净的解释:脚本把缓存(选择器)当成了真值本身,所以每次 UI 重构——类名改了、DOM 挪了、A/B 测试换了布局——缓存失效就等于测试失败,尽管用户可见的行为一点没变。而纯 AI 解析(每一步都让模型看页面找元素)等于永远不走缓存:能扛住 UI 变化,但慢、贵、不确定。
Intent-cache-heal 就是给这个缓存补上标准的缓存语义:
flowchart LR
A[测试步骤<br/>记录的是意图] --> B{缓存的定位器<br/>还能命中吗?}
B -->|命中| C[确定性执行<br/>脚本级速度]
B -->|失效| D[AI 从意图重新解析元素]
D --> E{元素是移动了<br/>还是消失了?}
E -->|移动了| F[更新缓存 + 产出可审查的 diff]
E -->|消失了| G[报告真实 bug<br/>而不是把测试改到通过]
日常运行走缓存(确定、快),UI 真变了才触发 AI 重解析(heal),且每次 heal 都产出一个人能审的 diff。AI 的成本被限制在缓存失效路径上,而不是每步每次运行都花。
这个模型同时照亮了 Self-Healing Test(自愈测试)的危险面——术语表自己也承认这一点,这是它比较诚实的地方:
如果 “Submit” 按钮被删掉了,而自愈层找到了一个 “Save” 按钮凑数,测试会错误地通过。
静默的自愈等于把归因债自动化。所以生产级自愈必须满足:每次 heal 以 diff 形式浮出水面供人审查;区分”元素移动了”和”元素没了”——前者修缓存,后者报 bug。判断一个自愈方案靠不靠谱,就问这两条。
概念层之三:验证是反馈闭环的缺失半环
把视角拉高一层,这份术语表真正在讲的是 agent 时代的反馈闭环问题。
术语表里 Context Engineering 词条对来龙去脉的记述是准确的(我交叉核实过):2025 年 6 月 18 日 Shopify CEO Tobi Lütke 发推提出”上下文工程是为任务提供全部上下文、使之对 LLM 可解的艺术”,一周后 Karpathy 转发背书,同年 9 月 Anthropic 的工程博客将其系统化,学术界随后跟进——中科院团队的综述 《A Survey of Context Engineering for LLMs》(arXiv:2507.13334)梳理了 1400+ 篇相关论文。这个词的走红轨迹本身就是”命名即定义权”的又一例证。
而术语表在这个公共概念上做了一个有意思的私货嫁接:验证结果是最高信号的上下文。规格说明描述的是意图,测试通过/失败报告的是现实,截图展示的是渲染真相——把这些喂回 agent 的循环,才能”把猜测变成有依据的下一步”。这个说法我认为站得住:在上一篇讲 Claude 5 上下文工程的文章里我们看到 Anthropic 在删规则、留判断依据,而运行时反馈正是模型无法靠判断力凭空获得的那类依据。
沿着闭环视角,另外两个词条也就位了:
Spec-Driven Development(规格驱动开发):GitHub 在 2025 年 9 月开源了 Spec Kit,把”先写规格再让 agent 实现”固化成 Specify → Plan → Tasks → Implement 四步。术语表对它的补充批评很到位:只生成不验证的规格是愿望,不是契约——你把真值源从代码挪到了文档,但没有任何东西强制代码继续服从文档。规格驱动开发供给闭环的前半段,验证供给后半段,缺了后者,规格会腐烂成一厢情愿的文档。
Verification Agent(验证 agent):写代码的 agent 验证自己的工作有利益冲突——它倾向于确认自己的假设,写出”针对刚才那个实现恰好通过”的测试。所以验证 agent 应该是结构上独立的第二个角色:只接收意图(不接收实现),打开真实浏览器操作变更,对照意图判断行为。这是把人类 QA 独立评审的组织学原理,搬进了多 agent 流水线。作者和审计者分离——这条原理比任何具体产品都古老,也大概率比它们都长寿。
从 SRE 抄来的运维纪律
还有一组词条的思路是把 SRE 的纪律移植到测试层,移植得相当整齐:
- Test Flakiness Budget(不稳定预算):照抄 SRE 的 error budget——团队约定一个最大 flake 率(术语表建议:合并前冒烟套件 <0.5%,合并后全量 <2%,定时回归 <5%),预算烧穿就停新功能、先修 flake。“修 flake”从此不再是”人人都想做、没人排优先级”的事,而是和发版速度直接挂钩;
- Quarantine Test(隔离测试):flaky 测试不删除(丢历史)、不 skip(永久失明),而是移到不阻塞合并的独立泳道继续跑,配明确的回归标准(如连续 30 次绿灯才能回主套件)。为防止用隔离刷预算,隔离中的测试按 0.5 倍折扣继续计入 flake 预算——这个防钻空子的细节设计很见功力。
flaky 测试本身的严重性同样有独立文献支撑:对 Python 生态 22,352 个开源项目的实证研究(arXiv:2101.09077)发现 flakiness 的普遍程度与 Java 相当,且 59% 源于测试顺序依赖;JavaScript 项目的对应研究(arXiv:2207.01047)则发现并发问题(async 等待、竞态)是头号原因。这些根因没有一个会因为”测试是 AI 写的”而自动消失——事实上 agent 高速产出测试时,flake 的绝对数量只会更大,这正是预算和隔离机制在 AI 时代反而更重要的原因。
灰度:这套词汇什么时候不适用
按惯例,给这套叙事画边界。
如果你的团队代码速度仍然是人肉瓶颈——大多数团队在 2026 年依然如此——那么 augmented 工具就是合理选择,术语表自己也承认这一点(“对很多团队,augmented 是正确的一步”)。为一个还没出现的失衡提前重构测试架构,是过度设计。
营销数字要打折。“QA 维护时间从每周 60% 降到接近零"" 10 倍速建立覆盖""80% 核心回归流程数周内自动化”——这些是精选客户案例,样本量为个位数,且都出自卖方之口。对比 Meta 论文里 57% 的稳定通过率,你就知道诚实的工业数字长什么样。
最硬的开放问题术语表轻轻带过了:意图解析层本身的可靠性。整套 intent-based 叙事的地基是”AI 能从意图可靠地找到正确元素”。如果解析层不可靠,intent-based 测试只是把不确定性从选择器搬到了模型——从一种 flake 换成另一种 flake。缓存机制缓解了成本和速度,但缓存失效路径上的解析质量依然是信任链的最薄弱环节,而这恰恰是没有公开基准可查的部分。
还有一个词术语表没有收录:谁来验证验证者?当 heal 的 diff 也由 agent 生成、PR 里的验证证据也由 agent 出具时,人类审查的对象从代码变成了证据链。证据链造假(reward hacking 的测试版)在激励上完全可能——一个被”让测试变绿”驱动的 agent,和一个被”让指标变好”驱动的模型,是同一个对齐问题的两张面孔。
带走的三个模型
- 覆盖率是速率不是状态:盯变更表面覆盖率,别盯总覆盖率。这个指标切换在任何 CI 体系里今天就能做,不需要买任何产品;
- 定位器是缓存:意图是真值,选择器是缓存,UI 变化是缓存失效。凡是”自愈”方案,先问它 heal 时产不产出可审查的 diff、区不区分”元素移动”和”元素消失”;
- 作者与验证者分离:不管是人与人、人与 agent 还是 agent 与 agent,验证者只拿意图、不拿实现。这条组织学原理在多 agent 时代只会更值钱。
至于这 20 个词本身会不会成为行业标准词汇——那要看这家公司活不活得到那一天。但词汇背后的瓶颈转移是真的:代码不再稀缺之后,被验证过的代码依然稀缺。这个差价,就是接下来几年测试工具、agent 框架和对齐研究共同争夺的地盘。
参考来源
一手来源与工程实践
- Shiplight AI Glossary(本文深读对象,20 词条,厂商内容)
- Tobi Lütke 关于 context engineering 的推文(2025-06-18)、Karpathy 的背书(2025-06-25)
- GitHub Spec Kit 发布博客(2025-09)
- scrapling:本文用于抓取的开源库
- 站内相关:删掉 80% 系统提示词之后:Claude 5 时代的上下文工程新规则
arXiv 论文
- Bugs in Large Language Models Generated Code: An Empirical Study(arXiv:2403.08937)——333 个 LLM 代码 bug 的十类分型
- What’s Wrong with Your Code Generated by Large Language Models?(arXiv:2407.06153)——“语法可信、语义错误”的实证定义
- Automated Unit Test Improvement using Large Language Models at Meta(arXiv:2402.09171)——TestGen-LLM 工业部署数据
- An Empirical Study of Flaky Tests in Python(arXiv:2101.09077)——22,352 个项目,59% flake 源于顺序依赖
- An Empirical Study of Flaky Tests in JavaScript(arXiv:2207.01047)——并发是 JS flake 头号根因
- A Survey of Context Engineering for Large Language Models(arXiv:2507.13334)——1400+ 篇论文的上下文工程综述