ARTICLE · 1000004
AI写代码越来越快,软件测试到底怎么跟上?
摘要:开发提速后,测试需要重建反馈链路。
开发用 AI Agent 一上午改完接口、页面和数据库脚本。测试下午拿到构建包,仍按版本补用例、跑全量回归。失败原因还要逐条判断。晚上的上线评审会上被问“风险多大”,测试给不出及时结论,责任却不会因为排期紧而减少。
这不是自动化脚本再多写一点就能解决的问题。代码变化得更快,旧测试流程仍以“大版本、全量跑、人工分诊”为单位,等待时间只会被放大。
本文只解决一件事:如何把测试改成按每次代码变更快速反馈。 AI 可以参与分析,但发布门禁仍由可审计的规则和人负责。
开发提速了,旧测试流程为什么更堵
AI 已经在改变开发工作的颗粒度。 OpenAI 在 2026 年 6 月发布了 Codex 使用研究。研究样本中, 70.2% 的用户在 2026 年 5 月至少提交过一次“估计需要人工一小时以上”的任务。 Agent 不只补一行代码,还能连续修改文件、运行命令并迭代结果。
较早的 GitHub 对照实验也给过一个局部数据。 95 名专业开发者完成同一项 JavaScript 任务时,使用 Copilot 的组平均快 55%。这个结果不能直接换算成所有团队的交付增幅,却能说明一个现实——开发侧的产出上限正在提高。
测试侧若保持原样,常见的堵点有三个。每次小改都跑同一套回归;自动化只能串行占用一个环境;失败后还要靠人翻日志、找提交、问开发。测试执行时间看起来最长,真正拖慢反馈的却是等待、无差别执行和失败分诊。
DORA 2025 年报告把 AI 定义为组织能力的“放大器”。原有系统强,它会放大优势;流程本来就弱,它也会放大拥堵。 Stack Overflow 2025 年调查显示, 46% 的受访开发者不信任 AI 输出的准确性,高于信任者的 33%。所以测试不能只追求更快地生成用例。
测试要追的是风险,不是代码量。
核心方案:把测试改成按风险流动的反馈链
质量反馈链可以这样理解:每次代码提交后,团队都能快速回答四个问题。改了什么,可能伤到哪里,最低要跑哪些检查,失败由谁处理。
它不是让 AI 接管发布。 AI 擅长阅读差异、归纳依赖和聚类日志。测试选择、权限边界和发布条件要写成确定规则,并保存在代码仓库里接受评审。
阅读方向:从上到下代码变更-> AI生成变更摘要与风险候选-> 规则选择必跑测试-> CI并行执行并保留证据-> AI聚类失败与关联提交-> 人工处理高风险结论
读这张图时要抓住中间两层。 AI 的输出是候选,不直接决定是否放行; CI 里的确定性规则才是门禁。这样即使模型换了,关键质量标准也不会跟着提示词漂移。
微软 Azure Pipelines 的测试影响分析( Test Impact Analysis , TIA )采用了相同思路。它根据本次提交选择受影响的测试。无法理解文件类型时,系统回退到全量执行,也允许周期性强制跑全量回归。这里的“回退”很关键。漏选一条高风险用例,比多跑十分钟危险得多。
怎么做:用 30 行 Python 跑通按变更选测
先做一个不依赖具体 CI 平台的实验。运行前提是 Python 3.10 或更高版本,不需要第三方库。把下面代码保存为 select_tests.py。
import sysRULES = {"services/payment/": {"api_contract", "payment_integration", "payment_e2e"},"services/auth/": {"api_contract", "security", "login_e2e"},"web/checkout/": {"component", "checkout_e2e"},"db/migrations/": {"db_integration", "core_regression"},}BASE = {"lint", "unit"}def select(paths: list[str]) -> list[str]:suites = set(BASE)unknown = []for path in paths:matched = Falsefor prefix, required in RULES.items():if path.startswith(prefix):suites.update(required)matched = Trueif not matched:unknown.append(path)if unknown:suites.add("core_regression")return sorted(suites)if __name__ == "__main__":if len(sys.argv) == 1:raise SystemExit("usage: python3 select_tests.py <changed-file>...")print("\n".join(select(sys.argv[1:])))
在保存文件的目录打开终端,模拟一次支付接口和结算页面同时变更:
python3 select_tests.py services/payment/refund.py web/checkout/button.tsx预期输出如下:
api_contractcheckout_e2ecomponentlintpayment_e2epayment_integrationunit
RULES 是最小的风险映射表。支付代码变化会选中契约、集成和端到端测试;结算页面变化会补上组件与结算链路。lint 和 unit 每次必跑。遇到没有登记的目录,脚本会加入 core_regression,不会悄悄跳过。
接入项目时,可用 git diff --name-only origin/main...HEAD 取得变更文件。脚本输出再映射为 CI job 或 pytest 标记。 pytest 官方支持通过 -m 按 marker 选择测试。启用 strict_markers 后,拼错的标记会直接报错。
选择以后还要并行。 Playwright 支持通过 --shard=x/y 把测试分片到多个 CI job ,也能合并各分片报告。但并行之前必须做好测试隔离:账号、订单号和清理逻辑不能共用。否则执行是快了,数据互相覆盖, Flaky Test 反而更多。
四个坑会让“AI 测试提效”变成假快
让 AI 大量生成用例,用例库先失控
现象是用例数快速上涨,反馈时间却没有下降。原因通常是新增用例重复覆盖主路径,没有绑定风险和维护人。
处理方式很直接: AI 生成的用例必须关联变更、风险标签和测试层级。没有明确断言、没有稳定数据、与现有用例重复的候选,不进主干。生成速度不是验收指标。
让 AI 把失败脚本“修绿”,真实缺陷被改没
定位器失败后, Agent 可能换一个更宽泛的元素;接口断言失败后,它也可能放松断言。流水线变绿了,产品行为未必正确。
保留首次失败的日志、截图、 trace 和提交号。 AI 只能提交修复建议,不能覆盖原证据,也不能自动合并涉及断言、权限、金额和数据一致性的修改。 Playwright 会把“首轮失败、重试通过”单独标为 flaky ,这类结果不应当伪装成稳定通过。
风险映射长期不维护,漏测会悄悄积累
目录拆分、服务改名、新增调用链都会让 RULES 过期。取消选测解决不了这个问题。应该给它加校验:未知路径自动回退;每晚或每周跑全量;线上缺陷反向补映射;高风险模块由代码所有者评审。
微软 TIA 也保留了强制全量和安全回退。按风险选测的价值来自“可解释地少跑”,不是冒险地少跑。
只看执行时长,反馈仍然慢
如果测试五分钟跑完,却在队列里等四十分钟,或失败后两小时没人处理,提效数字没有业务意义。团队应测量从提交到可信结论的时间,而不只是脚本运行时长。
可以先定三项项目目标: PR 必跑检查的反馈时间、未知变更触发兜底的比例、失败完成归因的时间。数值要用当前基线制定,不建议照抄别人的“十分钟”。
开始改造时,不必先采购一套新的 AI 测试平台。选一个提交频繁、全量回归偏慢的模块,连续做四周:
四周后只看三件事:可信反馈是否更早,漏选是否可被兜底发现,测试人员是否把时间转向高风险探索。如果答案仍是否定的,先修流程和测试资产,不要继续增加 Agent 。