软件行业里被 Agent 时代冲击得最彻底的岗位,可能不是写代码的,是测代码的——因为测试团队挨了两记:第一记打在工具上,写用例、维护脚本、探索性点点点,都在被机器接管;第二记打在被测对象上,你要测的东西本身变成了概率系统,「跑一次通过」这个测试行业的基本动作失去了意义。这篇是决策地图系列第四篇,照旧把领域拆成六个决策点、用「论文→产品」传导链判收敛。但先把第一性的分解摆在最前面,因为这个领域的一切变化都能从它推出来:测试 = 搜索问题 × Oracle 问题。
先换一个表示:测试到底是什么
Dijkstra 在 1970 年的《Notes on Structured Programming》里留下测试行业最著名的一句话:程序测试可以用来证明 bug 的存在,但永远无法证明 bug 不存在。这句话的本质是把测试定性为一个搜索问题——在近乎无穷的输入×状态×时序空间里,搜索能证伪程序的反例。搜不到不等于没有,只等于没搜到。
但光有搜索还不够。假设你找到了一个输入,程序给出了一个输出——这个输出算对还是算错? 判断「什么算对」的那个东西,学术上叫 test oracle(测试判据)。Barr、Harman 等人 2015 年的系统综述(IEEE TSE)把它钉成了软件测试的中心难题:oracle 自动化是测试自动化的最后瓶颈——搜索可以自动跑,但「期望行为是什么」这个信息必须从某处来,而它的最终来源往往是人。
所以测试的完整分解是两个正交的子问题:
用我读 AI 设计的十二条透镜里的第 ① 条和第 ⑨ 条看:搜索问题正是「苦涩的教训」的主场——人写用例是巧劲,机器搜索是算力,算力终将打败巧劲;而 oracle 问题是第 ③ 条「目标函数即命运」的主场——你给机器什么判据,它就优化什么,判据一弱就被 Goodhart(SWE-Bench+ 上 47.93% 的「已解决」经不起人工复核,就是弱判据被钻空子的实录)。
这个分解直接给出本文的主线,也是测试团队转变的一句话总结:机器拿走搜索,人上移到 Oracle。 下面六个决策点,每一个都是这条主线在具体环节上的展开;判收敛的标准与系列前三篇相同——存在论文讲清原理 + 多家生产系统落成默认组件。
决策点一:单元测试还要不要人写?——带闸门的测试生成
根本问题:LLM 让测试代码的生产成本趋近于零,但幻觉测试是负资产——一个断言错误的测试比没有测试更糟,它给错误的代码盖「已验证」的章。所以真正的问题不是「能不能生成」,是怎么在不信任生成器的前提下使用生成物。
源头论文:先看能力边界。TestPilot(arXiv 2302.06527,IEEE TSE)在 25 个 npm 包、1684 个 API 上给出 LLM 生成单测的基线:语句覆盖率中位数 70.2%,但含非平凡断言的测试占比中位数只有 61.4%——相当一部分生成测试只是「跑了没崩」,没有对行为下断言。再看工业级解法:Meta 的 TestGen-LLM(arXiv 2402.09171,FSE 2024)提出 Assured LLM-based Software Engineering(带保证的 LLM 软件工程):LLM 只负责提案,提案必须连续通过一组机械闸门——能编译、稳定通过(非 flaky)、可度量地提升覆盖——才有资格进入人的视野。数据:75% 的生成测试能构建,57% 稳定通过,25% 提升覆盖;最终推荐给工程师的改进中 73% 被接受进生产。
落地技术代表:Meta TestGen-LLM 是标杆,但更值得记住的是背后的人——Mark Harman。注意他的双重身份:2015 年那篇 oracle 综述的合著者,正是他。看清了「oracle 自动化是最后瓶颈」的人,十年后在 Meta 落地 LLM 测试生成时给出的方案,恰恰是绕开 oracle 自动化——不让 LLM 判断对错,只让它在「编译、通过、覆盖」这些免费机械 oracle 的围栏里干活。第一性认知直接决定了工程架构。
收敛度:✅ 范式收敛。「生成不设防、闸门做筛选」已是行业默认——各家 coding agent 内建测试生成,CI 充当最粗的闸门。收敛这么快的原因,用本文的定律看一眼就懂:这个环节的 oracle(编译器报错、测试红绿、覆盖率计数)全部是机器可执行的形式化判据,零人类判断。
决策点二:测试的质量谁来测?——从覆盖率到杀伤力
根本问题:决策点一的闸门里藏着一个弱点:覆盖率证明代码被执行过,不证明代码被验证过——一行代码可以被跑到一万次而没有任何断言检查它的行为。当生成测试的量暴涨,「测试的测试」从学术问题变成生产问题:这堆绿色的勾,到底拦得住多少真 bug?
源头论文:答案是上世纪 70 年代末就提出的变异测试(mutation testing,DeMillo 等人):往代码里机械地注入小故障(翻转比较符、改边界值),看测试套件能「杀死」多少个变异体——直接度量测试的杀伤力而非执行面积。它五十年没能普及的原因是变异体爆炸、算不起。Meta 的 ACH(arXiv 2501.12862,FSE 2025)把它和 LLM 拼成了闭环:不再穷举变异,而是让 LLM 针对特定关注面(如隐私合规)生成少量高相关的模拟故障,再让 LLM 生成能杀死这些故障的测试——变异杀伤率取代覆盖率,成为驱动生成迭代的反馈信号。附带发现:这样生成的测试里 51% 顺便也提升了覆盖率。
落地技术代表:还是 Meta、还是 Harman 团队(ACH 是 TestGen-LLM 的直系后继)。注意这一步在主线上的位置:决策点一的闸门用的是「免费」oracle,ACH 造的是一档更强的机械合成 oracle——「杀死已知注入的故障」是机器可判定的,但故障该往哪注入,编码的是人对「什么风险重要」的判断。人已经开始上移了。
收敛度:⚠️ 原理收敛,普及未至。变异测试的原理无争议、ACH 证明了生产可行,但行业大盘仍在用覆盖率当北极星——毕竟它便宜。判断你的团队何时该切换:当测试主要由机器生成时,覆盖率作为反馈信号必然被 Goodhart(生成器会学会「执行而不断言」),杀伤力类指标从可选变成必需。
决策点三:E2E 回归——测试团队最大人力池的 agent 化
根本问题:端到端测试贵,从来不贵在编写,贵在维护——UI 改一个 class 名,几百条 selector 脚本集体阵亡。根因是表示层级太低:把「用户能完成下单」这个意图,硬编码成了「点击 #btn-checkout」这个操作序列。表示决定成败:agent 的介入本质是把测试用例的表示从操作序列升维到意图,「意图→操作」的翻译推迟到运行时实时决策——UI 变了,翻译跟着变,脚本不再脆断。
源头论文:WebArena(arXiv 2307.13854,ICLR 2024)是「agent 能不能替人操作界面」的能力标定:在自托管的真实网站克隆上执行自然语言任务,早期 GPT-4 agent 端到端成功率只有 14.41%,人类是 78.24%。这个数字划出了两条线:下限——2023 年的 agent 远不能独立扛起 E2E;趋势——后续工作(如 AgentOccam)在同一基准上快速爬升,「意图式测试」的能力地基在以基准可见的速度变厚。
落地技术代表:这一格是创业公司最密集的战场,形态分裂成三派——QA Wolf(managed service:AI 干重活、人类 QA 工程师兜底,交付的是可审查、可进 CI 的真 Playwright 代码)、Momentic(平台派:自然语言写意图步骤,agent 自愈执行)、mabl(自愈 selector 的先行者,向 web/移动/API 全面铺 agentic testing)。三派共同点:都不敢让 agent 裸奔,都在「意图表示」和「可审计的确定性产物」之间找落点。
收敛度:⚠️ 需求收敛,形态未收敛。「自愈/意图式」已是共识,但抽象层级(交付代码还是交付服务)、信任边界(agent 判到哪一步、人从哪一步接)各家答案不同。对测试团队的岗位含义最直接:E2E 脚本维护员这个工种正在消失,接替它的是「意图规约的作者 + 自愈结果的审计员」。
决策点四:找 bug 的搜索权交给算力——fuzzing 的 LLM 化
根本问题:回到 Dijkstra——测试是搜索反例。人写用例只能覆盖人想得到的角落,而 bug 的定义几乎就是「人想不到的角落」。fuzzing(模糊测试:机器海量生成畸形输入轰炸程序)五十年来一直是「算力打巧劲」的正面样本,它能全自动的根本原因值得用本文的框架点破一次:崩溃、内存越界、sanitizer 报警是「免费 oracle」——不需要任何人告诉机器「期望行为是什么」,程序崩了就是错了。oracle 完全形式化,搜索就能百分之百交给算力。
源头与落地(这一格论文和产品是同一家):Google 的 OSS-Fuzz 引入 LLM 生成 fuzz target 后,2024 年 11 月报告了一个里程碑:26 个新漏洞全部由 AI 生成或增强的 fuzz target 发现,其中 CVE-2024-9143 是 OpenSSL 里潜伏了约二十年的越界写——Google 明确说它「用现有人写的 fuzz target 不可能发现」,因为行覆盖不等于无 bug:同一行代码在不同状态、标志、配置下行为不同(这正是决策点二「覆盖率幻觉」的安全版)。规模数据:AI 生成的 fuzz target 已给 272 个 C/C++ 项目新增超过 37 万行代码覆盖。同期的 Big Sleep 项目更进一步,让 LLM agent 模拟安全研究员的工作流,找到了 SQLite 的一个零日漏洞。
收敛度:✅ 收敛——但边界清晰。注意收敛的疆界恰好画在 oracle 的疆界上:内存安全类 bug 有免费 oracle,所以全自动;业务逻辑 bug(转账金额算错但程序不崩)没有免费 oracle,fuzzing 就无能为力。想把 fuzzing 的算力优势延伸到业务逻辑,就得人工补 oracle——写不变量断言、属性检查。又是同一条主线:机器把有形式化 oracle 的搜索空间清扫得越干净,剩下的人类工作就越纯粹地聚焦在「造 oracle」上。
决策点五:不确定的世界怎么复现?——确定性模拟测试
根本问题:分布式系统的 bug 是「特定消息时序 × 特定故障组合」的产物,生产环境撞上一次,实验室里可能永远复现不出来。复现不了就没法回归,没法回归等于没修。这个问题在 Agent 时代加倍成立——LLM 系统本身就是新的不确定性发生器,「上次跑挂了这次跑过了」正在成为 agent 工程的日常。
源头思想:FoundationDB(后被 Apple 收购)的模拟测试:把整个数据库集群跑在单线程确定性模拟器里,所有 I/O、时钟、网络都是模拟的,任何 bug 都能用同一个随机种子精确重放。代价是整个系统必须为模拟而设计——对已存在的系统不现实。Antithesis 的反转是这一格的第一性亮点:既然让每个系统适配确定性太难,那就让计算机本身确定性——他们花五年造了一个确定性 hypervisor(虚拟机管理层),任何 x86 二进制放进去,硬件、网络、时钟全部确定性模拟,指令级可重放。在这个「确定性气泡」里再叠加自主探索:覆盖率引导的状态空间搜索 + 主动故障注入,发现有趣状态就快照分叉。这是「表示决定成败」的教科书案例——把「测试适配系统」这个不可解的问题,重新表示成「系统跑在确定性底座上」这个可解的问题。
落地技术代表:Antithesis(创始人 Will Wilson 正是 FoundationDB 测试体系的缔造者之一,2018 年创立、憋了五年才出 stealth);etcd 用它做自主鲁棒性测试(团队埋的「已知旧 bug」被全部找回),WarpStream 用它模拟整个 SaaS,CockroachDB 撰文背书。
收敛度:⚠️ 原理收敛,采用未普及。确定性模拟的价值无争议,但底座级方案贵、自建门槛极高,目前是「买得起的用 Antithesis、买不起的手写 DST」的分裂态。对测试团队的启发先于工具本身:给不确定系统做测试的第一步,是把不确定性关进笼子(种子化、可重放),第二步才是搜索——这个顺序对 agent 系统同样成立,也是下一个决策点的铺垫。
决策点六:被测对象变成概率系统——Agent Evals 是 QA 的新考卷
根本问题:前五个决策点里,被测对象还是确定性程序,变的只是测试工具。这一格反过来:被测对象本身是概率系统。两条测试行业的公理同时失效——「跑一次通过=通过」失效,因为同样输入下次可能失败;「预期输出写进断言」失效,因为合格的回复有无数种说法。oracle 问题以最尖锐的形态回归:一个 agent 帮用户改签机票,怎么用机器可执行的方式判定它「做对了」?
源头论文:τ-bench(arXiv 2406.12045,ICLR 2025)给了两个漂亮的构件。第一个解 oracle:不判对话判世界——不去评价 agent 说得好不好(不可形式化),只比对任务结束后数据库终态与标注的目标终态是否一致(完全形式化)。把「服务质量」投影到「世界状态」上,判定重新变得机器可执行。第二个解概率:pass^k 指标——同一任务独立跑 k 次全部成功才算数,度量的不是能力而是可靠性。数据触目惊心:当时最强的函数调用 agent(gpt-4o)单次成功率不足 50%,零售域的 pass^8 掉到 25% 以下——「平均能做对」和「每次都做对」之间隔着一整个工程学,而生产环境要的是后者。
落地技术代表:Sierra(论文作者 Shunyu Yao、Karthik Narasimhan 等,客服 agent 赛道)把这套方法作为产品验收的地基,τ-bench 一系(τ²-bench 等)已成 agent 厂商的标配考卷;配套的第二信号是 LLM-as-judge(模型当裁判),但要带着《独立验证真空》里 Panickssery 的警告用——模型裁判偏爱自家生成物,裁判信号与生成信号同源时证据价值打折。我在 AgentBench 笔记里盘过通用 agent 基准的谱系,τ-bench 的差异化正是把「用户模拟 + 政策约束 + 终态判定」拼成了更接近生产验收的形状。
收敛度:❌ 未收敛——整张地图上最该投人的 explore 区。终态比对只覆盖「有明确世界状态」的任务;开放任务的判定、政策符合性的度量、pass^k 的 k 该取几、统计显著性怎么算——全在演化中。但恰恰因为不收敛,这里是测试团队新护城河的位置:Evals 是新的 PRD——谁来给概率系统写可执行的验收标准?这是 QA 的第一性技能(设计判据)在新对象上的直接迁移,是整个转型里最顺的一条跑道。
合成:地图、定律,和测试团队的新工作清单
| 决策点 | 默认答案 | 技术代表 | 源头论文/来源 | 收敛度 |
|---|---|---|---|---|
| 测试生成 | LLM 提案 + 机械闸门筛选 | Meta TestGen-LLM | 2302.06527;2402.09171 | ✅ 范式收敛 |
| 测试的质量 | 杀伤力(变异)替代覆盖率做反馈信号 | Meta ACH | 2501.12862 | ⚠️ 原理收敛,普及未至 |
| E2E 回归 | 意图式用例 + agent 自愈执行 | QA Wolf / Momentic / mabl | 2307.13854(能力标定) | ⚠️ 需求收敛,形态未收敛 |
| 缺陷搜索 | LLM 生成 fuzz target,算力清扫 | Google OSS-Fuzz / Big Sleep | Google Security Blog 2024-11 | ✅ 收敛(限免费 oracle 域) |
| 不确定性复现 | 确定性底座 + 自主探索 | Antithesis / FoundationDB 系 | DST 文档与 etcd 实录 | ⚠️ 原理收敛,采用未普及 |
| 概率系统验收 | 终态 oracle + pass^k 统计判据 | Sierra τ-bench 系 | 2406.12045 | ❌ 未收敛 |
把六格的收敛度排个序,规律一眼可见:fuzzing(crash 免费 oracle)✅ → 测试生成(编译/红绿机械 oracle)✅ → 变异杀伤(合成机械 oracle)⚠️ → E2E(意图 oracle,半形式化)⚠️ → DST(属性 oracle,要人写不变量)⚠️ → agent evals(政策/意图 oracle,最难形式化)❌。于是:
Oracle 梯度定律:一个测试环节被机器接管的速度,等于它的判定标准能被形式化的程度。
这其实是上一篇「接口冻结」定律在测试域的投影——oracle 就是测试组件的上游接口:crash 语义四十年前就冻结了,所以 fuzzing 最先收敛;「agent 该不该这么做」的判据跟着产品政策天天变,所以 evals 最不收敛。四篇的元规律至此连成一串:抄收敛的、探未收敛的(应用层)→ 离物理越近越收敛(Infra)→ 收敛速度=上游接口冻结速度(计算层)→ 判定标准即接口,可形式化即冻结(测试层)。
最后兑现标题的承诺——测试团队的工作内容转变,六格各对应一行:
- 写单测 → 设计生成闸门:定义什么样的生成测试有资格合入(决策点一)
- 追覆盖率 → 管杀伤力:给「测试的质量」立可执行的度量(决策点二)
- 维护 E2E 脚本 → 写意图规约、审计自愈结果(决策点三)
- 手工设计边界用例 → 写不变量和属性,把搜索让给算力(决策点四、五)
- 执行验收 → 设计验收:给概率系统写 evals 和统计判据(决策点六)
五行拼起来是同一句话:测试团队不再生产「判定的执行」,转而生产「判定的定义」。 这和验证瓶颈一文的结论在测试岗位上落地成了同一件事——生成不再稀缺之后,稀缺的是验证的设计权。而 Barr 和 Harman 2015 年就把这一切写在了综述里:oracle 的最终来源是人。机器接管的每一格,都是 oracle 已经形式化的格子;人守住的每一格,都是 oracle 还需要人类意图的格子。岗位没有消失,岗位沿着梯度上移了。
照例的诚实提醒 + 亲手实验:本文所有数字(70.2%、61.4%、73%、51%、14.41%、26 个漏洞、37 万行、pass^8<25%)都有来源,无一亲手复现。这一篇的实验入口是四篇里最便宜的,一小时能拿到亲手的数:选自己仓库的一个核心模块,让 coding agent 生成一套单测并记下覆盖率;然后亲手注入 10 个小 bug(翻转一个比较符、改一个边界值、删一行校验——这就是手工变异测试),数生成的测试杀死几个。 覆盖率和杀伤率这两个数字的差,就是你亲手测得的「覆盖率幻觉」,也是 ACH 那篇论文的最小复现。排进实验队列。
参考来源
arXiv 论文
- Schäfer et al., An Empirical Evaluation of Using Large Language Models for Automated Unit Test Generation(2302.06527,IEEE TSE)
- Alshahwan, Harman et al., Automated Unit Test Improvement using Large Language Models at Meta(2402.09171,FSE 2024)
- Foster, Harman et al., Mutation-Guided LLM-based Test Generation at Meta(2501.12862,FSE 2025)
- Zhou et al., WebArena: A Realistic Web Environment for Building Autonomous Agents(2307.13854,ICLR 2024)
- Yao et al. (Sierra), τ-bench: A Benchmark for Tool-Agent-User Interaction in Real-World Domains(2406.12045,ICLR 2025)
- Wang et al., Software Testing with Large Language Models: Survey, Landscape, and Vision(2307.07221,IEEE TSE 2024)
- Aleithan et al., SWE-Bench+: Enhanced Coding Benchmark for LLMs(2410.06992)
经典与工程实录
- Barr, Harman, McMinn, Shahbaz, Yoo, The Oracle Problem in Software Testing: A Survey(IEEE TSE 41(5), 2015)
- Google Security Blog, Leveling Up Fuzzing: Finding More Vulnerabilities with AI(2024-11)
- Antithesis Docs, Deterministic Simulation Testing
- etcd Blog, Autonomous Testing of etcd’s Robustness(2025)
系列前篇与本站相关文章