软件测试的
新纪元
Redis 作者 Salvatore Sanfilippo 提出了一个简洁有力的观点:AI 写代码有质量妥协,但在 QA 领域没有。LLM 不是在替代测试,而是在打开一个全新的质量维度。
核心观点
antirez 的论证结构异常清晰:承认 AI 编程的局限性,然后精准定位到它真正无争议的优势领域。
一、AI 编程的诚实评估
antirez 没有像大多数人那样要么吹捧 AI 无所不能,要么全盘否定。他的判断非常精确:AI 生成的代码在结构质量和复杂度控制上,比不上顶级工程师手写的代码。但比"还不错的手写代码"要好。
我的感觉是,自动编程在大多数情况下(如果管理得当)超过了"还不错的手写代码"的质量。
My feeling is that automatic programming surpasses most of the times (and if well managed) the quality of decently developed hand-written code.
这是一个从实战中来的判断,不是从 demo 里来的。antirez 的意思是:AI 写不了艺术级的代码,但能写出超过平均水平的代码。对大多数项目和大多数团队来说,这个定位已经足够有用了。
二、关键转折:QA 是无妥协区
文章的核心洞察在于区分了两种场景:写新代码时存在质量-时间的 tradeoff(这个 tradeoff 可能非常残酷——几个月的项目压缩到几周),但在 QA 领域,LLM 提供的是一种严格更强大的自动化方式,不需要任何妥协。
某些领域里,LLM 开启了一种严格更强大的流程自动化方式,无需在质量上做任何妥协。软件 QA 和测试就是其中之一。
There are domains where LLMs simply open new strictly more powerful ways to automate processes, without any compromise on quality. One of those domains is software QA and testing.
三、为什么 QA 是无妥协区?
传统测试有个根本性的盲区:100% 的代码行覆盖不等于 100% 的状态覆盖。单元测试和集成测试只能覆盖可编码的断言,但大量质量判断——分布式的时序问题、性能回归、用户视角的"不对劲"——需要人类的眼睛和判断。这些判断以前只能靠人工 QA,而且大多数时候因为时间不够被跳过了。
一个已知的事实是,覆盖所有代码行并不意味着覆盖了所有可能的状态。
It is a known fact that covering all the lines of the code does not mean covering all the possible states.
方法论详解
antirez 的方法出人意料地简单:一个 Markdown 文件,一份 QA 清单,一个能读 diff 的 AI agent。
编写 QA Markdown
在 Markdown 文件中定义 QA agent 的角色和任务清单。不需要写代码,不需要写断言脚本,只需要用自然语言描述"你想检查什么"。
Diff 驱动聚焦
Agent 先检查自上次发布以来的所有 commit,理解改动了什么,然后有针对性地设计测试策略。回归测试从"全量跑"变成"按 diff 精准打击"。
执行并观察
Agent 在真实环境中执行测试——SSH 到多台机器、检查分布式推理的输出一致性、跑性能基准测试。所有以前需要人手动做的事情。
方法论的核心优势
性能测试无需基线
antirez 指出,性能回归测试不需要告诉他之前期望的速度是多少——因为这是一个"移动目标",每次发布都会变化。Agent 自己能判断当前版本是否出现了异常的性能下降。
集成测试零脚手架
分布式推理的集成测试只需要在文件开头列出 SSH 端点、密钥和路径。不需要搭建测试基础设施,不需要 mock 服务,不需要复杂的 CI 配置。
智能回归定位
Agent 从 commit diff 出发,识别哪些功能可能受影响,然后"专攻"这些区域寻找回归。这不是盲目的全量测试,是有情报支持的精确打击。
心理层面的质量检查
antirez 提到可以让 agent 检查"哪些新功能看起来令人困惑、文档不足、或整体上显得粗糙"——这是以前需要资深 QA 工程师凭直觉做的事。
| 维度 | 传统 QA | antirez 的 AI QA |
|---|---|---|
| 测试设计 | 人工编写测试用例和断言脚本 | 自然语言描述测试意图 |
| 回归基线 | 需要硬编码预期值和阈值 | Agent 自行判断是否异常 |
| 集成测试 | 复杂的测试基础设施和 mock | SSH + 真实环境 |
| Diff 感知 | 手动决定回归测试范围 | 自动分析 commit 针对性测试 |
| 用户体验评估 | 几乎不可能自动化 | 可以让 agent 评估"是否令人困惑" |
| 执行频率 | 发布前人工执行,经常被跳过 | 每次发布自动执行 |
| 边际成本 | 线性增长(人力时间) | 接近零(API 调用费) |
实战案例
antirez 用两个真实项目展示了这个方法论的实际运作方式。
分布式推理的端到端 QA
测试内容:检查分布式推理在 MacBook A 和 MacBook B 之间是否正常工作,输出是否一致,所有 GGUF 文件是否在两台机器上都能正常推理。
速度回归测试:不告诉 agent 之前的速度是多少,只要求它确认"这个版本没有速度退化"。Agent 自己能建立判断标准。
配置方式:文件开头列出 SSH 端点和密钥。不需要任何测试框架。
关键点:这些测试以前要么不做,要么需要 antirez 自己手动 SSH 到两台机器上跑一遍。
生产环境模拟 QA
测试内容:让 agent 构建一个大型基于数组的 Redis 应用,搭建带有复制和持久化的生产环境,模拟多天多用户的使用场景。
验证方式:在整个模拟过程中检查是否有任何异常行为。
规模:这不是"跑几个单元测试"——是构建完整应用然后在接近真实负载下做长期稳定性验证。
关键点:这种测试以前需要专门的 QA 环境和大量人力,现在一个 agent 就能搞定。
注意 antirez 的测试方法有一个微妙但关键的特质:他不是在让 AI 写测试脚本,而是在让 AI 扮演一个 QA 工程师。区别在于,测试脚本是静态的——它只能检查你预想到的问题;而一个"QA 工程师"是动态的——它能观察、判断、发现你没有预想到的问题。
深度解读
从一个 QA 工程师的视角来看,antirez 踩中了哪些痛点?哪些被低估了?哪些还有疑问?
踩中的痛点:那些被跳过的测试
antirez 说了一句所有 QA 工程师听了都会点头的话:"所有以前需要手动执行的事情,大多数时候都被跳过了。"这就是 QA 领域最残酷的现实——不是因为测试不重要,而是因为人力不够、时间不够、优先级不够。
单元测试和自动化集成测试解决了"可编码"的部分。但还有一大块灰色地带——需要观察、判断、甚至"感觉"的测试——从来没有被自动化过。比如:
分布式系统中的竞争条件
不是能不能重现的问题,是能不能想到去检查的问题。Agent 可以反复跑、长时间跑、在不同配置下跑。
"这个东西用起来不对劲"
以前只有资深用户才能发现的体验问题,现在可以让 agent 从用户视角逐一检查新功能是否"令人困惑"。
跨多台机器的集成测试
搭建完整的测试环境比写测试本身更耗时。Agent 直接用 SSH 连真实环境,省掉了整个脚手架。
被低估的价值:commit 驱动的测试策略
antirez 轻描淡写地提到了一个关键细节:agent 会"先检查新 commit,识别可能受影响的部分,然后有针对性地执行 QA"。这其实就是 QA 工程师做发布前评估时的思维过程——只不过以前这个过程完全依赖经验,现在可以被系统化了。
在实际工作中,发布前的回归测试范围是一个经典的决策难题:测太少怕漏,测太多怕来不及。有经验的 QA 工程师会看 diff 来判断风险范围,但这个能力很难标准化和传递。antirez 的方法本质上把这个"diff 到测试范围"的映射交给了 AI——而且效果可能比大多数中级 QA 工程师更好,因为 AI 能看到完整的 diff 历史,不会因为疲劳而遗漏。
存疑之处:Agent 的判断边界在哪?
antirez 的方法有一个隐含的前提:agent 能做出足够好的判断。但文章没有深入讨论几个关键问题:
未回答的问题
- 幻觉风险:Agent 在复杂环境中是否会"看到"不存在的问题,或者漏掉真正的问题?
- 判断标准:性能测试中,agent 说"没有退化"——这个判断的置信度有多高?
- 边界条件:对于需要深度领域知识才能发现的 bug(比如 Redis 的内存分配器行为),agent 能做到什么程度?
- 可重复性:同一个 Markdown 文件跑两次,结果一致吗?如果不一致,怎么保证可靠性?
合理的回应
- 幻觉问题存在但可控:关键是任务设计——让 agent 做观察和报告,而不是让它做推断和决策。
- 不需要完美:目标是"比人工 QA 之前的效果更好"(因为之前经常是零),不是"比最好的 QA 工程师更好"。
- 互补而非替代:单元测试、集成测试、AI QA 各自覆盖不同的区域,三者叠加的效果远大于任何单一方法。
- 可审计性:Agent 的每一步操作都有日志,比人工 QA 的"我记得好像测过了"要可追溯得多。
行业启示
antirez 这篇文章的真正分量不在于技术细节,而在于它指向的方向。
对 QA 工程师意味着什么
这不是"QA 要被 AI 取代了"的老故事。恰恰相反,这是"QA 终于可以做到以前做不到的事了"的新故事。以前 QA 工程师最痛苦的不是写测试,而是明明知道应该做更多测试,但时间和资源不允许。antirez 描述的方法直接把这个约束去掉了。
QA 工程师的价值会从"执行测试"转向"设计测试策略"——决定 agent 应该检查什么、用什么环境、关注哪些维度。这是一个更高级、更需要经验的角色。
对 AI 辅助开发的启示
antirez 提出了一个有趣的闭环:AI 辅助编程加速了代码产出但可能降低代码质量,而 AI 辅助 QA 可以弥补这个质量下降。如果这个闭环成立,那 AI 对软件开发的影响就不是简单的"更快"或"更差",而是一个新的均衡——速度提升,质量通过另一条路径得到保障。
自动 QA 的引入可能提高新版本软件的质量门槛,并可能部分补偿高速自动编程带来的代码质量下降。
The introduction of automatic QA may raise the bar of quality for new releases of software, and maybe partially compensate for the lower quality of the code produced at high speed with the use of automatic programming.
方法论的可迁移性
antirez 的方法有一个被低估的优点:门槛极低。不需要训练模型,不需要部署系统,不需要改 CI pipeline。只需要一个 Markdown 文件和一个能跑 agent 的环境。这意味着任何团队,从独立开发者到企业级团队,都可以立即开始尝试。
想象一下你把这套方法用到日常工作中:每次发版前,写一份 QA Markdown 给 agent,让它按照你的 checklist 执行。跑完之后给你一份报告。你花 10 分钟写 Markdown,agent 花半小时跑完所有测试。以前这需要一整天的 QA 人力。
antirez 没有在讨论一个未来愿景。他在描述他现在就在用的方法。这才是这篇文章最值得关注的原因——不是"AI 可能改变 QA",而是"AI 已经在改变我的 QA 流程,而且效果比传统方法更好"。
金句摘录
自动编程在结构质量和复杂度控制上达不到最好的手写代码水平。但在大多数情况下,它超过了"还不错的手写代码"。
The output does not reach the structural quality and economy of complexity of the best hand-written software. However, [...] automatic programming surpasses most of the times the quality of decently developed hand-written code.
覆盖所有代码行并不意味着覆盖了所有可能的状态。
Covering all the lines of the code does not mean covering all the possible states.
所有以前需要手动执行的事情,大多数时候都被跳过了。
All things that needed to be executed manually before, and that most of the times were mostly skipped.
自动 QA 可能部分补偿高速自动编程带来的代码质量下降。
The introduction of automatic QA may raise the bar of quality for new releases of software, and maybe partially compensate for the lower quality of the code produced at high speed with the use of automatic programming.