AI 辅助测试实战——用 Claude/ChatGPT 生成测试用例、分析覆盖盲点
AI 辅助测试实战——用 Claude/ChatGPT 生成测试用例、分析覆盖盲点
适读人群:测试工程师、开发工程师、技术 Leader | 阅读时长:约 15 分钟 | 核心价值:掌握用 AI 加速测试用例生成的实用提示词工程,把 AI 真正纳入测试工作流
去年有个测试工程师叫小范,她们组开始用 ChatGPT 辅助测试工作。但三个月后她来找我,说效果不理想——"AI 生成的测试用例太泛了,说'输入合法值'、'输入非法值',这种我自己也知道啊。"
我看了她用的 prompt,问题一下子就清楚了:她给 AI 的提示词是 "给我生成这个函数的测试用例",就这一句话,没有任何上下文。
"AI 不是大脑,是镜子,"我跟她说,"你给它什么信息,它才能给你什么质量的输出。好的 AI 辅助测试,核心是提示词工程。"
这篇我把我在实际项目里用到的所有 AI 辅助测试 Prompt 模板整理出来,直接能用。
1. 为什么 AI 适合做测试辅助?
测试工作有几个特点让它非常适合 AI 辅助:
- 规律性强:测试用例的结构是固定的(输入-操作-预期),AI 能快速批量生成
- 枚举性:边界值、等价类、异常场景的枚举,AI 能比人更全面
- 文档密集:测试文档、测试计划的撰写是纯文字工作,AI 最擅长
- 代码生成:测试代码有大量重复模式,AI 能快速生成框架
AI 不擅长的:
- 理解隐式业务规则(需要你输入清楚)
- 发现需求逻辑矛盾(需要你的业务判断)
- 替代真正的系统测试
2. 提示词模板库:代码级测试用例生成
2.1 函数测试用例生成(最常用)
你是一个资深 Go 测试工程师。请为以下函数生成完整的 table-driven 单元测试。
函数代码:func ValidateOrderAmount(amount float64, userLevel string) (float64, error) {
if amount <= 0 {
return 0, ErrInvalidAmount
}
var limit float64
switch userLevel {
case "vip":
limit = 100000
case "normal":
limit = 10000
default:
return 0, ErrInvalidUserLevel
}
if amount > limit {
return 0, ErrExceedsLimit
}
// VIP 用户打 9 折
if userLevel == "vip" {
amount = amount * 0.9
}
return amount, nil
}要求:
1. 使用 testify assert
2. 覆盖所有分支(if/switch 的每个 case)
3. 包含边界值:0、负数、limit 值、limit+0.01
4. 包含所有 error path
5. 测试用例名称用中文,描述业务语义
6. 生成完整可运行代码AI 生成的效果远比简单 prompt 要好得多。
2.2 API 接口测试用例生成
你是测试工程师,请基于以下 API 规格生成完整测试矩阵。
API: POST /api/v1/orders
Request Body:
{
"user_id": string (必填,UUID格式),
"items": array (必填,至少1条),
- "product_id": string (必填),
- "quantity": integer (必填,1-99),
- "price": number (必填,正数)
"coupon_code": string (选填,10位字母数字),
"shipping_address_id": string (必填,UUID格式)
}
Response: 201 Created | 400 Bad Request | 401 Unauthorized | 429 Too Many Requests
请生成:
1. 正向测试(happy path):至少3个
2. 字段缺失测试:每个必填字段分别缺失
3. 格式错误测试:UUID格式错误、数字越界等
4. 边界值测试:quantity=0, quantity=100, items空数组
5. 组合异常测试:至少2个多字段异常组合
6. 用表格格式呈现,包含:用例编号、测试场景、输入数据、预期结果2.3 覆盖盲点分析
这是我认为 AI 最有价值的用法——让 AI 分析你已有的测试,找出你没想到的测试场景:
我已有以下测试用例:[粘贴你已有的测试代码]请分析:
1. 哪些代码路径没有被覆盖?(列出未覆盖的 if/else 分支)
2. 哪些边界值没有测试?
3. 哪些错误场景遗漏了?
4. 是否有潜在的并发安全问题没测试?
5. 给出补充的测试用例建议(用 table-driven 格式)3. 实战:AI 生成的 Go 测试用例完整示例
以下是用 Claude 生成的一个完整例子,展示 AI 辅助的实际输出质量:
// 被测函数
func CalculateShippingFee(weight float64, distance int, memberLevel string) (float64, error) {
if weight <= 0 {
return 0, fmt.Errorf("invalid weight: must be positive, got %f", weight)
}
if distance <= 0 {
return 0, fmt.Errorf("invalid distance: must be positive, got %d", distance)
}
baseFee := weight * 0.5 * float64(distance) / 100
var discount float64
switch memberLevel {
case "gold":
discount = 0.8
case "silver":
discount = 0.9
case "normal", "":
discount = 1.0
default:
return 0, fmt.Errorf("unknown member level: %s", memberLevel)
}
return baseFee * discount, nil
}
// AI 生成的完整测试
package shipping_test
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"example.com/app/shipping"
)
func TestCalculateShippingFee(t *testing.T) {
tests := []struct {
name string
weight float64
distance int
memberLevel string
wantFee float64
wantErrMsg string
}{
// ===== 正常路径 =====
{
name: "普通用户标准运费",
weight: 10,
distance: 100,
memberLevel: "normal",
wantFee: 5.0, // 10 * 0.5 * 100 / 100 = 5.0
},
{
name: "金牌会员8折优惠",
weight: 10,
distance: 100,
memberLevel: "gold",
wantFee: 4.0, // 5.0 * 0.8 = 4.0
},
{
name: "银牌会员9折优惠",
weight: 10,
distance: 100,
memberLevel: "silver",
wantFee: 4.5, // 5.0 * 0.9 = 4.5
},
{
name: "空字符串等价于普通用户",
weight: 10,
distance: 100,
memberLevel: "",
wantFee: 5.0,
},
// ===== 边界值 =====
{
name: "重量最小正值",
weight: 0.001,
distance: 100,
memberLevel: "normal",
wantFee: 0.00005,
},
{
name: "距离为1",
weight: 10,
distance: 1,
memberLevel: "normal",
wantFee: 0.05,
},
// ===== 错误路径 =====
{
name: "重量为零",
weight: 0,
distance: 100,
memberLevel: "normal",
wantErrMsg: "invalid weight",
},
{
name: "重量为负",
weight: -1,
distance: 100,
memberLevel: "normal",
wantErrMsg: "invalid weight",
},
{
name: "距离为零",
weight: 10,
distance: 0,
memberLevel: "normal",
wantErrMsg: "invalid distance",
},
{
name: "未知会员等级",
weight: 10,
distance: 100,
memberLevel: "platinum",
wantErrMsg: "unknown member level",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
fee, err := shipping.CalculateShippingFee(tt.weight, tt.distance, tt.memberLevel)
if tt.wantErrMsg != "" {
require.Error(t, err)
assert.Contains(t, err.Error(), tt.wantErrMsg)
assert.Zero(t, fee)
return
}
require.NoError(t, err)
assert.InDelta(t, tt.wantFee, fee, 0.0001,
"运费计算不匹配:weight=%v, distance=%v, level=%s",
tt.weight, tt.distance, tt.memberLevel)
})
}
}这个测试覆盖了所有 switch case、所有 error path、边界值,用例命名清晰——这是 AI 生成测试的理想状态。
4. AI 辅助 BDD 用例生成
你是资深测试工程师,请将以下产品需求转换为 Gherkin BDD 格式的验收测试用例。
产品需求:
用户可以使用优惠券下单。优惠券有以下规则:
- 满 100 元减 20 元的优惠券
- 每个用户每张优惠券只能使用一次
- 优惠券有有效期,过期不能使用
- 下单后如果退款,优惠券退还
请生成:
1. 至少 5 个 Scenario(正常流程 + 边界 + 异常)
2. 每个 Scenario 有清晰的 Given/When/Then
3. 用 Scenario Outline 覆盖满减金额的边界值
4. 考虑并发场景(两个用户同时使用同一张优惠券)5. 踩坑实录
踩坑记录 1:直接使用 AI 生成的测试代码不验证
AI 生成的代码可能有逻辑错误——它计算的预期值可能不对(尤其是复杂数学运算),或者引用了不存在的函数。必须手动验证所有预期值是否正确,运行一遍确认全部通过。
踩坑记录 2:让 AI 生成的测试覆盖率很高,但没有有效断言
AI 有时候会生成"调用了函数,但没有断言结果"的测试,这会提高覆盖率但没有测试价值。在 Prompt 里明确要求:"每个测试用例必须有至少一个断言,验证具体输出值"。
踩坑记录 3:把 AI 当工具,不把 AI 当同事
最好的 AI 辅助测试工作流是"迭代对话"而不是"一次生成"。先让 AI 生成初稿,再让它分析还缺什么,再针对发现的问题让它补充。把 AI 当成一个可以反复讨论的同事,而不是一个只能用一次的脚本。
6. 工作流整合
实际的 AI 辅助测试工作流:
1. 需求阶段(5分钟)
输入:需求文档
AI 输出:测试分析清单、潜在边界和异常场景
人工审核:添加业务特有的约束
2. 用例设计阶段(15分钟)
输入:需求 + AI 分析清单
AI 输出:初版测试用例矩阵(表格格式)
人工审核:删除重复、补充业务规则
3. 代码生成阶段(10分钟)
输入:被测函数代码 + 测试用例矩阵
AI 输出:完整的 table-driven 测试代码
人工审核:验证预期值、运行测试
4. 覆盖率分析(5分钟)
输入:已有测试 + 覆盖率报告
AI 输出:缺失场景建议
人工执行:补充高价值测试用例
总计:约 35 分钟,完成原本需要 2-3 小时的测试设计工作8. AI 辅助测试的工具生态
除了直接用 ChatGPT/Claude 生成测试用例,还有一些专门的 AI 测试工具值得关注:
8.1 Copilot for Tests
GitHub Copilot 在 IDE 里实时为测试文件提供补全。在写 func Test 开头后,Copilot 会根据被测函数的上下文自动补全测试用例结构,包括合理的测试数据和断言。
使用技巧:先在注释里写清楚测试意图,Copilot 的补全质量会大幅提升:
// TestOrderService_CreateOrder 测试下单功能
// - 正常下单应返回待付款状态的订单
// - 金额为负时应返回 ErrInvalidAmount
// - 库存不足时应返回 ErrOutOfStock
func TestOrderService_CreateOrder(t *testing.T) {
// Copilot 会在这里补全 table-driven test 结构8.2 AI 驱动的测试维护
当被测代码修改后,AI 可以帮助更新对应的测试:
Prompt:
我修改了 ValidateAge 函数,新增了对超长 age 的验证(年龄不能超过 150):
[粘贴修改后的函数代码]
原来的测试用例是:
[粘贴现有测试代码]
请更新测试用例,添加针对新验证规则的测试,保持原有测试用例不变。8.3 AI 生成 BDD 步骤实现
当你已有 Gherkin feature 文件但需要实现 step definitions 时,AI 能大幅加速这部分工作:
Prompt:
给我为以下 Gherkin step 生成 Python pytest-bdd 实现:
Given 用户已登录账号 "{email}"
When 用户确认下单并支付
Then 订单状态应为 "{status}"
And 库存减少 {quantity:d} 件
技术栈:
- 测试框架:pytest-bdd
- HTTP 客户端:requests
- 断言:pytest assert
- 数据库:直接查询 PostgreSQL(用 psycopg2)
请生成完整的步骤实现代码。9. AI 辅助测试的边界与未来
诚实地说:AI 目前在测试领域能做得很好的,主要是机械性工作——根据代码结构生成测试框架、枚举边界值、生成测试数据、转换格式。
AI 还做不好的:
- 理解隐式业务规则("用户等级是通过一个历史遗留的外部接口返回的,但有时候会返回 null"这类知识需要人来传递)
- 发现需求文档里的逻辑矛盾(需要跨多份文档的推理)
- 评估测试优先级(哪个测试场景最重要?这需要业务风险判断)
- 替代真实的系统测试和用户验收测试
展望未来,AI 在测试领域最有潜力的方向是自主化测试代理——能自己读代码、设计测试策略、生成和维护测试用例、分析失败报告、提出修复建议的完整闭环。这个方向还在早期,但一些工具已经开始探索。
今天的正确姿势还是:人负责判断,AI 负责执行。把 AI 定位为一个能快速生成代码草稿、帮你想到更多边界场景的助手,而不是替代你思考的系统。
10. AI 辅助测试的未来展望与工程师的应对策略
AI 在测试领域的发展速度超出了很多人的预期。在写这篇文章的时候,已经有一些工具(如 Cursor、GitHub Copilot)能在你输入被测函数后,实时建议测试用例的框架和部分实现。这个能力还在快速提升。
当前阶段:AI 是高效的生成工具
现阶段,AI 在测试领域最擅长的是:给定一段代码或接口规范,快速生成测试用例的框架和大量边界场景。它把"测试用例设计"里的枚举性工作(列出所有边界值、所有错误场景、所有字段组合)自动化了,释放了测试工程师的时间去做更有价值的工作——理解业务、评估风险、决定优先级。
中期趋势:AI 开始参与测试策略
在不远的将来,AI 会开始能够分析代码变更,自动识别"这次修改影响了哪些功能,需要回归哪些测试用例",并自动更新对应的测试。测试维护成本(当前测试工作中被低估但极耗时的部分)会大幅降低。
长期方向:自主化测试代理
更远的未来,AI 可能成为真正的自主化测试代理:读取产品文档和代码,自主设计测试策略,生成并执行测试,分析失败报告,提出修复建议。这个方向今天还在探索阶段,但技术可行性已经不再是问题。
测试工程师的应对策略
在 AI 能力快速提升的背景下,测试工程师需要重新定义自己的核心竞争力。不可被 AI 替代的能力包括:业务风险判断(哪些场景最重要、最需要测试)、测试策略设计(单测、集成测试、端到端测试如何分层)、质量文化建设(如何让整个团队把质量内化为工程习惯)。
小范说得很对:AI 让她能展示出"测试得这么细"的工作,背后是 AI 在执行枚举性工作,她在判断什么值得枚举。这种"人负责判断,AI 负责执行"的分工,不只是当下的临时状态,而是未来相当长一段时间里人机协作的基本模式。
11. AI 辅助测试的落地建议
如果你今天要开始用 AI 辅助测试,最简单的起点是:选一个你写得比较费时的测试类型(比如 API 接口测试矩阵),用本文的 Prompt 模板在 Claude 或 ChatGPT 里试一次。不要期望一次就生成完美的测试,而是把 AI 作为起草工具,用人工判断来审查和补充它的输出。经过几次实践,你会找到适合你的工作流和 Prompt 模式,形成可以复用的效率工具。
AI 辅助测试是效率工具,不是质量保证工具。它能帮你更快地生成测试框架、更全面地枚举边界场景,但"这些测试是否真的在验证重要的业务行为",仍然需要人来判断。把 AI 工具的价值定位说清楚,才能避免"AI 生成了很多测试,但测试质量很差"的陷阱,真正让 AI 提升测试效率而不是制造测试幻觉。
AI 工具的最终价值,不是它能生成多少代码,而是它能让工程师把更多精力放在真正需要人类判断的工作上。在测试领域,这意味着从枚举边界值转向思考业务风险,从写重复的测试框架转向设计测试策略,从执行测试转向评估质量。这是人机协作的正确形态。
AI 辅助测试的最大启示,不是 AI 有多厉害,而是人机协作的分工有多重要。让 AI 做它擅长的(枚举、生成、变换),让人做 AI 做不好的(判断业务重要性、理解隐式规则、评估测试价值)。这种分工带来的不只是效率提升,而是每个角色都能更专注于自己最有价值的贡献。
写在最后
AI 辅助测试不是让 AI 替代测试工程师,而是让测试工程师从"体力劳动"(枚举边界值、写重复代码)中解放出来,专注于更需要人类判断的工作——业务风险识别、测试策略决策、质量评估。
小范后来用了我给她的这套 Prompt 模板,她说:"现在我给产品演示测试用例,他们都惊讶测试能做这么细。其实有一半是 AI 帮我补全的。"
这就是正确使用 AI 的方式:人判断方向,AI 提升效率。
明天是这个系列的最后一篇——测试工程师的进阶路径,从写测试到测试架构师。
