做软件测试这么多年,我一直觉得用例设计是"看起来有方法、做起来靠体力"的活儿。需求评审一小时,真正写用例却要一整天,尤其碰到订单、支付、权限这些业务规则密集的模块,用例一写就是上百条,写到最后脑子都木了,还得反复确认有没有漏掉边界条件。我自己经历过一个订单中心模块,光退货流程就写了48条用例,写完依然心里没底。所以AI生成测试用例这个方向一冒头,我第一时间就去试了。
从去年到现在,我先后用过直接对话生成、LangChain流水线、Agent编排三种方案,在真实项目里跑过完整的生成、评审、执行闭环,也踩过不少坑。这篇文章不聊虚的,直接讲清楚几件事:现在用AI生成测试用例到底靠不靠谱,三条主流技术路线怎么选,具体怎么从需求输入做到用例入库,哪些环节最容易翻车,以及AI生成的用例怎么验收才算合格。适合正在做测试平台建设、或者单纯想提高用例设计效率的测试开发同学参考。
1. 为什么"AI生成测试用例"是今年最该补的能力
1.1 先用一个真实场景说明痛点
假设你负责用户中心,包含登录、注册、找回密码、绑定手机号、第三方授权五个子模块。按照传统做法,你得先读懂PRD,然后对照等价类划分、边界值分析、场景法、判定表这套设计方法,把每个输入框、每个业务流程拆成用例。一个中等规模的模块,少则几十条,多则几百条,而且这些用例不是写完就完了,之后还有评审、维护、回归执行、失败排查,整个生命周期的人力成本非常高。
我见过很多测试团队的真实状态是:用例库里有几千条用例,但没人说得清覆盖是否完整。问起来就是"大概吧""应该够了吧"。因为靠人肉去核对每条需求对应哪些用例、每条用例覆盖了哪个分支,本身就是一个巨大的维护成本。而AI恰恰擅长这种"基于规则描述生成结构化内容"的事情,它不累、不烦、不会因为写到第80条就开始敷衍。
1.2 现在的模型能力到底到了一个什么水平
很多人对AI生成测试用例有误解,觉得就是"把需求贴给ChatGPT让它写几条看看"。确实可以这么用,但这不是完整的方案。从技术角度看,现在的大语言模型已经能做到三件事:
- 理解领域描述:能读懂接口文档、PRD、操作说明里关于业务规则的自然语言描述。
- 套用测试设计方法:在提示词引导下,可以按等价类划分、边界值分析、场景法、错误推测等方法来组织用例。
- 结构化输出:能以JSON、表格、Markdown等指定格式输出,并且能遵循字段约束。
这三点凑齐,就等于"一个熟悉测试理论、但对你业务一无所知的新人"。你给它清晰的输入和规则,它能在几分钟内产出一版像模像样的用例草稿。当然,这版草稿能不能直接用,取决于你的输入质量和后续把关机制,这一点后面重点讲。
1.3 哪些场景收益最大,哪些场景别盲目用
我的结论是:收益和风险是分场景的,不要一刀切。
高收益场景:
- 接口测试用例:输入输出清晰,边界值容易界定,AI生成性价比最高。
- Web功能测试用例:基于页面流程和业务规则描述,AI能覆盖正常流和大部分异常流。
- 业务规则密集型模块:如订单状态流转、优惠券叠加、权限组合,用判定表和状态迁移图约束模型效果很好。
- 回归用例补充:已有代码变更,让AI基于变更点生成补充用例,能显著提高回归质量。
需要谨慎的场景:
- 强实时交互的UI自动化用例:涉及复杂元素定位、异步等待、动态数据的场景,AI生成的步骤往往过于理想化。
- 需要大量真实业务数据的用例:比如必须从生产环境脱敏数据中取值的用例,AI无法凭空捏造数据。
- 合规性极强的用例:金融、医疗等行业有明确监管要求的场景,AI生成的用例只能作为参考,不能直接作为合规证据。
2. 方案选型:Prompt直出、Agent编排、RAG增强三条路线怎么选
2.1 路线一:Prompt直出——适合快速验证和轻量场景
最简单的做法是把需求描述、接口定义直接塞进提示词,让模型输出测试用例。这个方案零成本,打开网页就能用,适合个人在小项目里快速出一版用例草稿。优点是没有工程负担,缺点是模型一次能看的上下文有限,复杂系统的需求动辄几万字,根本塞不下;而且输出不稳定,同样的输入换个说法结果可能差异很大。
我自己用Prompt直出做过一次踩点测试:把一个登录接口的完整参数文档喂给模型,让它输出接口测试用例。第一轮结果还可以,等价类、边界值、异常参数都有覆盖,大概20条左右。但我把参数从"用户名、密码"换成"登录名、密码、验证码、记住我"四个字段后,模型就开始漏场景了,验证码的失效逻辑、记住我的Cookie有效期这些边界都没覆盖到。这暴露了直出方案的核心问题:没有系统性的方法约束,模型会凭"直觉"生成用例,而不是按测试设计方法论逐个字段展开。
2.2 路线二:Agent编排——适合复杂系统和多步骤流程
Agent方案的核心是让大模型具备工具调用能力,不再是一次性的"输入-输出",而是可以自主决定调用哪个工具、读取哪份资料、执行什么操作。比如让Agent读取接口定义文件、查询存量用例库、调用覆盖率统计工具、甚至直接请求mock服务获得响应,然后把收集到的信息整合成用例。
我测试过的Agent方案里,LangChain是绕不开的框架。它的核心价值在于把"模型调用"组织成"工作流",每一环都有明确的输入输出,方便在中间插入校验、重试、人工确认。举个例子,一个标准的生成流程可以是:
- Agent读取需求文档,提取被测功能点列表。
- 针对每个功能点,Agent调用检索工具从存量用例库查找相似用例,避免重复。
- 结合检索结果和需求描述,生成该功能点下的用例。
- 调用格式校验工具,把生成的用例转成统一的JSON结构。
- 输出给人工评审。
这个方案的优势是可控、可扩展,而且每步都是可观测的,出了问题能定位到具体环节。劣势是工程成本高,你至少要维护一套Agent框架、工具定义和错误处理逻辑,对于小团队来说可能过重。
2.3 路线三:RAG增强——让模型"看着存量用例学"
RAG(检索增强生成)是另一种思路。很多团队其实都有存量用例库,里面躺着几千上万条历史用例,这些是宝贵的"参考答案"。RAG方案把这些用例向量化后存入向量数据库,生成新用例前先做相似检索,把最相关的历史用例作为参考上下文喂给模型。
这样做的直接收益是生成结果更贴合团队现有的用例风格和粒度。举个例子,同样是"登录失败"这个场景,A团队习惯写成"输入错误密码,点击登录,断言提示'密码错误'";B团队可能习惯拆成"密码为空、密码长度错误、密码多次错误锁定"多条。如果没有参考,模型可能按自己的理解输出一种风格,而RAG能保证它先看看你们团队过去是怎么写的。
2.4 三条路线的选型对比
我根据自己的实测经验整理了一个对比表,方便你做决策参考。
| 对比维度 | Prompt直出 | Agent编排 | RAG增强 |
|---|---|---|---|
| 适用规模 | 单接口、单功能点 | 中型以上系统、多模块 | 已有较完善用例库的团队 |
| 工程成本 | 几乎为零 | 高,需要开发和维护 | 中,需要向量化与检索链路 |
| 输出稳定性 | 低 | 中高,可编程控制 | 高,受存量用例质量影响 |
| 上下文限制 | 受限明显 | 可通过工具绕开 | 不依赖单次上下文,靠检索 |
| 适合阶段 | 个人尝鲜、快速验证 | 团队级正式落地 | 用例库成熟后的增强方案 |
我的建议是:不要一开始就上Agent+RAG,先拿Prompt直出跑通一条线,把输入规范和输出模板定下来,再逐步引入Agent流程和检索增强。步子迈大了容易把自己绊倒,这是我第一版方案失败换来的教训。
3. 落地实操:从需求输入到用例入库的完整流水线
3.1 需求输入的标准化:先解决"喂什么"的问题
AI生成用例的第一个瓶颈不是模型,而是输入。你得先把需求整理成模型能理解的结构化描述,而不是扔一份几十页的PRD让它自己找重点。我的做法是定义一套需求输入模板,包含四个区块:
- 功能概述:一句话说清楚这个功能是做什么的。
- 参与角色:哪些角色会使用,每种角色权限差异是什么。
- 业务规则:逐条列出硬性规则和约束,比如"同一账号每日最多可申请3次退款""优惠券不可叠加使用"。
- 接口/页面信息:相关接口定义、页面元素、字段约束。
这里有个很多人忽略的细节:要明确告诉模型"不需要覆盖哪些场景"。比如某个页面有管理员入口,但本次需求不涉及管理员功能,如果你不显式排除,模型很可能会自作主张生成管理员相关用例,造成无用输出。
我建议把需求输入做成一个固定的Markdown模板,并在提示词里要求模型只能基于模板内信息生成,不要外推。这一点配合后面的"可追溯性检查"能有效减少幻觉用例。
3.2 Prompt设计的核心三件套
Prompt不是越长越好,关键是结构。我实践下来,一个高效的用例生成Prompt必须包含三个部分:
第一是角色设定。明确告诉模型"你是一名资深测试工程师,擅长等价类划分、边界值分析、场景法和判定表驱动的测试用例设计",这能显著提升输出质量,因为语言模型在扮演特定角色时会更接近该角色的专业表达。
第二是设计方法的显式注入。不要期待模型主动使用完整的设计方法,你得直接命令它。我在Prompt里写了一段要求,大意是:对每个输入字段,必须输出合法等价类、非法等价类、边界内值、边界外值;对每个业务流程,必须输出正常流、备选流、异常流;对存在多个独立条件的规则,必须用判定表展开。这相当于把测试理论变成了模型的操作手册。
第三是输出格式约束。我一般要求模型输出JSON,并且给出字段定义。原因很简单,JSON可以直接程序化校验和入库,而Markdown表格看着舒服但解析起来全是坑。下面是一个我常用的Prompt模板,你可以直接改来用:
你是一名资深测试工程师,请基于以下需求信息生成功能测试用例。 设计要求: 1. 对每个输入字段,使用等价类划分和边界值分析,覆盖合法值、非法值、边界值(min-1, min, min+1, max-1, max, max+1)。 2. 对每个业务流程,覆盖正常流、备选流、异常流,以及流程中断、超时、重复提交等场景。 3. 对存在多个条件组合的规则,使用判定表方法展开所有有效组合。 4. 只基于下方【需求信息】中的内容生成用例,不得编造需求之外的字段、流程或规则。 5. 【明确不覆盖】中的场景不要生成用例。 输出格式: 以JSON数组返回,每个元素包含以下字段: - id: 用例编号 - title: 用例标题 - preconditions: 前置条件 - steps: 操作步骤(字符串数组) - expected: 预期结果 - data_type: 用例类型(功能/边界/异常/场景/判定表) - priority: 优先级(高/中/低) 【需求信息】 {这里粘贴结构化的需求模板内容} 【明确不覆盖】 {这里粘贴不需要覆盖的场景说明}这个模板的关键在于"只基于需求信息生成"和"明确不覆盖"这两句。前者限制了幻觉,后者控制了范围,少了这两句,输出质量会明显下降。
3.3 用结构化输出和校验逻辑锁死结果
Prompt写得再好,模型也可能偶尔输出不满足格式的内容。所以程序层面的校验和重试机制是必须的。我的做法是写了一个简单的校验函数,检查返回的JSON是否完整、字段是否存在、steps是否非空,不满足就带着错误信息让模型重新生成一次。
import json def validate_test_case_json(raw_content: str) -> list: try: # 模型可能输出带代码块标记的内容,先剥离 if raw_content.startswith("```"): raw_content = "\n".join(raw_content.split("\n")[1:-1]) cases = json.loads(raw_content) assert isinstance(cases, list), "输出不是数组" required_fields = ["id", "title", "preconditions", "steps", "expected", "data_type", "priority"] for case in cases: for field in required_fields: assert field in case and case[field], f"缺少字段: {field}" assert isinstance(case["steps"], list) and len(case["steps"]) > 0, "steps必须是非空数组" return cases except Exception as e: raise ValueError(f"格式校验失败: {e}")这个函数看着简单,但在真实流水线里能拦截掉相当比例的脏数据。我统计过,不加校验时大概有10%到15%的生成结果需要人工修正格式,加了校验和一次重试之后,这个比例能降到3%以下。
3.4 用LangChain把流水线串起来
当你要批量处理多个功能模块时,单次Prompt调用就不够看了。我会用LangChain构建一条完整的处理流水线,核心思路是"分模块处理、逐段入库、中间可观测"。
流程拆解如下:
- 需求切分:把大的需求文档按功能模块切分成多个小单元,每个单元独立生成,避免上下文过长导致遗漏。
- 相似用例检索:如果接入了RAG,这一步会从向量数据库查出与当前模块最相似的历史用例,作为few-shot示例注入Prompt。
- 用例生成:调用LLM对每个模块生成用例,走3.2节的Prompt模板。
- 格式校验:用3.3节的校验函数检查结果,失败则重试。
- 查重合并:与存量用例进行标题相似度比对,标记可能重复的用例,交给人工确认。
- 结果入库:把通过的用例写入测试管理平台或导出为指定格式文件。
下面是一个简化版的LangChain实现示意:
from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI prompt = ChatPromptTemplate.from_messages([ ("system", "你是一名资深测试工程师,只能基于给定的需求信息生成测试用例。"), ("human", "{requirement_text}\n\n设计要求:\n{design_rules}\n\n输出JSON数组。"), ]) llm = ChatOpenAI(model="gpt-4o", temperature=0.2) chain = prompt | llm def generate_cases_for_module(module_desc: str, design_rules: str) -> list: raw = chain.invoke({"requirement_text": module_desc, "design_rules": design_rules}) return validate_test_case_json(raw.content)注意temperature要调低,我实测里0.2是一个比较合适的值,既能保证一定的多样性,又不会让结构频繁跑偏。生成用例这种任务要的是稳定和一致,不是创意,所以temperature越低越好,但也不要调到0,因为完全确定性的输出在遇到边界场景时容易千篇一律。
3.5 与现有测试流程的衔接
生成的用例最终要回到团队现有的工作流里,而不是留在脚本里吃灰。我建议按三步来衔接:
- 格式转换层:把统一的JSON结构转换成测试管理平台支持的导入格式。现在主流平台像禅道、Jira、TestLink都有批量导入模板,写一个简单的映射脚本就行,这个不复杂但很值得做,因为每次导入省下的时间未来会以复利形式回报。
- 需求映射:在导出用例时保留一个"需求来源"字段,记录该用例对应需求的ID。这样后续做覆盖率分析时,可以直接按需求维度统计用例分布。
- 执行反馈:用例执行失败后,把失败记录和关联的源代码变更信息回传给AI,让它分析是用例本身设计错误,还是代码缺陷。这一步是把AI从"生成器"升级为"质量分析师"的关键,也是很多人没做的一步。
4. 实测踩坑记录:AI生成用例最容易翻车的五个环节
4.1 幻觉用例:模型自信地编造不存在的功能
这是AI生成测试用例最大的坑,没有之一。我在一次订单系统测试中,需求里根本没有"取消订单"这个功能,但模型生成的用例里赫然出现了"取消订单后优惠券自动退回"这种步骤,连前置条件和预期结果都写得像模像样。这种幻觉用例最危险的地方在于,它看起来太像真的了,评审的时候很容易被扫过去。
我后来在两个层面做了缓解。一是在Prompt里强制加"只基于需求信息、不得编造字段或流程"的约束;二是在生成之后加一道"可追溯性检查",把用例里出现的每个关键操作和字段,与需求文档做关键词匹配,匹配不到的打上"待确认"标记,强制人工复核。实际上这道检查用简单的字符串匹配就能拦截掉大部分问题,不需要上什么高级模型。
4.2 边界值和异常流的系统性缺失
如果你不给模型明确的边界值指令,它会默认生成一版"快乐路径"用例:输入正常值、流程走通、断言成功。这是大模型训练数据的统计偏好决定的,毕竟正常流程的用例在公开数据集里占绝大多数。
解决这个问题靠的是Prompt里的显式要求。我在3.2节的模板里专门写了min-1, min, min+1, max-1, max, max+1这套规则。实测下来,加了这段文字后,边界值用例的数量大概提升了两到三倍。很多工具号称"AI自动生成测试用例"却不好用,根因往往就在这里——它没有把测试设计方法论显式注入到生成逻辑里。
4.3 业务规则理解偏差
语言模型对隐含的业务约束理解经常出偏差。举一个真实例子:某个优惠券活动规则是"新用户首单可用,且不可与满减券叠加"。我让AI生成该活动测试用例时,它写出了"新用户使用满减券下单成功"的用例,原因是两个规则分开看都能理解,但组合在一起,模型没有判断出这是一个互斥约束。这种偏差在规则多的业务里特别容易出现。
我的应对办法是把重要的业务规则从需求描述里单独拎出来,放进Prompt的"约束条件"区块,而不是混在一大段描述文字里。同时,对于多个规则并存的场景,要求模型用判定表展开所有条件组合,再从中删掉互斥组合。这个操作会让模型在组合判断上谨慎很多。
4.4 输出格式不稳定
模型偶尔会输出非法的JSON,最常见的是中英文标点混用、字段名被翻译成中文、嵌套层级错乱。尤其是当你切换模型版本或供应商时,格式漂移会更明显。最初我靠人工在编辑器里修,效率极低,后来才意识到必须做程序化的容错。
除了第三节的校验函数,我还加了一层修复逻辑:解析失败时,把错误信息拼进重试Prompt,让模型"参考上轮输出和报错原因重新生成"。这比直接Re-generate要有效,因为模型能看到自己上轮的失误,针对性修正的概率高很多。重试一次失败率能降一半以上,超过两次重试再失败就直接打回人工,别浪费token。
4.5 重复生成导致用例库膨胀
没有查重机制的方案,跑不了几轮就会让用例库变成垃圾场。同一个登录功能,每次需求微调都生成一轮新用例,旧的又不清理,很快就会出现几十条"高度相似但又不完全一样"的登录用例。维护成本瞬间失控。
我的做法是在入库前做相似度比对:把新生成的用例标题先做标准化(去掉数字、标点、空格),然后和存量用例计算文本相似度。超过阈值就合并或标记为重复,交给测试人员确认。另外,每个功能模块只保留一个"活跃用例集",需求变更时先标记旧用例为废弃,再生成新的,保持库的整洁。
5. 质量验收:AI生成用例怎么评审、怎么算合格
5.1 建立可量化的验收指标
AI生成的用例光靠"感觉还行"是不够的,得用指标说话。我自己在项目里用四个指标来验收一批生成用例的质量:
| 指标 | 计算方式 | 合格参考线 |
|---|---|---|
| 需求覆盖率 | 有对应用例的需求点数 / 总需求点数 | ≥ 95% |
| 字段边界覆盖率 | 实际覆盖的边界值数量 / 应覆盖的边界值总数 | ≥ 90% |
| 异常场景占比 | 异常流用例数 / 用例总数 | 30%~50% |
| 有效用例率 | 评审通过用例数 / 生成用例总数 | ≥ 70% |
这四个指标里,前两个衡量的是"够不够全",第三个衡量的是"有没有偏科"——如果生成的用例全是正常流程,那再新颖也没意义;第四个衡量的是"能不能直接用"。每个指标的具体数值可以根据团队情况调整,但维度建议保留。
5.2 人机协同的评审流程
AI生成的用例不能直接进库,但也不需要每条都人工评审,那样效率优势就没了。我的流程分三层:
- 第一层:机器自检。检查格式合法性、字段完整性、标题查重、需求映射关系。这一层能过滤掉大概两到三成的低质量输出。
- 第二层:人工抽检。测试人员重点抽看高风险模块的用例,比如涉及资金、权限、数据删除的模块全部人工过一遍;低风险模块按30%比例抽查。
- 第三层:执行验证。把用例落到测试环境跑一遍,看步骤是否可执行、预期结果是否可断言。这层虽然是成本最高的,但对接口测试来说收益非常明显,因为接口用例跑起来快,很快就能发现AI编造的字段名或错误的状态码。
5.3 把评审结果反哺给模型
AI生成用例的一个隐性优势是:你可以把过去评审中发现的"坏用例"整理成负样本,在下一次生成时作为反例提示给模型。比如"不要生成不含断言的用例""不要虚构需求中不存在的按钮""不要漏掉对返回码的校验"。这些负样本不需要很多,十条以内就能让模型的行为有明显改变。
我在实践里维护了一个bad_cases.md文件,每次评审发现典型问题就往里加一条。生成时把它作为一小段上下文注入Prompt的system消息中。这个文件三个月迭代下来,AI生成的用例有效率从大概60%提升到了接近80%,效果比换更强的模型还明显。所以说,AI生成测试用例不是一次性工作,而是一个需要持续反馈的闭环。
6. 工具与生态盘点:我的实测结论
这个方向现在很热,工具也多,我把实测过的主要方案分成了四类,并给出我的使用结论。
6.1 IDE AI编程插件
以Curo为代表的一批AI编程工具内置了"自动生成测试用例"能力。你只要选中一个函数或方法,插件就能在编辑器中直接生成对应的单测或接口测试。这一类工具对代码级用例生成效率极高,尤其适合单元测试场景。它的局限在于依赖代码上下文,对业务规则的理解有限,适合生成"这个函数怎么测"的用例,而不是"这个需求怎么测"的用例。所以我的定位是:IDE插件负责代码层面的单测生成,业务级用例交给独立的AI流水线来做。
6.2 测试用例Skill体系
最近社区里比较流行"测试用例skills"这类封装。本质上它是一套优化过的系统提示词加少量工具定义,打包成可复用的插件或Skill。优势是开箱即用、针对性强,很多Skill里内置了等价类划分和边界值分析的设计规则,生成的用例质量明显高于裸调模型。劣势是各家封装质量参差不齐,而且大部分是英文场景,对中文业务上下文适配一般。建议用之前先拿自己的需求模板跑一遍,看看输出是否符合团队风格。
6.3 框架级与平台级方案
LangChain、各类AI Agent平台,以及商业化的AI测试用例生成平台,属于框架级甚至平台级方案。这类方案适合团队正式建设"AI测试用例生成"能力,需要一定的工程投入。商业平台通常提供了更友好的界面和与测试管理工具的集成,但要注意两个问题:一是数据安全,你的需求文档、接口定义会发送到第三方模型,敏感信息评估要做在前面;二是可定制性,很多商业产品对Prompt的开放度有限,你想注入自己的业务规则和负样本时可能会碰壁。
6.4 我的最终组合建议
说了这么多,给一套可以直接抄的落地方案。对于大部分测试团队,我建议从"Prompt直出"起步,用第三节的模板先跑一个模块验证效果,确认可行后再按以下路径演进:
- 第一个月:固定需求输入模板和Prompt模板,用脚本批量生成接口测试用例,Excel或JSON导出,人工评审后使用。
- 第二到三个月:引入LangChain流水线,加入格式校验、查重、需求映射,把用例导入测试管理平台,建立覆盖率统计。
- 第三个月之后:如果存量用例库质量不错,就加RAG检索增强;如果被测系统足够复杂,再考虑完整Agent方案。
我在实际项目里把第一和第二阶段都走完了,收益最明显的是接口测试用例的编写效率。原来一个模块的接口用例要写大半天,现在生成、评审、修正一套下来大概两小时,而且边界覆盖比手写还完整。第三阶段的RAG正在做,体感是有参考示例后,输出风格更统一,但带来的工程复杂度也是实打实的,别指望零成本白拿好处。
说到最后,有一件事我想单独提醒:AI生成测试用例这件事,最值钱的不是"生成"这个动作,而是"你喂进去的输入规范和你能接住的输出质量"。把需求标准化做好、把负样本反馈跑起来,比换个更贵的模型重要得多。这些都是我踩了一轮坑之后才悟出来的,希望你能少走几趟弯路。