系列07-如何用 AI 从 PRD 批量生成功能测试用例?Vision 读图与章节分批实战

发布时间:2026/6/30 2:34:22
系列07-如何用 AI 从 PRD 批量生成功能测试用例?Vision 读图与章节分批实战 系列07-如何用 AI 从 PRD 批量生成功能测试用例Vision 读图与章节分批实战一份 40 页的 PRD测试负责人往往要23 天拆功能点、写步骤预期还要对齐禅道「产品 / 模块 / 研发需求 / 适用阶段」。直接丢给 AI大模型常见问题不是「写不出来」而是写不稳第 15 页流程图里的校验规则根本没进用例禅道product被 AI 编造成不存在的模块路径同一项目里三个人用 AI 写标题格式各一套工程化做法不是「更大的 Prompt」而是解析 → 范围裁剪 → 双模型 → 结构化入库 → 平台注入元数据。本文基于BrickCore需求测试中心routers/ai/requirements.pytest_analysis.py讲完整链路设计思路可脱离具体平台复用。演示与源码地址功能演示http://43.142.83.156/showcase/ 「AI 需求 → 功能用例」含录屏平台 admin / BrickCore123456开源仓库https://gitee.com/BanZhuanKeOrz/BrickCore线上菜单AI 测试 → 需求测试中心。建议先看演示录屏再按第九节实操。一、AI大模型 单对话 vs 平台流水线维度单对话粘贴 PRD平台流水线上下文长度易超 Token只能手工砍章节scope_section_ids按章裁剪内嵌图片需截图逐张贴Vision读 PDF/Word 嵌入图禅道字段LLM 编造 product/module平台绑定注入不进 Prompt标题规范每次格式漂移Jinja2 模板 语义槽位可追溯聊天记录需求版本、批次、source_ref大文档一次失败重来异步 Job分批 进度轮询质量约束靠人盯Promptgrounding 禁止空洞表述二、四层架构从上传到导出┌─────────────────────────────────────────────────────────┐ │ 1. ingest 上传 PRD → MinIO 原文件 解析 document_structure │ │ 2. scope 章节树 → 勾选范围 → estimate_scope(ok/warn/block) │ │ 3. generate Vision 读图 → 正文[图-N] 交错 → 文本 LLM → JSON │ │ 4. publish Jinja2 标题 禅道绑定 → 表格编辑 → 导出 XLSX │ └─────────────────────────────────────────────────────────┘设计原则LLM 只负责语义内容步骤、预期、模块槽位元数据与格式由平台配置避免幻觉污染导入。三、文档解析章节树与原文保真上传 PDF / Word / TXT / Markdown 后解析器产出parsed_content字段含义sections章节树id、title、level、block_ids、image_indicesblocks正文块与章节关联image_count内嵌图数量原文件进MinIOai-requirementsbucket结构存 DB支持reparse-document换解析规则后重切章节不丢原文件。实操建议生成前打开章节树确认「一级模块 / 二级功能」与 PRD 目录一致错乱时优先换Word/MD或重解析不要硬生成。四、双模型Vision 读图 文本 LLM 写用例4.1 为什么必须双模型模型职责不做Visionqwen-vl 等读流程图、原型、表格截图 → 结构化文字摘要不直接输出完整用例表文本 LLMDeepSeek 等读「章节正文 [图-N] 摘要」→ JSON 用例数组不读二进制图纯文本模型对 PDF 内图片无能为力若范围含图却未配 VisionBackend 直接400避免 silent 漏规则# test_analysis.py — _build_scoped_contentifimage_count0andnotvision_config_id:raiseHTTPException(status_code400,detailf选中范围包含{image_count}张图片请选择 Vision 模型配置,)4.2 正文与读图如何合并Vision 逐张分析后build_interleaved_content把正文块与[图-N]读图 JSON按章节顺序交错拼进 Prompt。文本 LLM 看到的是「可引用的图内控件名、提示文案、布局」而不是附件。4.3 源码视角scope 裁剪selected_sectionsresolve_sections(all_sections,scope_section_ids)scoped_contentbuild_interleaved_content(blocks,selected_sections,vision_text_by_index)scoped_content,_truncate_scope_text(scoped_content)# 上限约 48000 字scope_estestimate_scope(scoped_content,image_count)ifscope_est[level]block:raiseHTTPException(status_code400,detailscope_est[message]请减少勾选的章节后重试)产品含义用户勾选 12 章试跑 只把选中段落送进 LLMToken 可控。五、Token 预估ok / warn / blockestimate_scopecore/requirement_document.py粗算输入 Tokenest_tokensint(chars/1.6)image_count*600# warn ≥ 12_000 tokens → level warn# block ≥ 28_000 tokens → level block禁止同步生成level含义建议ok可一次生成直接点生成warn章节偏多缩小范围或降低目标条数block接近上限减少勾选章节或走异步分批 Job大批量时创建AiRequirementGenerateJob前端轮询status/progress任务可取消比 AI大模型 粘贴「整份 Word 超时重来」可运维得多。六、Prompt 工程LLM 输出什么场景模板requirement_doc_to_casescore/ai_prompts.py对输出做了硬约束核心包括6.1 语义槽位LLM 输出禁止直接拼标题{main_module:订单,sub_module:创建,feature_point:提交订单,case_description:正常提交成功,precondition:环境测试站可访问\n角色已登录\n数据购物车已有商品,steps:[{step:点击\提交订单\按钮,expect:Toast 显示\下单成功\}],priority:2,test_design:正向流程,type:功能测试}Prompt 明确要求禁止输出title字段禁止自行拼接【#...】完整标题禁止空洞表述「执行操作」「符合预期」「功能正常」steps须一步一expect交互流程通常 24 步只读展示可 1 步grounding文件大小、配额、错误提示等必须与 PRD 一致未写明则标「需求待确认」含[图-N]时至少约30%用例应引用图内的ui_elements / exact_messages6.2 测试设计维度配比写入 test_design不是 typetest_design建议占比正向流程35%45%异常/反向30%40%边界值15%25%接口校验范围内出现 API 描述时type走禅道「用例类型」枚举功能测试、接口测试等与 test_design分离避免把「正向/异常」写进 type 字段。七、标题 Jinja2 禅道字段平台注入7.1 标题组装入库前项目级模板core/case_naming.py默认示例【#{{ story_no }}_{{ main_module }}_{{ sub_module }}】{{ feature_point }}{{ case_description }}LLM 只填槽位 →Jinja2Template.render(**slots)→_clean_rendered_title。换项目规范只改模板不重训模型。7.2 禅道字段不进 Prompt字段来源product项目「禅道绑定」module路径项目绑定 需求级export_defaults覆盖related_story绑定配置stage按 priority 映射冒烟/系统阶段resolve_stage# zentao_bindings.py — merge_bindings# 需求级非空字段覆盖项目级forkeyin(product,module,related_story,...):ifreq.get(key):merged[key]req[key]LLM 只写步骤、预期、前置条件导出 XLSX 时apply_bindings_to_case_fields写入禅道列导入失败率显著下降。八、全量生成 vs 补充生成模式参数行为全量/替换replace_existingtrue清空旧草稿再生成慎用默认追加replace_existingfalse新批次追加不删旧用例补充生成supplement_batch_name带已有用例摘要进 Prompt去重专补缺口章节补充生成时 Prompt 会带上同批次已有用例摘要减少feature_point 重复仍须人工删明显幻觉行。批次名batch_name写入source_refbatch:名称便于按章节筛选「哪次生成」的用例。九、实操步骤10 步 审查清单9.1 操作步骤AI 测试 → 需求测试中心新建需求上传 PRDPDF / Word / TXT / Markdown等待解析检查章节树与目录是否一致项目配置禅道绑定、用例标题模板可先预览一条勾选本次scope 章节大文档先 12 章 estimate-scope看 ok/warn场景绑定Vision有图必填requirement_case文本模型设置目标条数通常 1020/批点击生成表格审查步骤是否有具体对象动作预期是否可判定未覆盖章节 →补充生成勿一次 block 硬跑全文导出禅道 XLSX→ 禅道导入验证9.2 人工审查清单导出前必过检查项不合格示例前置条件三段式只有「已登录」无环境/数据每步有 expectstep 写 3 步expect 只有一句数值与 PRD 一致编造「最多 999 条」但 PRD 写 100图内规则已覆盖流程图有「超限提示」但无用例标题无重复 feature_point同批 5 条「正常提交成功」优先级合理全 P1 或全 P4原则AI 出80% 草稿测试负责人对业务规则与边界做最终签字。十、常见失败排错现象原因处理生成按钮灰 / blockscope Token ≥ 28k 预估减章节异步分批 Jobwarn 仍要跑12k28k降count或再缩 scope400 请选择 Vision范围内有图未选 Vision 配置平台配置 → 场景绑定章节树空/乱PDF 解析差换 Word/MDreparse-document禅道导入字段错未配绑定项目 需求级 export_defaults标题重复/不规范模板未配或 LLM 槽位撞车改 Jinja2补充生成带去重步骤空洞模型弱或 scope 太短换更强文本模型加extra_instructions图内规则仍漏Vision 弱或图模糊换 Vision关键图手工补 23 条十一、给测开 / 后端落地要点要点说明原文件与结构分离MinIO 存 PRDDB 存document_structureJSONscope 是一等公民所有生成 API 带scope_section_ids双模型边界清晰Vision 只产文字描述文本 LLM 不读二进制元数据不进 Prompt禅道 product/module/story 绑定注入标题与内容解耦Jinja2 槽位Prompt 禁止 output title任务化AiRequirementGenerateJob支持取消、进度、分批权限隔离需求按 project_id避免跨项目 PRD 泄露十二、小结Vision 文本双模型解决 PRD图文混排漏读。章节 scope estimate_scope控制 Tokenblock 时分批 Job而非硬塞。Prompt grounding约束步骤/预期质量平台管标题与禅道字段。补充生成补缺口全量替换慎用。导出前走审查清单AI 是辅助业务准确性人把关。附录 A源码文件索引顺序文件关注点1routers/ai/requirements.py上传、generate-cases、导出、Job2routers/ai/test_analysis.py_build_scoped_content、测试点/方案3core/requirement_document.pyestimate_scope、章节解析4core/ai_prompts.pyrequirement_doc_to_cases模板5core/case_naming.pyJinja2 标题、render_case_title6core/zentao_bindings.py绑定合并、resolve_stage7core/zentao_case_export.py禅道 XLSX 导出支持与交流演示http://43.142.83.156/showcase/ · 源码https://gitee.com/BanZhuanKeOrz/BrickCore觉得有用欢迎Star⭐问题评论区留言或 Gitee Issues