一次 Bug 复盘后,我用 AI 重写了测试用例生成流程

上周做一个后台管理系统的回归测试,遇到一个挺尴尬的问题:一个"很小"的权限修复,上线后又引出了另一个边界 Bug。代码改动不大,接口也没新增,但某个角色在特定筛选条件下能看到不该看的数据。复盘时大家都知道问题在哪里------测试用例覆盖了主流程,但没有把"角色 + 数据范围 + 查询条件"组合起来验证。

我后来没有继续让测试同事手写一大批排列组合,而是试着把 Bug 描述、接口字段、角色规则交给 AI,生成一版可复核的回归用例。为了方便观察不同模型的输出差异,我把同一份输入放在一个多模型聚合环境里跑了一遍,在同一界面切换 ChatGPT、Claude、Gemini、Grok 等模型,适合做文档处理、任务拆解、代码辅助和同题输出对比。

这篇文章记录的不是"AI 自动测试平台"这种大方案,而是一个更小、更容易落地的流程:如何让 AI 帮测试工程师、后端开发和产品同事,把一次 Bug 复盘变成更完整的回归测试用例。

问题不是不会写用例,而是漏掉组合

这次 Bug 的背景大概是这样:

  • 系统里有管理员、区域经理、普通销售三类角色;
  • 每类角色能看到的数据范围不同;
  • 列表接口支持按客户状态、所属区域、创建时间筛选;
  • 修复前,普通销售在某些组合条件下能查到跨区域数据;
  • 修复后,主流程通过了,但另一个筛选条件下仍然有遗漏。

最开始的测试用例长这样:

用例 角色 操作 预期
查看客户列表 普通销售 打开客户列表 只能看到本人客户
按状态筛选 普通销售 选择"跟进中" 只返回跟进中客户
区域经理查看 区域经理 打开客户列表 看到本区域客户

这些用例没错,但颗粒度太粗。真正出问题的是:

text

复制代码
普通销售 + 指定区域筛选 + 特定客户状态 + 时间范围

也就是说,不是单个功能点漏测,而是规则组合漏测。

AI 在这里能发挥作用的地方,不是替代测试人员判断,而是帮人把组合维度摊开,提醒哪些路径需要补。

第一步:把 Bug 复盘材料整理成结构化输入

我没有直接对 AI 说"请帮我写测试用例"。这种提示词太宽,很容易生成一堆看起来标准但没贴合业务的用例。

我先整理了四类信息:

text

复制代码
1. Bug 描述普通销售在客户列表中使用区域筛选时,可能查询到非本人负责的客户数据。
2. 角色规则- 管理员:可查看全部客户- 区域经理:可查看本区域客户- 普通销售:只能查看本人负责客户
3. 接口信息GET /api/customers参数:- status:客户状态- regionId:区域 ID- createdStart:创建开始时间- createdEnd:创建结束时间- ownerId:负责人 ID
4. 修复目标无论前端传入什么筛选条件,后端都必须基于当前登录用户权限进行数据范围约束。

然后再让模型生成测试用例:

text

复制代码
请基于下面的 Bug 复盘信息,生成回归测试用例。
要求:1. 不要只覆盖正常流程;2. 必须覆盖角色、数据范围、筛选条件的组合;3. 每条用例包含:用例名称、前置数据、操作步骤、预期结果、优先级;4. 标记哪些用例适合自动化;5. 不要编造不存在的接口字段;6. 如果信息不足,列出需要向产品或后端确认的问题。

这个 Prompt 的关键点是:先给约束,再给输出格式,再明确"不足就提问"。

否则模型很容易把测试用例写得很完整,但里面混入了系统并不存在的字段或操作。

第二步:让 AI 先列"测试维度",不要急着写用例

我后来发现,更稳的做法是先让 AI 输出测试维度,而不是直接输出最终用例。

比如:

维度 可选值
角色 管理员、区域经理、普通销售
数据归属 本人、本区域、跨区域、无归属
查询条件 无筛选、状态筛选、区域筛选、时间筛选、组合筛选
请求来源 正常前端请求、手动构造参数
结果验证 返回数据范围、总数、分页、空结果

这一步很有用。

测试人员可以先看维度是否完整,再决定是否让 AI 继续生成用例。

我用的提示词是:

text

复制代码
请不要直接写测试用例,先分析这个 Bug 涉及的测试维度。
输出:- 权限维度- 数据维度- 查询参数维度- 异常输入维度- 自动化验证维度- 需要人工确认的问题
要求:每个维度给出具体取值,不要写抽象概念。

这比一上来生成 30 条用例更可控。

如果维度都错了,后面的用例再多也没意义。

第三步:把用例分成三层,而不是一股脑全测

AI 很容易生成大量用例。看起来很勤奋,但真实项目里不可能每次回归都跑几十条低价值用例。

我会把它生成的用例分成三层:

1. 冒烟层

只验证核心修复是否生效。

用例 角色 操作 预期
普通销售默认查询 普通销售 不传筛选条件查询客户 只返回本人客户
区域经理默认查询 区域经理 查询客户列表 只返回本区域客户

2. 组合层

验证 Bug 相关维度是否存在交叉遗漏。

用例 角色 查询条件 预期
普通销售按区域筛选 普通销售 regionId=其他区域 不返回非本人客户
普通销售按状态筛选 普通销售 status=跟进中 返回本人且状态匹配客户
普通销售组合筛选 普通销售 regionId + status + 时间范围 不突破本人数据范围

3. 防绕过层

验证前端没有暴露的参数,后端是否也做了约束。

用例 操作 预期
手动传 ownerId 为他人 构造请求 ownerId=其他销售 不返回他人客户
手动传 regionId 为跨区域 构造跨区域查询 不返回越权数据
修改分页参数 pageSize 较大 返回数据仍受权限限制

这一层很关键。权限类 Bug 不能只测 UI,因为用户请求不一定来自正常页面操作。后端接口必须独立校验权限边界。

第四步:让 AI 生成可自动化的断言

很多 AI 生成的测试用例停留在"预期结果正确"这种描述上,不能直接拿去做自动化。

我会继续追问:

text

复制代码
请把适合自动化的用例转换成接口测试断言。
要求:1. 使用伪代码表达,不依赖具体测试框架;2. 每条断言要能验证权限边界;3. 不只判断 HTTP 状态码;4. 要检查返回列表中每条数据的 ownerId 或 regionId;5. 如果需要测试数据,请列出前置数据。

输出会接近这样:

text

复制代码
登录普通销售 userA请求 GET /api/customers?regionId=regionB&status=active
断言:- response.status == 200- response.data.list 中每条记录的 ownerId == userA.id- response.data.list 中不存在 regionId == regionB 且 ownerId != userA.id 的记录- response.data.total 与符合 userA 权限的数据数量一致

这就比"只能看到本人客户"更适合交给自动化测试。

如果项目里使用 JUnit、Pytest、Postman、Apifox 或其他测试工具,可以再让模型按团队现有格式改写。但我建议先生成伪代码,确认逻辑后再转成具体框架代码。

不同模型的输出差异

这次我没有做严谨排行榜,只是用同一份 Bug 材料做了几轮观察。

模型 更适合的环节 需要注意
ChatGPT 把 Bug 复盘转成测试流程,用例表达比较清楚 偶尔会补充不存在的字段,需要核对
Claude 长文本分析、规则整理、边界条件归纳 输出较长,要人工压缩
Gemini 快速给出多个测试维度和用例变体 需要加强业务约束
DeepSeek 中文测试用例、接口断言、技术表达 要明确不要扩展业务假设
Grok 适合做反向提问和异常路径补充 输出风格有时偏发散

我的经验是:

权限、金额、数据范围这类问题,不要只看哪个模型写得顺,而要看它是否能把边界讲清楚,是否能提出"你还缺哪些信息"。

一个模型如果在信息不足时仍然给出非常肯定的结论,反而要小心。

用 AI 生成测试用例的验收表

为了避免"看起来很多,但实际没用",我给 AI 生成的用例做了一个小验收表:

检查项 通过标准
覆盖 Bug 根因 用例能验证本次缺陷的真实原因
覆盖组合条件 不只测单个筛选项
权限断言明确 能检查 ownerId、regionId 等关键字段
可复现 前置数据清楚,步骤能执行
可自动化 至少部分用例能转成接口测试
无编造字段 不出现系统不存在的参数或状态
有人工确认点 不确定规则标记出来

这张表比用例数量更重要。

有时候 8 条高质量用例,比 40 条泛泛的用例更有价值。

数据和日志要先脱敏

测试场景里经常会涉及用户 ID、手机号、客户名称、合同编号、内部接口、线上日志。这些内容不要直接贴给 AI。

可以这样处理:

text

复制代码
真实用户 ID -> userA / userB客户名称 -> customer_001手机号 -> 138****0000合同编号 -> contract_xxx线上域名 -> api.example.com内部 Token -> removed_token

如果要让 AI 分析日志,也建议只保留和问题相关的字段,比如请求路径、状态码、错误码、耗时、脱敏后的用户标识。权限类、金融类、医疗类、政务类数据尤其要谨慎,AI 只能辅助整理和分析,不能替代最终合规判断。

常见误区

只让 AI 写正常流程

正常流程用例通常不难,真正容易漏的是边界、组合、异常输入和绕过前端的接口请求。Prompt 里要明确要求这些维度。

直接把 AI 用例放进测试计划

AI 输出必须经过测试人员和开发人员确认。尤其是权限规则、金额计算、审批流、数据范围这类场景,不能只靠模型判断。

只断言状态码

接口返回 200 不代表逻辑正确。权限类测试至少要检查返回数据里的关键字段,必要时还要校验 total、分页、排序和空结果。

把模型当需求来源

AI 可以发现问题,但不能替产品补规则。遇到"区域经理能否查看离职销售客户"这类业务定义不清的问题,应该标记为待确认,而不是让模型拍板。

一个可以复用的 Prompt 模板

text

复制代码
你是测试工程师,请基于以下 Bug 复盘材料生成回归测试方案。
输入内容包括:- Bug 描述- 修复目标- 角色权限规则- 接口字段- 已知测试数据- 不确定规则
请分三步输出:1. 先列测试维度,不要直接写用例;2. 再生成分层测试用例:冒烟层、组合层、防绕过层;3. 最后把适合自动化的用例转成接口断言伪代码。
要求:- 不编造不存在的字段;- 不确定内容标记为"需确认";- 每条用例包含前置数据、操作步骤、预期结果、优先级;- 权限类用例必须检查返回数据中的关键字段;- 输出 Markdown 表格。

这个模板不只适合权限问题,也能改成订单状态、优惠券规则、审批流、报表统计、数据同步等场景。

结尾:从一次真实缺陷开始做,不要上来追求全自动

如果团队想用 AI 辅助测试,我建议从"最近一次线上 Bug"开始,而不是一上来建设大而全的测试平台。

比较稳的路径是:

  1. 选一个真实 Bug;
  2. 整理复盘材料和接口字段;
  3. 让 AI 先拆测试维度;
  4. 人工确认维度后再生成用例;
  5. 把高价值用例转成自动化断言;
  6. 下次回归时验证它是否真的拦住了问题。

AI 生成测试用例的价值,不在于一次输出多少条,而在于帮团队把容易漏掉的组合条件、边界条件和验证断言提前摊开。测试人员仍然要负责判断规则是否正确,开发人员仍然要验证接口实现,产品也要确认业务边界。把这几层关系理清楚,AI 才能真正进入测试流程,而不是停留在"生成一份看起来很完整的文档"。