AI 时代,测试工程师的生存之道
测试工程师这行有个默认成立的隐含前提:你测的东西,行为是可预期的。
这个前提在传统软件测试里成立,因为代码是确定的。你测一个计算器的加法,2+2=4永远成立。你测一个搜索框,输入"上海",结果页一定包含"上海"。这些断言写完就可以睡觉,不用担心明早它无缘无故翻车。
但 AI 系统不吃这套。
你让 LLM 写一段营销文案,它今天写得文采飞扬,明天同样的 prompt 给你来一段平平无奇。你让它做信息抽取,某条数据今天抽对了,明天可能多抽一个字段,后天可能少抽一个。不是 bug,不是部署问题,就是这个系统在本质上不一样——它的输出是概率分布的采样,不是固定的返回值。
你拿一把只有"通过"和"失败"两格的尺子,去量一个每次落点都在漂移的东西。量出来的结果,你自己信吗?
一、以前的方法和思维模式已经失效
这个坑,行业里不是没人踩过。
微软研究院的一篇报告里提到,他们在评估某款 AI 写作辅助工具时发现:自动化测试全部通过,但真实用户满意度只有 62%。原因是测试用例全部基于"标准答案对比",而用户真正在意的是语气、节奏、上下文的连贯感——这些维度,传统断言根本测不到。
更扎心的是,光有测试用例还不够,测试用例本身也会撒谎。
某个做智能客服的团队,花了三个月建了 200 条自动化测试用例,回归通过率长期保持在 94% 以上。结果新版本上线后,用户投诉量翻倍。事后复盘:那 200 条用例几乎全是"正常提问 + 标准回答"的配对,没有一条覆盖"用户情绪激动时的语气处理",没有一条测过"上下文被截断时的行为"。94% 的通过率,测的是一个缩小版的假世界。
说实话,我们太喜欢那个绿色的对勾了。它给人一种"质量有保障"的踏实感。
但对于 AI 系统,单次的"全部通过",有时候比"部分失败"更危险——失败至少提醒你去翻一眼日志,全部通过让你扭头就走,准备发布。
这才是最坑的地方。它不报错。测试报告一片绿,骗你睡个好觉,然后线上用户给你补上一条条差评。
二、测试工程师技能和思维模式都要升级
那继续用老方法,还是彻底推翻重来?都不对。核心就三个转变。
第1,从"验证正确性"转向"刻画行为分布"
不是"这次输出对不对",是"这个系统在 N 次运行下的质量分布长什么样"。
好情况:同一条用例跑 10 次,得分分布是 0.88±0.03。稳,可信。 坏情况:跑 10 次,均值 0.76,但最低分 0.41,最高分 0.93。这个系统在抽卡,你不能信任它。
为什么要这样转变?因为你现在的任务不是"找 bug",是"描述风险"。一个方差很大的系统,不是"有时候有 bug",是"本身就是个高风险系统"。这两种表述,对产品决策的影响完全不同。
第2,从"覆盖代码路径"转向"覆盖用户意图空间"
传统测试的覆盖率是代码覆盖率——多少行代码被执行到了。对 LLM 系统,这个指标没有意义。你要覆盖的是:用户会怎么提问、会提什么奇怪的问题、会在什么场景下用这个功能。
好情况:用例设计涵盖了正常提问、模糊提问、带情绪的提问、跨语言的提问、明显越权的提问。 坏情况:200 条用例全是"标准问题+标准回答",对应的是一个不存在于现实的完美用户。
测试用例的来源,要从"工程师自己想",扩展到"从真实用户日志里挖"。线上跑了一个月的真实 query,比工程师凭空想象的 1000 条用例更有价值。
第3,从"自动化替代人工"转向"人机协作分层审核"
说白了,AI 测 AI,不能完全信任。LLM-as-Judge(用大模型当评判者)会对格式有偏好,会受评估 prompt 措辞影响,自身也在漂移。你不能把一个概率系统交给另一个概率系统去把关,然后自己去喝咖啡。
好情况:自动化评分负责快速筛选,人工审核负责最终裁决,尤其是高分区(防假阳性)和低分区(理解失败原因)都要有人眼看到。 坏情况:自动化全流程,报告里一片绿,没有人知道绿的是什么。
这套分工逻辑,其实成熟行业早就在用了。医疗影像 AI 给出诊断概率,最终签字的是医生。金融风控模型打出风险分,最终放不放款是信贷官的责任。自动驾驶感知系统输出置信度,驾驶决策还有多层安全冗余。是我们的测试报告,把自动化当成了终点,而不是起点。
三、3档分层,每档行动不同
把所有测试结果按风险程度分三档处理。
稳定区条件:多次运行均值 ≥ 0.85,标准差 ≤ 0.05,无灾难性失败案例,连续版本无退化趋势。 行动:自动放行,进入下一流程节点,不需要人工干预。 分治逻辑:如果某条用例长期稳定在绿区,每季度抽检一次,确认用例本身没有过时(需求变了但用例没更新)。
观察区条件:均值在 0.70–0.84 之间,或标准差 > 0.10,或存在低分但未灾难性的失败。 行动:进入人工复核队列。 分治逻辑:失败集中在某类输入 → prompt 工程问题,改系统 prompt 或补 few-shot 示例;失败随机分散 → 模型能力边界,考虑拆分任务或升级模型;失败集中在某个时间段 → 排查上游数据或外部依赖问题。
危险区条件:均值 < 0.70,或任意一次出现灾难性输出(严重事实错误、有害内容、逻辑崩塌),或关键安全用例未通过。 行动:一票否决,不上线,打回修复,记录失败模式。 分治逻辑:如果是用例设计遗漏导致未提前发现 → 修用例;如果是系统本身缺陷 → 修系统,同时给这类场景新增回归用例防复现。
最佳实践清单:
• 给每条测试用例加run_count配置,5 次起步,核心对话链路拉到 10 次,安全合规场景拉到 20 次。
• 报告字段别只写pass/fail。标准字段写清楚:runs、mean_score、std_dev、min_score、failure_types、failure_rate。
•accuracy这类二值指标,换成pass_rate@N,让不确定性显式出现在报告里,而不是被单次结果掩盖。
• 每次版本迭代,不只跑新功能用例,必须跑全量回归。时间不够就减少用例数量,不能跳过回归。
• 从真实用户日志里定期(每月至少一次)补充新的测试用例,尤其是那些你没想到的奇怪 query。
• LLM-as-Judge 只当概率参考。它是辅助层,高分区每月人工抽检 10%,低分区必须人工确认失败原因,签字的人还得是你。
结尾
AI 时代测试工程师的价值,从来不在于"把所有测试都自动化掉"。在于你敢不敢把"这个系统的输出在某些场景下是不稳定的,我们观测到的风险分布是这样的"明明白白写进测试报告,交给产品和业务去做决策。
我知道,要团队从"跑通就行"改成"看分布才算数",没那么容易。光是说服研发负责人接受"我们的测试结论是个概率区间",可能就得开几轮对齐会。改 CI 流程、改报告模板、改评审节点,每一步都有工程成本。
我也不确定每个团队现阶段都扛得动这个改造成本。
但 AI 功能已经在你的系统里跑了。你的测试体系还停在"确定性输出"的时代。
你手里现在测的这个系统,还在用红绿灯交差吗?评论区告诉我——你遇到的最头疼的问题,是用例不够用,还是根本不知道测出来的结果该怎么解读?
测试工程师这行有个默认成立的隐含前提:你测的东西,行为是可预期的。
这个前提在传统软件测试里成立,因为代码是确定的。你测一个计算器的加法,2+2=4永远成立。你测一个搜索框,输入"上海",结果页一定包含"上海"。这些断言写完就可以睡觉,不用担心明早它无缘无故翻车。
但 AI 系统不吃这套。
你让 LLM 写一段营销文案,它今天写得文采飞扬,明天同样的 prompt 给你来一段平平无奇。你让它做信息抽取,某条数据今天抽对了,明天可能多抽一个字段,后天可能少抽一个。不是 bug,不是部署问题,就是这个系统在本质上不一样——它的输出是概率分布的采样,不是固定的返回值。
你拿一把只有"通过"和"失败"两格的尺子,去量一个每次落点都在漂移的东西。量出来的结果,你自己信吗?
