news 2026/9/17 7:14:45

LLM智能化测试用例生成实践:从Prompt到RAG的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LLM智能化测试用例生成实践:从Prompt到RAG的完整指南

从一个过气考渣的角度看LLM智能化测试用例生成

说实话,我从来都不是一个考试型选手。当年读书的时候,最怕的就是老师划重点——不是怕划得太多背不完,而是怕划完之后我发现,自己根本不知道出题人会怎么从这些重点里“变出花样”来。工作之后做软件测试,我才发现这事儿换了个马甲又来了:给你一份PRD,让你设计测试用例,本质就是让你“替用户出考卷”,你得预判用户会怎么操作、系统会在哪里翻车、边界条件藏在哪个犄角旮旯。你说,这不是逼一个考渣去当出题老师吗?

所以当LLM智能生成测试用例这个概念火起来的时候,我第一反应其实是:这玩意儿是不是就是那个“传说中的出题AI”?后来自己折腾了一阵子,发现它确实能干活,而且干得比我预期的好不少,但也没少让我踩坑。这篇文章我不打算写那种“AI赋能质量保障”的空话,就从一个参加过无数次“考试”但总考砸的人的角度,聊聊LLM到底是怎么生成测试用例的、我在实操里是怎么让它出活的、以及那些文档里不会告诉你的坑。

1. 内容整体设计与思路拆解

1.1 传统测试用例设计为什么这么难

在聊LLM之前,得先弄明白传统测试用例设计难在哪儿。我见过太多测试新人拿到需求之后,憋了半天写出来的用例全是“正常输入+正常输出”,边界值、异常流、场景组合基本靠猜。这不是态度问题,是认知带宽问题。

人类设计测试用例,实际上是在做两件事:第一,理解业务逻辑,搞清楚这个功能到底要干什么;第二,基于这份理解去枚举可能出问题的场景。问题在于,业务逻辑通常藏在PRD的文字描述里,有歧义、有隐含假设,而场景枚举又依赖个人的经验积累。一个刚工作一年的测试,和干了五年的老测试,写出来的覆盖度可能差两三倍,这就是经验差。

等价类划分、边界值分析、判定表这些经典方法,说白了就是把“枚举场景”这件事尽量结构化。但方法归方法,真正执行起来还是要靠人去读需求、去理解业务。PRD写得烂一点,用例质量直接崩。

1.2 LLM凭什么能“当出题老师”

LLM能生成测试用例,底层逻辑其实和我们做题时“揣摩出题人意图”是差不多的。你在学校考试的时候,看到一道题,会去想:老师这道题考的是哪个知识点?是不是想挖个陷阱让我跳?会不会有个边界条件我没注意到?LLM干的事情本质上也是这个——它读了大量的软件工程文档、测试用例样本、技术问答之后,学会了测试用例的“常见套路”和“出题风格”。

比如你给它一段“用户登录”的需求描述,它不需要你教它什么叫“空密码”“密码错误”“账号锁定”,这些高频场景在它的训练语料里已经出现了成千上万次。它做的事情其实是把这些高频场景按照一定的概率分布“重新组合”起来,针对你输入的需求文本做适配。

这就是为什么LLM生成测试用例这件事能成立——它的“应试题库”实在太大了,大到很多老测试员脑子里的经验库在它面前都不够看。这不是说LLM能替代测试工程师,而是说它能帮你把“枚举场景”这个苦力活干完,你只需要做筛选和补充。

1.3 方案选型:怎么用它才不翻车

我对LLM生成测试用例的定位一直是“辅助工具”,不是“自动驾驶”。你想要的效果是:给它一份PRD,它吐出来一份覆盖度还不错的用例草稿,然后你在草稿基础上修修补补,而不是它直接生成一套可以直接提交给开发的完整用例。

为什么这么定位?因为LLM有一个非常突出的问题——幻觉,也就是一本正经地胡说八道。它可能生成一个看起来完全合理、但业务上根本不存在的操作步骤。你说这个用例能不能直接用?大部分能,但总有那么几条是需要你人工甄别的。用“辅助生成+人工审核”的模式,可以最大化发挥它的效率优势,同时把风险控制在可接受范围内。

从实操层面讲,我测试过几种不同的用法:直接把PRD丢给它让它自由生成、给它的Prompt里加上系统化的测试设计方法指令、让它先根据需求生成测试点再展开用例、以及用RAG把历史缺陷数据喂给它。不同方式出来的效果差别很大,这个后面细说。

2. 核心细节解析与实操要点

2.1 一次完整的LLM生成测试用例长什么样

我拿一个具体的例子来说。假设有这么一段PRD片段:

用户可以在订单列表页选择待支付订单,点击“取消订单”按钮,系统弹出确认框,用户确认后订单状态变为“已取消”,库存数量恢复,优惠券退还到用户账户。

如果你直接把这段文本丢给LLM让它生成测试用例,它通常会给你类似这样的东西:

用例编号前置条件操作步骤预期结果
TC01存在待支付订单点击“取消订单”按钮,点击确认订单状态变为“已取消”
TC02存在待支付订单点击“取消订单”按钮,点击取消订单状态不变,仍为“待支付”
TC03存在待支付订单,库存有限点击“取消订单”按钮,点击确认库存数量恢复
TC04存在待支付订单,且使用了优惠券点击“取消订单”按钮,点击确认优惠券退还到用户账户
TC05存在待支付订单点击“取消订单”按钮,不进行任何操作确认框消失,订单状态不变

这就是LLM的“基操”:基于文本语义直接推导用例。看起来还不错,对吧?但如果你就这么交上去,大概率会被开发或者测试负责人打回来,因为漏了太多关键场景——比如订单状态不是“待支付”而是“支付中”怎么办?订单已经超时自动取消还能不能手动取消?取消请求在网络异常时重复提交会不会出问题?并发场景下库存恢复会不会超卖?

这个问题本质上不是LLM不行,而是输入信息不够。PRD只写了主流程,LLM也没法凭空知道业务上还有哪些分支规则需要处理。所以真正好用的做法,是在喂给LLM的需求文档之外,再把一些隐含的规则明确告诉它。

2.2 提示词怎么写,效果天差地别

我试过很多种Prompt写法,踩过不少坑,最后沉淀下来一个相对稳定的套路。核心思路是让LLM按照“先分析、再列场景、最后转用例”的三步走流程来干活,而不是上来就直接给用例。

我常用的Prompt模板大致是这样的:

你是一名资深的软件测试工程师,擅长功能测试和异常场景测试。请根据以下需求描述,先进行测试分析,再输出测试用例。 【需求描述】 (这里粘贴PRD内容) 【补充业务规则】 (这里粘贴从PRD之外获取的补充规则,比如状态机变化、并发限制、权限规则等) 【输出要求】 1. 先输出测试分析,包括:功能点拆解、涉及的业务规则、潜在风险点。 2. 再输出测试用例,每条用例包含:用例编号、前置条件、测试步骤、预期结果、优先级。 3. 覆盖正常的业务流、异常的输入、边界条件、权限控制、数据一致性等场景。 4. 用例步骤要具体可操作,禁止出现“验证系统功能正常”这类模糊描述。

这个Prompt和“直接让它生成”最大的区别在于:它强制LLM先做“思考”再“输出”。实测下来,同样的需求,加了这一步之后生成的用例覆盖度能提升不少,尤其是异常场景,效果明显好很多。

注意,我不建议在这个Prompt里塞太多“方法论名词”——比如“请用等价类划分法、边界值分析法、判定表法设计用例”。LLM虽然在训练数据里见过这些词,但它并不真的懂怎么系统地运用它们,你硬塞反而可能让它把简单事情搞复杂。更好的方式是直接描述你要的用例属性,而不是方法名。

2.3 用“测试点”过渡是我最推荐的方式

在多次实验之后,我发现一个很好用的小技巧:让LLM先输出“测试点清单”,再人工筛选补充,最后再让它基于筛选后的测试点展开完整用例。

原因是这样:如果一步到位让它生成用例,LLM很容易在细节上过度发挥,生成大量重复度很高的用例(比如每个字段都来一遍同样的验证逻辑)。但先列测试点的话,LLM的输出更加精简,人工检查的成本很低,而且一旦发现漏了某个功能点,你只需要在那个测试点后面补一句就行。

举个例子,还是上面那个取消订单的需求。LLM生成的测试点可能包括:

  • 正常取消订单流程
  • 取消确认框的二次确认逻辑
  • 取消后库存恢复
  • 取消后优惠券退还
  • 取消后订单列表状态刷新
  • 已支付订单不可取消
  • 网络异常时取消请求的处理

如果你发现漏了“订单已超过取消时限”这个场景,直接在测试点清单里加一条,然后让LLM基于“原始需求+补充后的测试点”生成完整用例,出来的结果就会精准很多,基本不会再有那种“看起来对但实际没用”的废用例。

这就是为什么我一直强调:LLM测试用例生成不是“一键出活”,而是一个“人机协作”的流程。人负责判断与补充,LLM负责展开与细化,各干各擅长的部分。

3. 实操过程与核心环节实现

3.1 我搭建的一套完整流程

前面讲了很多方法论,这块把我实际跑通的流程完整写出来,你照着搭就行。

整个流程分五步:需求预处理 → 规则补充 → 测试点生成与筛选 → 用例展开 → 质量复查。

第一步,需求预处理。把PRD里跟“当前要测的功能”相关的部分单独摘出来,不要一大篇全丢给LLM。我之前犯过这个错,一整份几十页的PRD直接丢进去,结果生成的用例大量集中在前面几个功能点,后面的基本被忽略——LLM也有“注意力上限”,太长的输入它会“糊弄”过去。所以先做裁剪,把要测的功能描述控制在几百字以内最好。

第二步,规则补充。这一步是最容易被忽略,但恰恰是决定用例质量的关键。PRD里不会写“订单取消时限是支付后30分钟内”“取消时如果库存已经被其他订单占用怎么处理”这类隐含规则,你需要把这些整理成一条条明确描述,接在需求文本后面。

第三步,测试点生成与筛选。用前面给的Prompt模板,先让LLM生成测试点清单。然后人工过一遍,删除重复的、补充遗漏的。这一步通常只需要几分钟。

第四步,用例展开。把“原始需求 + 补充规则 + 筛选后的测试点”一起作为输入,让LLM展开完整用例。这时候生成的用例已经很有针对性了,不会再乱发挥。

第五步,质量复查。把LLM生成的用例导入到用例管理工具里,抽几条关键的跟着执行一遍,看看步骤描述是否清晰、预期结果是否可判断。

3.2 一个完整示例:订单取消功能

为了让你能直观看到效果,我把上面那个“取消订单”的例子完整跑一遍。

需求描述(已裁剪):

用户在订单列表页选择待支付订单,点击“取消订单”按钮,系统弹出确认框,用户确认后订单状态变为“已取消”,库存数量恢复,优惠券退还到用户账户。

补充规则(人工整理):

  1. 仅“待支付”状态订单可取消,“已支付”“已发货”“已完成”“已取消”状态订单不可取消。
  2. 订单取消后不可恢复。
  3. 订单超过支付时限(30分钟)后系统自动取消,用户不可手动取消。
  4. 同一订单取消请求需做幂等处理,重复请求不产生重复取消操作。
  5. 取消订单时,如库存已被其他订单占用,则只恢复仍可用的库存数量。

LLM生成的测试点:

  • 正常取消待支付订单
  • 确认框中点击取消按钮
  • 已支付订单无取消入口
  • 超时自动取消的订单不能再手动取消
  • 取消后库存恢复
  • 取消后优惠券退还
  • 重复点击取消按钮只生效一次
  • 取消请求失败时的提示信息

人工筛选后,补了一个测试点:

  • 取消时库存已被其他订单占用

然后让LLM基于这些展开,最终生成的用例里就包含了很多直接给PRD看不出来的细节场景。比如它会给“重复点击取消按钮”的用例设计出前置条件和精确步骤:“在网络延迟环境下,快速双击取消按钮,验证系统只处理一次取消操作”,这个角度就已经接近一个有经验测试员能想到的边界场景了。

3.3 工具链选型:从豆包到开源方案

很多人问我用什么工具跑。坦率说,测试用例生成这件事对模型本身的“考分”要求没那么高,主流的大模型都能干,但体验有差别。

国内的话,我用过豆包,也用过通义千问,两者都还不错,尤其是豆包,响应快、免费额度够用、对中文需求的理解也到位,日常做用例生成完全够用。和DeepSeek、ChatGPT做过对比,在测试用例生成这个场景下,差距没有想象中那么大,主要区别在于复杂业务逻辑的推理能力——当需求文本里有大量业务分支时,ChatGPT和Claude这类模型的生成质量会更稳定一些,对补充规则的遵循也更严格。

如果你对数据安全有要求,不能把需求文档传到外部平台,那就得考虑私有化部署。在这个场景下,我建议关注的是模型对长文本的理解能力和指令遵循能力,而不是参数大小。实测下来,7B到14B量级的模型就能生成不错的测试用例,关键是你在Prompt上花的功夫。我试过用Qwen2.5 7B模型跑同样的流程,用前面那个三步走Prompt,生成的用例可参考度能达到外部大模型的七八成,这在数据敏感的环境里已经很能打了。

还有一个经常被问的问题:要不要为了生成测试用例去学Prompt engineering?我的建议是不用专门学,但得知道几个基本技巧:明确角色、明确任务、明确输出格式、给示例(few-shot)。这些够用了。再深入的去研究什么思维链、角色扮演方法论,在这件事上收益不大。

4. Agent、Embedding与垂域化,到底要不要上

4.1 什么时候值得上Agent

“LLM Agent”这几年特别火,很多做技术的人一上来就想搭一套Agent让模型自动读需求、自动生成用例、自动提交到用例管理平台。我的看法是:先别急着上,搞清楚你要解决的问题是什么。

单次调用LLM和Agent工作流的区别在于:Agent是一个“多轮决策”系统,它能根据当前结果决定下一步做什么。在测试用例生成这个场景里,Agent真正有价值的点是“多步推理”——比如先读PRD提取业务规则,再根据规则列出测试点,然后针对每个测试点生成用例,最后自己检查一遍覆盖度,把遗漏的地方补上。

这个流程用单次调用也能做(就是前面那个三步走Prompt),但Agent能做到“自动迭代”:发现自己漏了场景就自己补,不用你在中间手动介入。不过代价是复杂度和成本都上去了,而且Agent链路越长,出错的可能性也越大——某一步模型理解偏了,后面全跟着偏。

我的建议是:如果你们的需求文本格式比较统一、业务规则相对稳定,先用单次调用的方式跑通,敏捷又够用。如果需求文本五花八门、业务规则特别碎片化,需要系统性地从多个文档里抽取信息再组合成测试依据,这时候上Agent就值得了。

4.2 Embedding和RAG在这个场景怎么用

Embedding和RAG是另一组被提到很多的名词。其实简单理解,Embedding就是把文本变成一串数字向量,让计算机能算“两个文本像不像”;RAG则是把知识库里的内容检索出来,塞进Prompt里让模型参考。

在测试用例生成这个场景里,RAG最有用的地方是:把你的历史缺陷报告、历史测试用例、业务规则文档做成知识库,生成用例之前先检索相关的历史缺陷和已有用例,让LLM参考着生成。

我试过一个场景:把某个模块过去半年收集到的线上缺陷(描述+根因)做成向量库,生成测试用例时,Prompt里会附带和当前需求最相关的几条历史缺陷。结果生成的用例里,有不少直接对标了历史缺陷的复现路径。这个效果是单纯靠提示词很难达成的,因为那些缺陷的具体复现细节根本不在模型本身的训练数据里,只有你才有。

不过RAG的坑也很明显:知识库的质量决定一切。如果你的历史用例本身写得就很烂,缺陷记录也含糊,那检索出来的东西反而会误导模型。所以做RAG之前,先花时间清洗知识库数据,宁缺毋滥。

4.3 垂域化:数据准备才是大头

垂域LLM是另一个所有AI热词里被误解最多的概念。很多人一听“垂域大模型”就觉得要训练一个自己的模型,其实在测试用例生成这个场景下,你真正需要的是“垂域数据”,模型本身用通用模型就行。

所谓垂域数据,就是你们公司特定业务场景下的需求文档格式、常见业务流程、专用术语定义、历史缺陷模式。这些怎么准备?我建议分几类来做:

第一类,术语表。把你们业务里特有的词汇整理出来,比如“待支付”“核销”“分账”这些词在你们业务流程里的准确含义。第二类,业务规则库。把分散在各处(PRD、产品白皮书、开会纪要)的业务规则统一收拢,按功能模块归类。第三类,历史用例和缺陷样本。按功能模块分好,标注清楚对应的业务场景。

这些数据准备的活不需要你做AI相关的事情,纯粹是业务梳理。但恰恰是这部分工作,决定了你的LLM测试用例生成方案能不能落地。我见过太多团队上来就买GPU调模型,折腾半天效果不好,最后发现是连自己的业务规则都没梳理清楚,模型再强也白搭。

5. 常见问题与排查技巧实录

5.1 模型“一本正经胡说八道”怎么治

这是用LLM生成测试用例时最让人头疼的问题。表现形式各不相同:编造需求里根本不存在的功能、虚构一个业务规则、或者在预期结果里写出不可能发生的状态变化。

我总结过这个问题的几种常见原因和对应解法:

第一,输入需求太模糊。LLM没法理解的地方就会“脑补”。解决方法是把输入文本写清楚,尤其是业务规则部分,能列多细列多细。

第二,Prompt里没限制它“只能基于输入内容生成”。这一点很关键。如果你不明确写“禁止添加需求中不存在的功能和规则”,模型会倾向于发挥。加一句“所有用例必须基于给定需求描述和业务规则,不得自行假设业务逻辑”能大幅减少幻觉。

第三,业务规则本身存在冲突。有时候PRD里写“用户可取消订单”,但另一段又写“取消功能仅对会员开放”,这种矛盾LLM是能发现的,但它不会主动告诉你,而是会选一个它认为合理的来生成。所以人工在“测试点筛选”那一步就要把关——如果LLM生成的测试点和你对业务的理解有冲突,大概率是需求本身有问题,这时候要先澄清需求,而不是硬生成用例。

5.2 用例重复、格式不稳定、优先级乱标

这三个问题属于“生成质量”问题,虽然不致命,但会让你用起来很抓狂。

用例重复的根源通常是需求文本里对同一功能有多处描述,或者LLM在生成时把自己的思考过程重复使用了。解法是限制输出篇幅,Prompt里明确“每个测试点生成1-2条用例”,如果不限制,LLM有时候会给一个场景生成五六条几乎一模一样的用例,看得人血压升高。

格式不稳定体现在:有时它给你Markdown表格,有时是列表,有时又给你JSON。这其实是你Prompt里输出格式描述不够具体导致的。我的做法是在Prompt里给一个用例模板示例,每个字段的含义写清楚,比如“优先级:P0-阻塞/ P1-核心/ P2-一般/ P3-建议”。给了示例之后,格式基本就稳定了。

优先级乱标的问题比较有意思。LLM给用例标优先级时,往往倾向于把正常流程标成P0,异常流程标成P1。这在很多场景下其实是反的——线上影响最大的往往是异常场景(比如支付重复扣款、库存超卖),而正常流程反而大概率不会出问题。解法是在Prompt里说明“优先级认定标准:用户影响范围大、发生概率高、涉及资金或数据安全的功能点优先标P0”,让LLM按这个规则重新评估。

5.3 效率和成本怎么平衡

这是老板们最关心的问题。用LLM生成测试用例到底能省多少时间?成本划不划算?我说一下自己的实测数据:

在一个中等复杂度的功能(大概30-50个功能点的Web模块)上,纯人工设计用例的时间大约是1到2个工作日(看测试员经验)。用我前面那个流程,把PRD处理好、补充规则、生成测试点、筛选、展开用例,我大概需要1到2个小时,最后生成出来的用例在此基础上再花半小时人工“精修”。整体算下来,效率提升至少是50%。

成本方面,用豆包这类国内API,单次生成几千字的响应也就几分钱,可以忽略不计。就算用ChatGPT或者Claude,一次生成50条用例的成本大概在几毛到几块钱之间,相比节省的人力成本,非常划算。

不过也要提醒一句:这里有个隐性成本是“人工审核”。LLM生成的用例不能无脑用,该覆盖的场景虽然覆盖了,但用例里可能藏着逻辑漏洞。我的经验是,审核一份50条用例的生成结果,大概需要20到30分钟,比从零开始设计花的时间少得多,但绝不是零成本。把这个时间算进去,才是真实的投入产出比。

6. 一些更深入的思考

写到这里,我想再聊聊一些技术之外的东西。

很多人担心LLM会取代测试工程师,我在实际使用之后的感受是:短期内不可能,长期看也不会。原因很简单——未来业务系统的复杂度不会降低,业务规则的管理比写用例本身更值得投入。当你需要把一份充满歧义的PRD转化成可执行的测试用例时,最难的其实不是“枚举场景”,而是“理解业务”。LLM能做的是帮你把“枚举场景”这个环节自动化,但“理解业务”这件事,依然需要人来主导。

不过另一方面,我也确实觉得测试这个岗位的画像会变。以前测试工程师的核心竞争力是“经验多多益善”——见过的bug越多,设计测试用例时越能想到别人想不到的场景。但LLM出现之后,“经验”被拉平了,一个用不好LLM的十年老兵,在用例覆盖度上未必比一个会用LLM的新人强多少。

真正拉开差距的变成了:你有没有能力把业务知识结构化、能不能设计出好的Prompt让模型发挥出水平、能不能判断模型输出中哪些可信哪些需要验证。这些能力,其实比“多写几年用例”更值钱。

这让我一个过气考渣挺感慨的:以前考试考的是你脑子里装了多少东西,现在这波技术变革,考的是你能不能在外部工具的辅助下把事情做好。对测试这个行业来说,这句话同样成立。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 7:13:49

PVE 7.2-1 安装全流程:硬件、文件系统、网络与首台虚拟机

几年前第一次装 PVE,我把它想得太简单了:下载 ISO、写进 U 盘、一路下一步、重启,然后浏览器里敲 IP——结果页面转圈转到凌晨两点。后来在不同硬件上反复装过十几遍才明白,PVE 7.2-1 这套安装流程表面上只有七八个界面&#xff0…

作者头像 李华
网站建设 2026/9/17 7:12:28

PPO算法中广义优势函数(GAE)的原理与实践优化

1. 广义优势函数在PPO算法中的核心作用强化学习中的策略优化算法PPO(Proximal Policy Optimization)之所以能成为当前最主流的算法之一,很大程度上得益于其采用的广义优势函数(Generalized Advantage Estimation, GAE)…

作者头像 李华
网站建设 2026/9/17 7:08:12

从“11asff”到工程化:临时项目如何做成可维护的代码仓库

刚拿到“11asff”这个项目代号时,估计很多人都跟我一样愣了几秒。它既不像“cloud-native-platform”那样一眼看懂业务方向,也不像“pay-service”那样直接暴露系统职能,看上去就是随手在键盘上敲出来的一个随机字符串。但如果你在代码仓库里…

作者头像 李华