1. 为什么测试用例生成是AI落地最值得啃的硬骨头
做AI辅助研发这么久,我见过太多团队把大模型接进IDE、搞了代码补全、做了对话问答,最后发现真正能产生确定性价值、能替代人干活的场景少之又少。唯独测试用例生成这件事,是我反复测试下来收益最稳定、最容易被团队接受、也最容易量产落地的一个方向。
原因很简单:测试用例本身就是半结构化的文本,它有模板、有规则、有覆盖要求,还有清晰的验收标准。这恰好是大模型的强项——它不需要像代码生成那样追求"一次编译通过"的确定性,只需要在给定的业务逻辑约束下,把各种输入、场景、边界条件枚举出来。换句话说,测试用例生成的容错空间比代码生成宽得多,哪怕AI生成的用例有瑕疵,人工review的成本也远低于从零手写。
但这里有个关键前提:如果只是扔给ChatGPT一句"帮我给登录功能写测试用例",你会发现生成结果非常泛、非常飘,全是教科书里的等价类边界值套路,根本落不到你的业务上。这就是行业里常说的AI"失忆症"——模型每次对话都是新的,它不知道你的系统长什么样,不知道你有哪些历史缺陷,更不知道你们团队的用例规范。
所以要做出真正"工业级"的AI测试用例生成流水线,核心不是把大模型调得多聪明,而是把知识库和工作流这两件事做好。知识库解决"模型不了解你的系统"的问题,工作流解决"模型不知道该怎么按规范干活"的问题。两者结合,才能把一次随机的AI对话变成一条稳定、可复用、质量可控的生产线。
这篇文章我会把我实际搭过的一套方案完整拆开讲,从知识库怎么设计、工作流怎么编排、到提示词怎么写、上下文怎么管理,最后再聊聊踩过的坑和效果数据。内容不多废话,直接能抄作业。
2. 先想清楚:知识库到底该往里放什么,不该放什么
很多团队一听说要做AI测试用例生成,第一反应就是"赶紧把公司所有文档都灌进知识库"。这是个非常危险的思路。知识库不是越大越好,恰恰相反,对测试用例生成这个场景来说,知识库的内容结构比体积重要得多。
我在实践中的做法是把知识库分成四个独立的知识域,互相之间不混存。
2.1 第一层:业务需求知识,解决"测什么"的问题
这一层放的是PRD、需求规格说明书、用户故事、原型图配套的文字说明。目的很纯粹:让大模型知道这个功能是给谁用的、解决什么问题、核心业务流程长什么样。
这里有个容易被忽略的点:不要直接扔原始PRD进去。大多数PRD是给产品和技术看的,里面有大量的背景铺垫、竞品分析、长期规划,这些对生成测试用例来说都是噪声。我会要求团队先把PRD做一次"用例化预处理"——只需要保留功能描述、业务规则、输入输出要求、异常分支这几类内容,一段段拆开,标注清楚功能编号。这步虽然费点人工,但效果立竿见影,生成用例的命中率能直接翻倍。
2.2 第二层:系统架构与数据字典,解决"测的到底是什么"的问题
光有业务需求还不够,模型还需要知道系统层面的约束。比如一个登录功能,你要测"用户名密码登录",但系统到底支持哪些登录方式?密码规则是什么?账号状态有几种?这些信息在PRD里往往不够细,但在接口文档、数据库设计文档、字段字典里都有。
我会把接口文档(Swagger/OpenAPI导出的YAML或JSON)转成结构化的Markdown摘要,再补上核心表结构说明、字段枚举值、状态流转图(用文字描述,不用图)。这层知识库是测试用例能落到具体参数的关键。没有这层,AI生成的用例永远停留在"输入有效用户名和密码"这种废话层面;有了这层,它才能写出"用户名为空、密码为6位纯数字、账号状态为已锁定"这种能直接执行的用例。
2.3 第三层:历史缺陷与踩坑经验,解决"哪些地方容易炸"的问题
这是我自己最看重、但绝大多数团队完全忽略的一层。把过去半年到一年的线上故障、缺陷单、漏测案例整理成结构化的缺陷知识,每一条包含缺陷描述、触发条件、影响范围、回归用例。
为什么这层如此重要?因为AI生成测试用例最大的问题不是覆盖率,而是"重点模糊"。模型生成的用例平均分布在所有功能点上,看不出哪些地方容易出问题。但真实项目里,80%的缺陷往往集中在20%的功能点上。把历史缺陷喂给知识库后,大模型在生成时会自动给这些高风险点加权,生成更细、更刁钻的用例。我实测下来的数据是,加入缺陷知识库后,生成用例的缺陷检出率提升了35%左右。
2.4 第四层:用例规范与命名规则,解决"怎么写得像人写的"的问题
这层放的是企业内部的用例编写规范、命名规则、优先级定义、模块划分方式。比如你们团队习惯用"前置条件-操作步骤-预期结果"三段式,还是"用例编号-测试标题-测试数据-测试步骤-预期结果"五段式;优先级是P0/P1/P2还是高/中/低;模块名怎么层级划分。这些"组织知识"看起来不起眼,但决定了生成的用例能不能直接进入现有的测试管理流程,而不是生成一堆还得人工重新格式化的东西。
我强烈建议这层知识库用Obsidian这类双向链接工具来维护,因为用例规范和缺陷数据之间有大量的交叉引用关系。比如某条规范是因为某个线上故障才建立的,用双向链接可以把这种因果关系保留下来。模型在检索规范时能顺带看到它背后的原因,生成用例时会更"懂行"。
2.5 知识库内容准入的边界:什么坚决不往里放
前面说了该放什么,这里得强调不该放什么。
第一,代码实现细节不要放。测试用例是黑盒视角,不需要知道内部用了什么设计模式、什么框架。放了反而会让模型在生成用例时被实现细节带偏,写出"验证Redis缓存被正确清理"这种白盒用例,干扰实际执行。
第二,性能测试、安全测试相关的专项知识按需放。如果你这次流水线只做功能测试用例,就不要把性能测试知识放进去。知识库太泛,检索时相关性会下降,模型反而抓不住重点。专项测试场景建议单独建知识库、单独跑工作流。
第三,已经废弃的文档、过期的接口信息绝对不要放。大模型不会主动判断知识的新旧,它只会照单全收。过期信息一旦被检索出来,生成的用例就是错的,而且错得很隐蔽,比没有知识库更可怕。
3. 工作流编排:从"问一句答一句"到"流水线式生产"
知识库解决了"模型知道什么"的问题,但光有知识库还不够。如果你只是把知识库挂在对话框旁边,让QA自己问、自己看,那把知识库换成一份文档没有任何区别。真正让AI测试用例生成达到工业化水准的,是把知识检索、用例生成、质量校验、格式转换这四步串成一条自动化流水线。
这里我强烈建议用Dify来搭建整个工作流,而不是自己写代码调API。不是因为写代码不行,而是Dify这类平台把RAG、变量传递、节点编排、模板渲染都封装好了,调整提示词、增删处理节点都是可视化操作,QA同学自己就能维护,不用每次改逻辑都找开发。Coze也可以,但Coze对"工作流内部数据处理"的能力我个人觉得没有Dify灵活,特别是当你需要做复杂的分支判断和循环迭代时,Dify的工程化能力更强。
3.1 流水线的第一站:需求解析与知识召回
整条流水线的第一步,是接收一份需求描述或PRD片段作为输入。这个输入可以是一个测试任务编号、一段功能描述、甚至是一段用户故事。系统首先对其进行意图识别,判断这次要生成的是接口测试用例、页面功能测试用例还是业务流程测试用例。不同的测试类型,后续走的处理路径完全不同。
意图识别之后进入知识召回阶段。这一阶段会把输入的需求文本做向量化处理,然后去知识库中检索最相关的业务需求片段、接口定义、历史缺陷和用例规范。这里有个细节:不要只用向量相似度做单一召回。我实际测试下来,最稳的做法是"向量检索 + 关键词匹配 + 重排"三管齐下。向量检索负责语义相关,关键词匹配保证必须提到的实体不遗漏(比如"用户名""验证码""锁定"这种高频词),再用一个重排模型把两路结果合并去重,取top-N作为上下文。
召回的知识片段数量需要控制。太少了模型没有足够的上下文,太多了又会把注意力稀释掉。我一般控制在8-12个片段之间,每个片段控制在200-500字。这些片段在送入大模型之前,还会做一次模板化拼接,把业务规则、字段定义、历史缺陷、用例规范分门别类地组织好,让模型知道哪段是需求、哪段是约束、哪段是历史教训。
3.2 流水线的第二站:分步生成——先框架后血肉
这一步是整个流水线的核心,也是我反复调整后觉得最值得讲的部分。
大多数直接让AI生成用例的方案,都是一次性让模型输出所有用例,那样生成的结果有两个问题:一是用例之间的覆盖点大量重复,二是没有层次感,把所有用例平铺在一个级别上。我的做法是把生成过程拆成两步,先让模型输出测试点和场景分析,再基于场景分析逐条展开成完整用例。
第一步,模型根据召回的业务需求和接口定义,输出一份"测试场景清单"。这份清单里的每一条是一个需要覆盖的场景描述,不涉及具体的用例格式。比如"验证用户名为空时的系统提示""验证连续5次输错密码后账号被锁定的流程""验证密码输入框是否支持粘贴操作"。这一步的目标是让模型把覆盖点先想全,避免在后面展开时东一榔头西一棒子。
第二步,把这份场景清单作为输入,逐条展开成标准格式的用例。每条用例包含用例编号、测试标题、前置条件、测试数据、操作步骤、预期结果、优先级、所属模块。这一步的关键是把"场景"翻译成"可执行的操作序列",比如"验证用户名为空"要翻译成具体的步骤:打开登录页面、不输入用户名、输入正确密码、点击登录按钮、断言系统提示"请输入用户名"。
拆成两步之后,模型生成质量提升非常明显。原因在于,一次让模型生成15条完整用例,模型的注意力会被格式消耗掉大半,它一边要想测什么,一边要想着格式怎么套,结果往往是格式对了但场景发散不开。而先做场景分析,模型可以集中精力想"要测什么",再做用例展开,模型只需要专注"怎么把这个场景写成规范用例"。这和人类测试专家写用例的思维是一样的。
3.3 流水线的第三站:规则校验与自动修正
生成出来的用例不能直接信,必须过一道规则校验的关卡。我在工作流里加了一个校验节点,用一段专门的提示词让大模型扮演"测试用例评审专家",把生成的用例和知识库里的用例规范做对比检查。
校验主要查四类问题:一是格式是否符合团队规范,字段有没有缺漏;二是步骤是否可执行,有没有只写"验证功能正常"这种不可落地的模糊描述;三是预期结果是否具体,有没有写出可以验证的明确断言;四是优先级分配是否合理,核心路径的用例优先级是否偏低。
校验的结果会进入一个条件分支节点。如果校验通过,直接进入下一步;如果校验不通过,会把问题描述和修正建议传回生成节点,让模型带着反馈重新生成一遍。这个"生成-校验-再生成"的迭代环节我设置了最高两轮,超过两轮就放弃自动修正,转入人工处理队列。实际跑下来,大约75%的用例一次就能通过校验,20%经过一轮修正后通过,只有5%左右需要人工介入。
3.4 流水线的第四站:格式适配与自动归档
通过了校验的用例,最后一步是格式转换和归档。这一步比较容易被人忽略,但恰恰是决定流水线能不能真正用起来的最后一公里。
很多测试团队用TestRail、PingCode、禅道或者自研的用例管理平台,每种平台对用例的导入格式要求都不一样。大多数是Excel模板,有些是JSON接口。工作流的最后一个节点就是读取知识库里的"平台导入规范",把生成的用例转换成目标平台要求的格式。
我的做法是维护了一组Jinja2模板,一个平台对应一个模板,用例数据用JSON格式在工作流内部传递,渲染模板时自动套成对应的Excel或CSV文件。这样如果团队换了用例管理平台,只需要新增一个模板文件,整个流水线不需要动。
这套工作流搭好之后,QA团队的操作简化成一步:把需求描述或PRD片段粘贴到输入框,点运行,几分钟后拿到一份按团队规范格式化好的用例清单,直接导入用例管理平台。这才是"流水线"应该有的体验——把复杂的生产逻辑封装在黑盒里,对外暴露的只有一个输入口和一个输出口。
4. 提示词设计:把"知识库里的内容"真正变成"模型手里的工具"
知识库和工作流是骨架,提示词是让骨架转起来的那口气。同样一个知识库、同样一条工作流,提示词写得粗糙和写得精细,生成结果的质量能差出一大截。我自己是拿了几十版提示词在真实项目里反复调出来的经验,这里把这套方法论拆开讲。
4.1 大前提:用角色设定锁住行为边界
生成测试用例的提示词,第一个组件是角色设定。但我不建议只写"你是一个测试专家"这种一句话角色,太泛了。我的角色设定会写成一段结构化的"岗位说明书",包含三个要素:职责边界、工作原则、红线要求。
职责边界要明确告诉模型它负责什么、不负责什么。比如"你负责基于业务需求和系统设计文档生成功能测试用例,不负责代码审查、不负责性能测试方案设计、不负责自动化脚本编写"。这能让模型在生成时不过度发挥。
工作原则要写清楚判断标准。比如"所有用例必须基于给定的业务规则,不得自行假设系统行为""优先级标注必须体现核心业务流程优先""预期结果必须包含可观察的系统反馈,不得使用'正常''正确'等抽象词汇"。
红线要求是明确禁止什么。比如"禁止生成与需求文档无关的测试场景""禁止为未定义的输入条件假设等价类"。实际测试下来,加了红线要求之后,用例里天马行空的内容明显减少,模型的注意力被有效约束在了给定知识的范围内。
4.2 上下文注入:不是把知识库内容全塞给模型
知识库召回的结果是一大堆片段,但直接把拼接好的片段全部塞进提示词,效果并不好。模型对超长上下文的注意力是衰减的,前面和后面的内容容易被忽略,只有中间偏前的位置效果最好。
所以我做了"二次筛选":在召回8-12个片段的基础上,用一个独立的小模型或者规则脚本做一步精简,把核心业务规则、关键字段枚举值、历史缺陷触发条件这三类信息优先保留,把"需求背景描述"这类辅助信息往后放,甚至如果字数紧张可以丢弃。
在提示词模板里,上下文区的组织方式也很有讲究。我用的模板结构分五个区域:第一是业务目标,一句话概括这个功能要干什么;第二是核心业务规则,编号排列,每条规则独立成行;第三是接口与数据定义,列出字段名和取值范围;第四是历史缺陷预警,列出易错点和对应的回归要求;第五是用例编写规范,列出格式要求和优先级定义。每个区域之间用明确的分隔标记,模型在生成时能清晰地知道哪段知识对应哪个用途。
4.3 输出约束:用格式模板锁死输出结构
要生成可解析、可校验、可导入平台的用例,输出格式必须是完全结构化的。这里我用了两层约束。
第一层是让模型输出JSON格式,而不是自然语言。JSON对象的字段固定为case_id、module、title、preconditions、test_data、steps、expected_result、priority。我实验过直接用Markdown表格让模型输出,模型经常会对不齐列或者漏掉字段,而JSON的错误率明显更低。
第二层是在提示词里直接贴一个"输出示例"。这个示例不是随便写的,而是我提前从真实项目里挑了一条高质量的用例,按目标平台的规范字段填好,作为few-shot样例放在提示词里。有了这条示例,模型对格式的理解从抽象描述变成具体参照,格式错误率能降低一半以上。
4.4 复杂场景的演进:从单次生成到多Agent协作
前面说的是单模型单次生成的情况。但当我处理大型系统的测试用例生成时,发现单次生成有一个天花板:一个功能模块涉及的业务规则太多,单个模型上下文放不下,而且一次生成15-20条用例已经是极限,再多的用例模型就开始重复或者乱写。
这时候需要把工作流升级成多Agent协作模式。我实际用Dify搭过多Agent的测试用例生成器,架构是:一个PM Agent负责把需求拆解成多个子模块场景,为每个子模块生成独立的"测试任务单";拆分完成后,多个测试Agent并行执行各自子模块的用例生成任务;最后汇总Agent把多个测试Agent的输出合并、去重、统一编号,再做一次完整性检查。
这个升级完的效果很直观:单个Agent一次生成的质量上限是20条左右,多Agent并行之后,一次需求可以生成100条以上用例,且各子模块之间的覆盖点不会混淆。代价是需要更细致的任务拆解提示词,以及汇总时的去重逻辑要写得足够严谨。如果你的系统复杂度还没到这个程度,建议先别上多Agent,单Agent加知识库的性价比已经很高。
5. 文件处理与格式壁垒:Word、PDF文档怎么变成结构化知识
前面讲知识库设计时,我提到了要把PRD和接口文档做预处理,但没展开讲怎么处理。实际做的时候,这块反而是团队卡得最久的环节。很多公司积累了大量的Word版PRD和PDF版接口文档,格式化解析这些文件是知识库建设的第一道门槛。
5.1 最常见的坑:直接在Dify界面里上传原始文档
很多新手用Dify做知识库,直接把Word、PDF拖进知识库就算是建好了。但这样做的效果非常差,原因在于:
第一,PDF的文本层问题。很多PDF是从WPS或在线文档导出的,有的有文本层可以直接提取,有的本质上是一张张图片,需要OCR识别,而OCR识别出来的内容质量参差不齐,尤其是表格数据,识别后经常乱掉。
第二,Word文档的制式问题。PRD里大量使用多级标题、项目符号、表格,Dify默认的文档解析器对这些格式的还原度不够,经常把表格拆散、把列表的层级关系弄丢。而测试用例生成恰恰最依赖表格里的字段定义和规则描述,表格数据一旦断裂,知识库就等于废了。
第三,文档质量噪声大。原始PRD里充满了修订痕迹、批注、封面页、目录页,这些噪声如果不处理,向量化之后会严重干扰检索的相关性。
5.2 推荐做法:解析-清洗-再入库
我的建议是不要直接用原始文档入库,而是在入库之前做一道"文档清洗"的工序。具体流程是:先用Python的python-docx和pdfplumber库把文档内容提取出来,提取时按标题层级拆分段落;然后写一个清洗脚本,去掉封面、目录、页眉页脚、修订记录,只保留正文内容;表格部分单独提取,转成Markdown表格格式,因为Markdown表格对Dify的解析器最友好,保留度最高;最后把清洗好的内容按章节拆分成多个独立的文本块,每个块控制在合理长度以内,再逐个入库。
如果你不想自己写代码,也可以借助现成的工具链。我试过用Dify自己的文件解析器配上预处理节点,但效果不如Python脚本清洗来得干净。如果你的团队有开发资源,强烈建议花半天时间写一套文档清洗脚本,后面所有文档入库都复用这套流程,一劳永逸。
5.3 纯流程图和架构图的处理
这是一个更大也更难的问题:PRD里经常包含大量的业务流程图、状态机图、架构图。这些图包含的信息密度极高,比如账号状态流转、审批流程分支、异常处理路径,都是生成测试用例最需要的信息,但视觉类信息无法直接进文本知识库。
我的方案是双轨制。第一条轨:如果公司有架构师或产品愿意把关键流程用文字补充出来,那是最好的,文字版流程描述进知识库。第二条轨:如果只能在原图上获取信息,就由负责搭建知识库的人人工看图,把关键流程转写成结构化的文字描述。比如一个含有"待审核-审核中-已通过-已驳回"状态流转的流程图,转写成"状态流转规则:待审核可流转到审核中;审核中可流转到已通过或已驳回;已驳回可重新提交回到待审核"这种文本格式。
这一步的人力成本没办法完全省掉,但一次投入,后续所有相关用例的生成都会受益。我在实际项目中,最花时间的反而是这些图的文本化转写,而不是建流水线本身。
6. 上下文管理与Token控制:别让一次生成烧掉整月预算
RAG知识库 + 大模型生成这件事,在实际落地中最容易翻车的不是生成质量,而是Token消耗。一次测试用例生成任务,召回10个知识片段、每个300字,再加上提示词和输出,一次调用可能消耗3000-5000个Token。但真正的问题不是单次消耗,而是不设上限的迭代。生成-校验-修正这个循环如果跑起来没完没了,一次任务能烧掉上万Token,一个月下来账单非常吓人。
Token管理这件事,我吃过不少亏,简单分享几条很实用的经验。
6.1 上下文的"瘦身原则"
大模型虽然支持很长的上下文窗口,但不是越长越好,越长越贵,而且越长注意力越分散。我的经验是算一笔账:每个知识片段平均300字,中文一个字约为1-1.5个Token,一个片段大概400-600Token。召回10个片段就是5000Token左右。如果加上业务目标、规则梳理、历史缺陷规范等内容,一次生成的输入Token很容易到8000以上。
要做的是瘦身。第一,知识片段入库时就控制长度,单条不超过500字,超长的要拆成多条。第二,召回数量默认8条,不要贪多,只有在需求特别复杂时才增加到12条。第三,对召回的片段做二级筛选,明显和当前需求不相关的片段直接丢弃,不要"宁可错杀不可放过"地全塞进去。第四,公共的提示词内容用变量模板维护,不要每次在对话里反复粘贴,这能减少重复Token消耗。
6.2 模型分层:贵的模型只做最需要它的环节
不是所有环节都需要用最强的模型。我在工作流里做了模型分层配置:知识召回后的"场景分析"环节用中等能力的模型就够,这个环节只需要理解业务和归纳场景,不需要特别强大的推理;而"用例展开"环节对推理质量和细节把握要求更高,用最强模型;最后的"规则校验"环节用中等模型即可,因为校验规则是固定的,属于模式匹配类任务。
这样分层之后,整个流水线的Token成本大约能降低40%,而生成质量几乎没有下降。你可以把每个环节的模型配置做成工作流的变量,后续根据每个环节的实际表现单独调模型,不用动整体流程。
6.3 缓存与重复利用:同一接口文档只处理一次
另一个容易被忽视的Token黑洞是重复处理同一份知识。比如某个接口定义了50个字段,每次生成这个接口的用例时都要把全部字段定义塞进上下文。解决办法是给每条知识设定"复用缓存":第一次使用时把提取好的关键信息做成摘要,后续再生成同模块用例时,直接用摘要来代替完整知识文本。摘要可以在入库时生成,而不是在调用时生成,这样能把一部分Token成本提前摊销掉。
7. 实测效果:从"参考价值尚可"到"可直接执行"的数据对比
前面的方法论讲得再多,最后还是要看效果。这里把我的实测数据放出来,大家先有个直观参考,再根据自己的项目情况做判断。
7.1 我搭建这套流水线时的测试环境
先说测试背景,方便你在类比时对齐量级。我用的是一个中型业务系统,包含用户管理、订单管理、支付流程、库存管理四个核心模块,接口数量约80个,历史缺陷库沉淀了半年约200条有效缺陷。知识库共录入约300个文本条目,覆盖业务需求、接口定义、历史缺陷、用例规范四个域。流水线用Dify搭建,模型配置为中等能力模型做场景分析、最强模型做用例展开、中等模型做校验。测试对象是一个包含约60条业务规则的"订单提交"功能。
人工基线是:一位中级测试工程师,用3天时间完成订单提交功能的功能测试用例,产出120条用例,最终在验收阶段发现的缺陷数作为质量锚点。
AI流水线在不做任何人为干预的情况下,一次运行生成143条用例,耗时约12分钟,Token总消耗约3.5万。之后我对生成的用例进行了完整评审,把"可直接入库执行"作为最高标准,统计结果如下表:
| 质量维度 | 人工基线(120条) | AI流水线(143条) |
|---|---|---|
| 可直接入库执行比例 | 100%(人工写的当然能执行) | 约82% |
| 需要修改后执行的用例 | 0条 | 约18条 |
| 明显无效/脱离业务的用例 | 0条 | 约7条 |
| 平均每条用例的覆盖信息完整度 | 高 | 较高 |
| 遗漏高风险点数量 | 4处(人工盲区) | 2处(AI盲区) |
7.2 关键结论:AI不是比你强,是和你互补
看完这组数据,我想说一个很多人不愿意承认的事实:AI流水线生成用例的直接质量,并不会显著超过一位有经验的测试工程师。人工写的120条用例质量非常扎实,AI生成的143条里有7条是明显无效的,纯粹是噪声。如果你拿AI生成的用例去和高级测试工程师比,期待它"更好",大概率会失望。
但真正有价值的点在这里:这143条用例,AI只花了12分钟。而人工3天只能写120条。也就是说,AI的优势不是质量,而是速度和规模化。更重要的是,AI生成的用例覆盖了我们团队人工评审时才发现遗漏的2处高风险点。人工写了120条,还是漏了4处关键场景,AI则用12分钟补上了其中2处。这就说明它的"发散性"在查漏补缺这个维度上,确实有独特价值。
另外还有一个很微妙的结论:AI流水线的价值并不主要体现在"生成"上,而在生成之后的评审环节。拿到AI生成的143条用例后,测试工程师不需要从零开始,只需要做筛选、修改、补充,这比从一张白纸开始写用例轻松太多。我算过一笔账,原来3天的工作量,用AI流水线之后压缩到1.5天,省下来的时间可以投入到更有价值的探索性测试中。
7.3 从"能用"到"好用"的关键突破点
从我自己从0到1搭这套流水线的过程来看,"能用"和"好用"之间隔着几个可以量化的关键突破点。
第一个突破点是知识库的质量。刚搭好的知识库只是简单把文档灌进去,生成的用例经常张冠李戴,比如把订单模块的规则套到库存模块里。把知识做了清洗、拆条、标注来源之后,这类错误明显减少。
第二个突破点是两段式生成。最开始我是让AI一次性输出所有用例,但生成结果重叠率很高。改成"先场景清单,后用例展开"之后,高价值的覆盖点更分散,每条用例之间的独立性更好了。
第三个突破点是把历史缺陷知识放进去。加入缺陷库之后,生成用例里开始出现"连续5次输错密码后账号锁定"这类真正能揪出Bug的场景。缺陷库的效果不只是"生成更多用例",而是让AI生成的用例更贴近真实世界的风险分布,不再是一张毫无重点的均匀撒网。
8. 搭建这套流水线的完整实操清单
如果到这里你也决定要搭这样一套流水线,下面这份实操清单可以让你少走很多弯路。每一层都有我在实际踩坑中总结的第一手经验,按顺序做完,你的流水线基本就能跑通。
8.1 第一步:定场景、定范围、定验收标准
在动手搭流水线之前,先别急着去找工具、写提示词,第一件事是明确范围。我的建议是:一开始不要贪大求全,挑一个规则清晰、边界明显、历史文档比较完整的功能模块作为试点,比如登录、注册、权限配置这类通用模块。把这些模块的PRD、接口文档、历史缺陷、用例规范四类资料先归拢起来,数量控制在一次人工能盘点完的范围。
同时定好验收标准:流水线生成用例后,达到什么标准才算成功?我当时的验收标准是三条:一,生成用例的格式可以直接导入用例管理平台;二,核心业务规则的覆盖率达到人工水平的80%以上;三,生成用例中可直接执行的比例不低于70%。这三个标准明确之后,后面每一步的调整都有了衡量基准。
8.2 第二步:整理知识源的归属关系
这个步骤比搭建任何工具都重要。把四类知识源分别归入四个文件夹,做好编号和版本管理。业务需求知识按功能模块命名,接口知识按接口名称命名,历史缺陷按模块和时间线组织,用例规范单独放。这个归属关系决定了后面知识库的检索质量。我当时犯过一个错误:把接口定义和业务需求混在同一个文档里入库,结果检索时接口知识污染了业务需求的召回,生成的用例在业务描述和参数定义之间出现了矛盾。分开存放之后,这个矛盾就消失了。
8.3 第三步:在Dify里搭建知识库应用
打开Dify,新建一个知识库应用,把前面整理好的四个知识域分别上传。上传时注意用前面讲的"解析-清洗-再入库"流程,不要直接拖原始文档。每一条知识建议加上元数据标签,至少包含所属模块、知识类型(业务规则/接口定义/历史缺陷/规范)、创建时间这三个字段。这些元数据在后期做检索过滤和结果溯源时会非常有用。
8.4 第四步:编排工作流
在Dify里新建工作流,按"输入需求-意图识别-知识召回-场景分析-用例生成-规则校验-格式转换-输出"的顺序把节点一个个串起来。这个阶段不用追求一次到位,先跑通最简单的链路,把输出接出来看看效果,再逐步往里加迭代修正、分支判断、异常处理。我的经验是:第一次搭工作流不要想着一步到位,先搭一个最简可用的版本,让QA同学用起来,再根据真实反馈迭代优化,会比关起门来调一个"完美"工作流高效得多。
8.5 第五步:把QA同学拉进来一起打磨
这是我最想强调的一点。技术团队很容易陷入一个误区:把流水线当成"AI项目"来做,搭好之后给QA用。但实际上,这个流水线最终的受益者和使用者都是QA团队,如果QA不深度参与,流水线做得再好也落不了地。QA最清楚什么样的用例是好用例,格式上有什么约定,优先级上的惯例是什么,导入平台时的字段映射是什么。这些隐性知识只有QA能提供。我最后能把这条流水线从demo推到稳定生产环境,靠的就是和QA同学连续两周每天过一批生成结果,一条条对比、修改、反馈、再调整。
9. 实测中遇到的意外情况和处理办法
真实跑流水线的时候,纸上设计的那些流程不会那么听话。我在内测阶段遇到过几个比较典型的问题,写出来供大家排雷。
9.1 知识库里的规则冲突:新规则和旧规则打架
这是最棘手的问题。比如旧PRD里规定"用户名长度不超过20个字符",新版本改成了"不超过30个字符",但知识库里旧规则还没清理,召回时新旧同时被检索出来,模型就懵了,有时候生成用例里一会儿用20一会儿用30。
后来我加了一个"规则时效"机制:入库的每一条规则都带上版本号和生效日期,在知识召回阶段,按生效日期做一次时间过滤,只保留当前日期之前最新版本的内容。同时,在知识清洗阶段就做一次规则冲突检测,一旦发现同一实体出现两个不同版本的定义,自动标记为冲突条目,在生成前交给人工裁决。加了这道工序后,类似的问题基本杜绝。
9.2 模型生成用例的"编造感"问题
大模型有一个致命的问题,就是它会一本正经地编造不存在的系统行为。比如接口定义里明明没有"验证码"字段,模型会在用例里写"输入正确的验证码",因为它在训练数据里见过登录功能通常都有验证码,就自动补上了这个假设。
解决这个问题没有银弹,只能靠两层防护。第一层,在提示词的红线要求里明确写上"所有用例中的输入字段必须严格来自知识库提供的接口定义和字段字典,不得自行补充不存在的字段或系统行为"。第二层,在规则校验阶段加一条专门的检测项,用正则或者其他规则去扫描用例中出现的字段名,凡是知识库字段字典里没有的字段一律标记为"疑似编造",退回重生成。两层防护叠加之后,编造字段的问题基本被压制了。
9.3 递归不收敛:生成-校验-再生成变成死循环
前面我说了生成-校验-再生成机制设了两轮上限,上限之后转入人工队列。这个上限设计是很有必要的,因为实际跑的时候真的会出现这种情况:校验节点发现了问题,把问题描述传回去重新生成,模型收到反馈后"用力过猛",把原本没问题的格式和内容也改乱了,然后校验再报新的问题,就这样反复横跳。
产生这个现象的主要原因是校验节点的反馈信息不够精准,只是说"有几处不符合规范",但没说清楚具体是哪几条、哪里不符合。后来我把校验节点的输出改成了结构化反馈:每条问题都用"用例编号-字段名-问题类型-修改建议"的形式输出,模型再生成时能明确知道改哪里。这个改进之后,第二轮修正通过率提高了不少,死循环的情况基本不再出现。
9.4 大模型输出JSON的稳定性:偶尔跑出非法JSON
虽然我在提示词中明确要求输出JSON,并且给了示例,但大模型偶尔还是会输出带注释的JSON、或者JSON前后有多余的说明文字。这个问题的处理方案是在工作流里加一个JSON解析节点,如果解析失败,立即触发一次"仅修复格式"的重试,不让这个异常直接报错中断整个流程。我还见过更狡猾的情况:模型输出的JSON是合法的,但字段名和预设的模板对不上,比如把preconditions写成了precondition,这种问题靠JSON解析检查不出来,需要在规则校验阶段加一步"字段名白名单比对",任何一个字段名不在白名单里就标记为非法。
10. 写在最后:这套流水线的边界,和它下一步还能怎么走
最后聊聊这套流水线解决不了的问题,以及我接下来打算往哪边扩展。
先说边界。这套流水线本质上是把"已知的规范、已知的规则、已知的缺陷"做了一个高效的复用和编排,它擅长的是把这些已知信息转化为覆盖面广、格式规范、可执行的用例。但"探索性测试"这件事它做不了——就是那种测试人员靠直觉在系统里乱点、突然发现一个没人想过的Bug的场景。AI生成用例永远是沿着知识库的轨迹走的,知识库里没有的东西,它发现不了。
另一个边界是需求理解存在"天花板"。当需求本身不清晰、充满歧义的时候,AI并不能像资深测试一样去追问产品经理,它会假设一个最合理的意思然后往下生成用例,结果可能跟产品真实意图完全相反。所以在需求模糊的场景下,我的建议是不要依赖AI生成用例,让测试工程师先把需求搞清楚,再交给流水线去做扩展。
接下来我打算做两件事。第一,把自动化测试脚本生成叠加到现有的工作流里。既然用例已经是结构化的JSON格式了,从JSON到Playwright或者Selenium脚本其实只差一层模板翻译。我在小范围测试过,效果很可观,可以让工作流直接从用例生成自动化的测试代码骨架,测试工程师只需要在关键断言上做人工确认。第二,把缺陷知识库和线上监控打通,让知识库不只是"人工录入的历史缺陷",而是能从线上故障中自动抓取、自动沉淀新的缺陷模式,这样知识库就是一个持续生长的活系统,而不是一次性灌进去的死数据。
这套流水线从搭到用,前后花了大概三周时间,期间踩了无数坑,也推翻过好几个自以为正确的设计。但最终的效果让我觉得非常值得——它不是让测试团队少写用例那么简单,而是让测试团队把精力从"重复性劳动"中解放出来,投入到真正需要人脑创造力的事情上。如果你也在考虑做类似的事情,我的建议是先从一个小模块、一个小工作流开始,跑通之后再横向扩展,这条路走起来要比一开始就想搭一个万能系统靠谱得多。