跳转至

05 - 测试生成

在 AI 编程时代,测试的地位不是下降,而是变成了信任底座。因为当代码生成速度显著提升后,真正限制你交付速度的,往往变成“你敢不敢合并这段代码”。

这章解决什么问题

很多人用 AI 生成测试,只停留在:

  • 让模型补几段单元测试
  • 跑通 happy path
  • 看覆盖率数字

这不够。真实项目里更关键的是:

  • 测试是否覆盖真正的风险点
  • 是否能防回归
  • 是否能支撑 AI 生成代码快速迭代
  • 是否能沉淀成稳定的验证门禁

所以这一章会把“测试生成”写成 可信交付闭环 的核心部分。

学习目标

  • 把测试理解成 AI4SE 的验证层,而不是附属品
  • 学会用 AI 生成单测、集成测试、回归测试和 golden cases
  • 学会判断哪些测试值得补、哪些只是堆覆盖率
  • 能把测试资产写进项目和面试表达

为什么 AI 时代更需要测试

因为 AI 代码常见问题不是“完全不能跑”,而是:

  • 边界处理不完整
  • 旧行为被悄悄改掉
  • 看起来对,其实只覆盖部分场景
  • 改动范围超出预期

这些问题最有效的兜底方式,不是继续问模型,而是测试。

测试的 4 层结构

建议把测试固定分成这 4 层看。

层级 作用
单元测试 验证局部逻辑
集成测试 验证模块交互
回归测试 防止已修问题再次出现
端到端 / Golden 验证关键主链路结果

AI 最容易补的是前两层,但最能体现工程价值的往往是后两层。

先决定“测什么”,再决定“怎么生成”

测试生成的第一步不是写 prompt,而是识别风险点。

一个简单框架

每次改动后,先问:

  • 哪条主路径最可能出问题
  • 哪个边界条件最容易漏
  • 哪个旧行为不能被破坏
  • 哪个错误之前出现过

这些问题决定了测试优先级。

4 类最值得 AI 生成的测试

AI 不是所有测试都适合代写,但下面这几类通常既高频又容易建立验证闭环。

1. 单元测试骨架

适合:

  • 工具函数
  • service 逻辑
  • parser / formatter
  • 简单算法逻辑

AI 很擅长快速补齐基础测试骨架,但你要自己审查是否覆盖边界。

2. 边界与异常测试

这一类比正常 case 更值钱。

例如:

  • 空值
  • null / None
  • 超时
  • 无效输入
  • 兼容旧参数

这也是 AI 代码最容易遗漏的部分。

3. 回归测试

当你修了一个 bug,最有价值的测试往往不是通用单测,而是:

  • 一个能稳定复现旧问题的失败 case
  • 一个修复后的防回归 case

这是面试里非常能讲价值的内容。

4. Golden / Snapshot / Judge 测试

对 AI 应用尤其重要。

例如:

  • 固定 query 的检索结果顺序
  • 固定 prompt 的结构化输出
  • 固定任务的 agent trace
  • 关键生成结果的 judge 评分

这类测试能显著提高 AI 系统迭代的稳定性。

最推荐的测试生成流程

Text Only
看 spec
→ 找风险点
→ 先写失败场景
→ 生成测试骨架
→ 补边界和异常
→ 跑测试
→ 检查是否真的覆盖改动

如果顺序反了,就很容易变成“模型写了很多测试,但没测到真正重要的地方”。

一个高价值模板

Markdown
请为以下改动补测试,但先不要修改生产代码。

任务:
修复 query 为空时 rewrite service 报错的问题

请生成测试,覆盖:
- 正常 query
- 空字符串 query
- None query
- 关闭 rewrite 开关时的 fallback
- 原有默认行为不回归

要求:
- 使用现有测试框架
- 优先补防回归测试
- 如果发现生产代码无法通过这些测试,请指出原因

这个模板比“帮我写测试”稳定得多。

生成测试时最常见的 6 个问题

这些问题几乎就是 AI 生成测试时最常见的失真来源,最好提前建立识别习惯。

1. 只测正常路径

这是最常见的问题,价值最低。

2. 机械复制函数名

模型会写一堆看起来完整、实际上没什么判断力的测试。

3. 断言过弱

例如只断言“不报错”或“结果不为 null”,但没有验证行为是否正确。

4. 测试依赖过重

引入大量 mock、复杂 fixture,反而降低可维护性。

5. 测试和任务目标脱节

比如修的是兼容性问题,结果只补了普通成功 case。

6. 覆盖率数字高,但关键风险没覆盖

覆盖率是指标,不是目标。

单测、集成、回归,优先级怎么排

如果时间有限,建议按下面顺序:

  1. 防回归测试
  2. 关键边界单测
  3. 关键交互的集成测试
  4. 再考虑补更多覆盖率

对求职项目来说,这个顺序也更容易讲出价值。

AI 应用和 Agent 系统怎么测

这部分和传统业务代码不完全一样。

重点对象

  • 检索结果
  • 工具调用顺序
  • 结构化输出
  • 降级策略
  • token 预算和超时行为

可以补的测试类型

  • judge-based 评测
  • golden query 集
  • trace 对齐测试
  • tool-use 成功率测试
  • fallback 命中测试

如果你想投 AI 应用工程或 AI Coding 岗,这些测试意识很重要。

一个适合 AI 系统的测试分层

Text Only
L1: 纯函数和局部逻辑单测
L2: 检索 / 排序 / 路由模块集成测试
L3: 固定 query 的回归集
L4: 线上前的 smoke test 和降级验证

你不一定一次全做,但至少要知道自己缺哪一层。

测试生成时最应该要求模型输出什么

除了测试代码本身,建议要求它同时输出:

  • 覆盖了哪些风险点
  • 还没覆盖哪些风险点
  • 哪些测试是防回归测试
  • 哪些测试依赖 mock / fixture

这样你更容易 review。

什么时候应该先写测试,再改代码

最推荐的场景:

  • 修 bug
  • 做兼容性改动
  • 做重构
  • 调整热点逻辑

因为这些场景最需要“先锁行为,再改实现”。

2028 面试里怎么讲测试能力

不要只说:

Text Only
我会用 AI 生成测试。

更好的表达是:

Text Only
我把测试生成作为 AI 代码交付的验证层。对于 bugfix 和重构,我优先补防回归测试,再补边界和异常测试;对 AI 系统则补 golden cases 和 judge-based 评测,确保改动可验证、可追踪。

这会明显比“会写 pytest”更有层次。

简历怎么写

差的写法:

Text Only
补充了单元测试。

好的写法:

Text Only
为检索与重排链路补齐回归测试和关键边界测试,建立固定 query 评测集,用于在模型和提示模板迭代时快速发现质量回退。

或者:

Text Only
围绕支付回调幂等逻辑补防回归测试和异常测试,使重构后核心行为保持稳定。

一个简短的测试 checklist

  • 是否覆盖了主路径
  • 是否覆盖了关键边界
  • 是否有防回归 case
  • 断言是否足够强
  • 是否和任务目标一致
  • 是否能在 CI 中稳定运行

本章小结

  • 测试生成的真正价值,不是补代码量,而是建立信任
  • AI 时代最值钱的测试,是回归测试、边界测试和 AI 系统评测集
  • 你真正要做的,是把测试纳入持续验证门禁

下一步