Dify 高级实验(09):测试用例生成——如何让 AI 自动产出测试用例?
Dify 高级实验09测试用例生成——如何让 AI 自动产出测试用例Dify 实验系列 · 高级 09/10 | 实验编号DIFY-103-091. 实验目的掌握「Agent 编排 结构化输出」的生成式工作流范式让 LLM 扮演 QA 工程师从一段功能描述自动产出可直接执行的测试用例CSV 格式。核心是三层结构化输出链路测试点列表LLM 输出 JSON 数组类型/描述/优先级代码节点解析兜底逐条用例迭代节点对每个测试点生成完整用例 JSON前置条件/步骤/预期结果CSV 交付代码节点csv.writer汇总LLM 最终格式化出统计摘要 完整 CSV。适合QA / 测试开发 / 需要把「写用例」自动化的团队。前置要求中级实验 09 代码节点、14 知识库检索、16 迭代节点。2. 场景设计输入feature_desc功能描述paragraphmodule_name模块名称text-input输出一份含统计摘要与完整 CSV 的测试用例文档可直接复制进 Excel。输入「用户注册功能输入手机号验证码注册」→ 自动产出 10-15 条用例正常/边界/异常全覆盖P0-P3 分级——QA 半天的手工工作量压缩到几分钟。3. 节点拓扑开始feature_desc module_name → 知识库检索测试用例模板top_k3 → LLM 生成测试点JSON 数组类型/描述/优先级 → Code 解析测试点json.loads 截断 25 条 注入 module → 迭代节点逐条生成详细用例 └→ 迭代内 LLM 生成单条用例JSON前置条件/步骤/预期 → Code 汇总 CSVcsv.writer → LLM 格式化输出统计摘要 完整 CSV→ 结束4. 关键配置4.1 开始节点-label:功能描述required:truetype:paragraphvariable:feature_desc-label:模块名称required:truetype:text-inputvariable:module_name4.2 生成测试点lm_points数量约束 「只输出 JSON」 结构示例——让输出可被下游代码节点稳定解析你是一个 QA 工程师。根据功能描述生成测试点列表。 功能描述{{#start.feature_desc#}} 模块{{#start.module_name#}} 参考模板{{#kb_templates.result#}} 要求 1. 覆盖功能测试、边界测试、异常测试 2. 每个测试点包含类型(功能/边界/异常)、描述、优先级(P0-P3) 3. P0 是核心功能必须覆盖P3 是边缘场景 4. 测试点数量控制在 10-15 个 5. 输出 JSON 数组格式只输出 JSON不要输出其他任何内容 输出格式[{type: 功能, description: 正常登录, priority: P0}, ...]注意该节点必须reasoning_format: separated——思考过程一旦混入text下方 cd_parse 的json.loads直接失败流程卡在步骤 0。4.3 解析测试点cd_parse两个关键设计① 迭代数组上限 30points[:25]截断留余量② 把 module 注入每个 item——迭代内 LLM 只引用 item不引用外层节点自包含模式依赖只进不出defmain(llm_text:str,module_name:str)-dict:importjson,re text(llm_textor).strip()points[]mre.search(r\[.*\],text,re.DOTALL)ifm:try:parsedjson.loads(m.group(0))ifisinstance(parsed,list):pointsparsedexceptException:points[]pointspoints[:25]# 迭代数组上限 30截断留余量items[]forpinpoints:ifnotisinstance(p,dict):continueitems.append({type:str(p.get(type,功能)),description:str(p.get(description,)),priority:str(p.get(priority,P2)),module:str(module_nameor未指定模块)})return{test_points:items,count:len(items)}4.4 迭代内生成单条用例lm_case迭代容器输入[cd_parse, test_points]输出收集[lm_case, text]string 是迭代 output_selector 可见类型。内部 prompt 全部从 item 取字段同样reasoning_format: separated根据测试点生成完整的测试用例。 模块{{#iter_cases.item.module#}} 测试点{{#iter_cases.item.description#}} 类型{{#iter_cases.item.type#}} 优先级{{#iter_cases.item.priority#}} 输出 JSON只输出 JSON不要输出其他任何内容 {module: 模块名, test_point: 测试点描述, type: 功能/边界/异常, priority: P0-P3, precondition: 前置条件, steps: [步骤1, 步骤2], expected: 预期结果} 要求前置条件具体、步骤可执行、预期结果可验证。4.5 汇总 CSVcd_summary迭代输出收集到的是array[string]每条可能是字符串——先json.loads还原再写 CSVdefmain(all_cases:list)-dict:importcsv,io,json cases[]forcinall_casesor[]:ifisinstance(c,str):try:cjson.loads(c)exceptException:c{}ifisinstance(c,dict):cases.append(c)outputio.StringIO()writercsv.writer(output)writer.writerow([模块,测试点,类型,优先级,前置条件,步骤,预期结果])forcaseincases:stepscase.get(steps,[])or[]ifnotisinstance(steps,list):steps[str(steps)]writer.writerow([case.get(module,),case.get(test_point,),case.get(type,),case.get(priority,),case.get(precondition,),; .join(str(s)forsinsteps),case.get(expected,)])return{csv_output:output.getvalue(),case_count:len(cases)}4.6 格式化输出lm_formatmax_tokens: 8000 明确「只输出正文」——长交付物场景的标配双保险你是 QA 测试用例交付专员。基于以下 CSV 内容生成一份可直接交付的测试用例文档。 共生成 {{#cd_summary.case_count#}} 条测试用例CSV 内容如下 {{#cd_summary.csv_output#}} 请输出1. 测试用例统计摘要总数、功能/边界/异常分布2. 完整 CSV 内容保持原样方便复制导入 Excel。 只输出最终报告正文不要输出任何解释性文字、思考过程或 Markdown 代码块标记。5. 运行验证输入feature_desc预期实测用户注册功能输入手机号验证码注册10-15 条用例覆盖功能/边界/异常输出统计摘要 CSV与预期一致购物车结算功能支持优惠券15-20 条用例优先级 P0-P3 分级与预期一致空功能描述 / 超长描述不崩溃输出空用例文档或少量兜底用例与预期一致cd_parse 空数组兜底6. 采坑点坑现象修复迭代链路 LLM 思考污染lm_points 未开推理标签分离时text混入think思考cd_parse 的json.loads解析失败流程卡在步骤 0lm_points / lm_case 显式reasoning_format: separatedDeepSeek 推理模型默认 tagged必须显式写迭代输入数组超过 30 个元素运行报length of var item must be less than 30 elements双保险prompt 限「10-15 个」 cd_parsepoints[:25]截断留余量dify103_09 P3 实测迭代内 LLM 引用外层节点字段上下文依赖外传、字段取不到调试困难自包含模式进入迭代前把 module 等上下文注入每个 item迭代内只引用{{#iter_cases.item.xxx#}}迭代输出每条是字符串直接当 dict 用报错迭代 output_selector 只能收集 string对 str 调case.get(module)抛 AttributeErrorcd_summary 先isinstance(c, str)再json.loads还原长交付文档 text 为空思考与输出共享 max_tokens默认 2000被挤空或内容写进思考部分lm_formatmax_tokens: 8000 prompt「只输出最终报告正文」dify103_09 实测只加 prompt 约束即恢复7. 实验文档及源码获取实验文档完整操作步骤DIFY-103-09测试用例生成器.md源码可直接导入知识库已预填 dataset_iddify103_09_测试用例生成器.yml文章聚焦核心配置与采坑点实验的完整分步操作知识库种子准备/节点搭建/参数表见实验文档原文。下一篇Dify 高级实验10综合实战——如何从零搭建一个企业级智能客服平台 你在这个实验的场景里踩过什么坑欢迎评论区分享你的实战经验。

相关新闻

Android Studio模拟器配置全攻略:从原理到实战,解决启动卡顿与AVD报错

Android Studio模拟器配置全攻略:从原理到实战,解决启动卡顿与AVD报错

1. 项目概述:为什么需要一个“听话”的模拟器?如果你刚开始接触安卓开发,或者正在为一个新项目搭建环境,那么“配置Android Studio安卓模拟器”这件事,大概率是你遇到的第一个,也是最让人头疼的坎儿。你可能…

2026/10/25 10:14:50 阅读更多 →
LSM模型原理与Python实现:可转债定价与套利策略实战

LSM模型原理与Python实现:可转债定价与套利策略实战

这次我们来看一个在量化金融领域备受关注的模型——LSM模型,及其在可转债套利策略中的应用。这不是一个需要本地部署的AI生成模型,而是一个经典的金融工程模型,用于解决美式期权的定价难题,并衍生出在可转债这一复杂衍生品上的套利…

2026/10/24 5:45:17 阅读更多 →
SpringBoot3+Vue3+MySQL 宿舍报修缴费系统源码前后端分离实战

SpringBoot3+Vue3+MySQL 宿舍报修缴费系统源码前后端分离实战

一、项目简介 本系统是一套面向高校或企业宿舍场景的报修与水电缴费一体化管理平台,采用前后端分离架构,后端基于 SpringBoot 3.x 提供 RESTful API,前端基于 Vue 3 构建单页应用。系统内置 JWT 身份认证与 RBAC 权限控制,覆盖学生…

2026/10/25 14:40:42 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/25 11:19:54 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/24 17:47:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/24 18:34:36 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/25 10:02:42 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/25 3:12:30 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/24 21:09:59 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 10:02:43 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 7:47:32 阅读更多 →