跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

利用 LangChain 与大模型自动化生成测试用例

探讨了利用 LangChain 与大语言模型自动化生成测试用例的方案。针对传统工具存在的响应慢、Token 限制等痛点,提出了结合向量数据库与记忆模块的自研方案。通过 PDF 解析、文本切割、Memory 管理及向量检索等技术手段,实现了测试用例的快速生成。实测显示在小型需求中提效约 50%,用例覆盖更全面。方案支持全文生成与局部聚焦两种模式,但也存在对复杂流程图理解不足等局限。后续计划优化图片解析并探索大模型在缺陷定位及自动化测试中的应用。

疯疯癫癫发布于 2025/2/6更新于 2026/7/2648 浏览
利用 LangChain 与大模型自动化生成测试用例

一、用例生成实践效果

在日常工作安排中,持续优化测试技术、提高测试效率始终是重点任务。近期,我们在探索实践使用大模型生成测试用例,期望能够借助其强大的自然语言处理能力,自动化地生成更全面和高质量的测试用例。

当前,公司已经普及使用 JoyCoder,我们可以拷贝相关需求及设计文档的信息给到 JoyCoder,让其生成测试用例,但在使用过程中有以下痛点:

  1. 仍需要多步人工操作:如复制粘贴文档,编写提示词,拷贝结果,保存用例等
  2. 响应时间久,结果不稳定:当需求或设计文档内容较大时,提示词太长或超出 token 限制

因此,我探索了基于 LangChain 与公司现有平台使测试用例可以自动、快速、稳定生成的方法,效果如下:

用例生成效果对比使用 JoyCoder基于 LangChain 自研
生成时长(针对项目–文档内容较多)10~20 分钟左右,需要多次人工操作(先会有一个提示:根据您提供的需求文档,下面是一个 Markdown 格式的测试用例示例。由于文档内容比较多,我将提供一个概括性的测试用例模板,您可以根据实际需求进一步细化每个步骤。);内容太多时,报错:The maximum default token limit has been reached、UNKNOWN ERROR:Request timed out. This may be due to the server being overloaded,需要人工尝试输入多少内容合适5 分钟左右自动生成(通过摘要生成全部测试点后,再通过向量搜索的方式生成需要细化的用例);内容太多时,可根据 token 文本切割后再提供给大模型
生成时长(针对普通小需求)差别不大,1~5 分钟差别不大
准确度依赖提示词内容,差别不大,但自研时更方便给优化好的提示词固化下来更优

LangChain 是一个开源框架,用于构建基于大型语言模型(LLM)的应用程序。LLM 是基于大量数据预先训练的大型深度学习模型,可以生成对用户查询的响应。LangChain 提供各种工具和抽象,以提高模型生成的信息的定制性、准确性和相关性。例如,开发人员可以使用 LangChain 组件来构建新的提示链或自定义现有模板。LangChain 还包括一些组件,可让 LLM 无需重新训练即可访问新的数据集。

二、细节介绍

1. 基于 Langchain 的测试用例生成方案

方案优点缺点适用场景
方案 1:将全部产品需求和研发设计文档给到大模型,自动生成用例用例内容相对准确不支持特大文档,容易超出 token 限制普通规模的需求及设计
方案 2:将全部产品需求和研发设计文档进行摘要后,将摘要信息给到大模型,自动生成用例进行摘要后无需担心 token 问题用例内容不准确,大部分都只能是概况性的点特大规模的需求及设计
方案 3:将全部产品需求和研发设计文档存入向量数据库,通过搜索相似内容,自动生成某一部分的测试用例用例内容更聚焦,无需担心 token 问题不是全面的用例仅对需求及设计中的某一部分进行用例生成

因 3 种方案使用场景不同,优缺点也可互补,故当前我将 3 种方式都实现了,提供大家按需调用。

2. 实现细节

2.1 整体流程

(此处展示整体流程图)

2.2 技术细节说明
  • PDF 内容解析:LangChain 支持多种文件格式的解析,如 csv、json、html、pdf 等,而 pdf 又有很多不同的库可以使用,本次选择 PyMuPDF,它以功能全面且处理速度快为优势。
  • 文件切割处理:为了防止一次传入内容过多,容易导致大模型响应时间久或超出 token 限制,利用 LangChain 的文本切割器,将文件分为各个小文本的列表形式。
  • Memory 的使用:大多数 LLM 模型都有一个会话接口,当我们使用接口调用大模型能力时,每一次的调用都是新的一次会话。如果我们想和大模型进行多轮的对话,而不必每次重复之前的上下文时,就需要一个 Memory 来记忆我们之前的对话内容。Memory 就是这样的一个模块,来帮助开发者可以快速的构建自己的应用'记忆'。本次使用 LangChain 的 ConversationBufferMemory 与 ConversationSummaryBufferMemory 来实现,将需求文档和设计文档内容直接存入 Memory,可减少与大模型问答的次数(减少大模型网关调用次数),提高整体用例文件生成的速度。Conversation Summary Buffer Memory 主要是用在提取'摘要'信息的部分,它可以将需求文档和设计文档内容进行归纳性总结后,再传给大模型。
  • 2.3 代码框架及部分代码展示

    代码框架:

    (此处展示代码框架图)

    代码示例:

    def case_gen(prd_file_path, tdd_file_path, input_prompt, case_name):
        """
        用例生成的方法
        参数:
        prd_file_path - prd 文档路径
        tdd_file_path - 技术设计文档路径
        case_name - 待生成的测试用例名称
        """
        # 解析需求、设计相关文档,输出的是 document 列表
        prd_file = PDFParse(prd_file_path).load_pymupdf_split()
        tdd_file = PDFParse(tdd_file_path).load_pymupdf_split()
        empty_case = FilePath.read_file(FilePath.empty_case)
    
        # 将需求、设计相关文档设置给 memory 作为 llm 的记忆信息
        prompt = ChatPromptTemplate.from_messages(
            [
                SystemMessage(
                    content="You are a chatbot having a conversation with a human."
                ),  # The persistent system prompt
                MessagesPlaceholder(
                    variable_name="chat_history"
                ),  # Where the memory will be stored.
                HumanMessagePromptTemplate.from_template(
                    "{human_input}"
                ),  # Where the human input will injected
            ]
        )
        memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
        for prd in prd_file:
            memory.save_context({"input": prd.page_content}, {"output": "这是一段需求文档,后续输出测试用例需要"})
        for tdd in tdd_file:
            memory.save_context({"input": tdd.page_content}, {"output": "这是一段技术设计文档,后续输出测试用例需要"})
    
        # 调大模型生成测试用例
        llm = LLMFactory.get_openai_factory().get_chat_llm()
        human_input = "作为软件测试开发专家,请根据以上的产品需求及技术设计信息," + input_prompt + ",以 markdown 格式输出测试用例,用例模版是" + empty_case
        chain = LLMChain(
            llm=llm,
            prompt=prompt,
            verbose=True,
            memory=memory,
        )
        output_raw = chain.invoke({'human_input': human_input})
    
        # 保存输出的用例内容,markdown 格式
        file_path = FilePath.out_file + case_name + ".md"
        with open(file_path, 'w') as file:
            file.write(output_raw.get('text'))
    
    def case_gen_by_vector(prd_file_path, tdd_file_path, input_prompt, table_name, case_name):
        """
        !!!当文本超级大时,防止 token 不够,通过向量数据库,搜出某一部分的内容,生成局部的测试用例,细节更准确一些!!!
        参数:
        prd_file_path - prd 文档路径
        tdd_file_path - 技术设计文档路径
        table_name - 向量数据库的表名,分业务存储,一般使用业务英文唯一标识的简称
        case_name - 待生成的测试用例名称
        """
        # 解析需求、设计相关文档,输出的是 document 列表
        prd_file = PDFParse(prd_file_path).load_pymupdf_split()
        tdd_file = PDFParse(tdd_file_path).load_pymupdf_split()
        empty_case = FilePath.read_file(FilePath.empty_case)
        # 把文档存入向量数据库
        docs = prd_file + tdd_file
        embedding_model = LLMFactory.get_openai_factory().get_embedding()
        router_url = ConfigParse(FilePath.config_file_path).get_vearch_router_server()
        vearch_cluster = Vearch.from_documents(
            docs,
            embedding_model,
            path_or_url=router_url,
            db_name="y_test_qa",
            table_name=table_name,
            flag=1,
        )
        # 从向量数据库搜索相关内容
        docs = vearch_cluster.similarity_search(query=input_prompt, k=1)
        content = docs[0].page_content
    
        # 使用向量查询的相关信息给大模型生成用例
        prompt_template = "作为软件测试开发专家,请根据产品需求技术设计中{input_prompt}的相关信息:{content},以 markdown 格式输出测试用例,用例模版是:{empty_case}"
        prompt = PromptTemplate(
            input_variables=["input_prompt", "content", "empty_case"],
            template=prompt_template
        )
        llm = LLMFactory.get_openai_factory().get_chat_llm()
        chain = LLMChain(
            llm=llm,
            prompt=prompt,
            verbose=True
        )
        output_raw = chain.invoke(
            {'input_prompt': input_prompt, 'content': content, 'empty_case': empty_case})
        # 保存输出的用例内容,markdown 格式
        file_path = FilePath.out_file + case_name + ".md"
        with open(file_path, 'w') as file:
            file.write(output_raw.get('text'))
    

    三、效果展示

    3.1 实际运用到需求/项目的效果

    用例生成后是否真的能帮助我们节省用例设计的时间,是大家重点关注的,因此我随机在一个小型需求中进行了实验,此需求的 PRD 文档总字数 2363,设计文档总字数 158(因大部分是流程图),实际用例设计环节提效可达到 50%。

    本次利用大模型自动生成用例的优缺点:

    优势:

    • 全面快速的进行了用例的逻辑点划分,协助测试分析理解需求及设计
    • 降低编写测试用例的时间,人工只需要进行内容确认和细节调整
    • 用例内容更加全面丰富,在用例评审时,待补充的点变少了,且可以有效防止漏测
    • 如测试人员仅负责一部分功能的测试,也可通过向量数据库搜索的形式,聚焦部分功能的生成

    劣势:

    • 对复杂流程图不能很好的理解,当文本描述较少时,生成内容有偏差
    • 对于有丰富经验的测试人员,自动生成用例的思路可能与自己习惯的思路不一致,需要自己再调整或适应

    四、待解决问题及后续计划

    1. 对于 pdf 中的流程图(图片形式),实现了文字提取识别(langchain pdf 相关的方法支持了 ocr 识别),后续需要找到更适合解决图内容的解析、检索的方式。
    2. 生成用例只是测试提效的一小部分,后续需要尝试将大模型应用与日常测试过程,目前的想法有针对 diff 代码和服务器日志的分析来自动定位缺陷、基于模型驱动测试结合知识图谱实现的自动化测试等方向。

    目录

    1. 一、用例生成实践效果
    2. 二、细节介绍
    3. 1. 基于 Langchain 的测试用例生成方案
    4. 2. 实现细节
    5. 2.1 整体流程
    6. 2.2 技术细节说明
    7. 2.3 代码框架及部分代码展示
    8. 三、效果展示
    9. 3.1 实际运用到需求/项目的效果
    10. 四、待解决问题及后续计划
    • 免费图片AI生成工具免费生成了解详情
    • Magick API 一键接入全球大模型注册送1000万token查看
    • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
    • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
    • 100+免费在线小游戏爽一把
    极客日志微信公众号二维码

    微信扫一扫,关注极客日志

    微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

    更多推荐文章

    查看全部
    • Stable Diffusion WebUI Windows 部署与常见报错解决方案
    • 地瓜机器人 RDK 系列选型指南:X3 vs X5 vs S100 vs S100P
    • Java 调用国内主流 AI 大语言模型实战指南
    • RAG 落地场景中的关键优化技巧与实战经验
    • 飞算 JavaAI 专业版实测:全栈代码生成与开发效率提升
    • GitHub Copilot Pro 学生免费认证与 VS Code 配置指南
    • AI Agent 开发工程师的技能树与学习路线
    • 解决 n8n Docker 启动时 secure cookie 报错问题
    • 2024年蓝桥杯 C/C++ 大学 B 组省赛题目解析
    • 微分的本质:从变化率到线性映射的 Python 可视化教程
    • AIRI:基于 AI 大模型构建桌宠虚拟伴侣
    • OpenGlass:低成本开源智能眼镜方案,支持语音与 AR 叠加
    • CapCutAPI:开源剪映编程控制与视频编辑方案
    • 2023 年高考大专就业前景较好的专业推荐
    • 解决 VSCode 远程模式下 Copilot Chat 图标不显示问题
    • Android 架构师职业发展路径与技术体系构建
    • 使用 frontend-design Skill 提升大模型前端设计审美
    • VS Code + WSL 下 GitHub 访问不稳定及 Copilot 卡 Thinking 的解决方案
    • ComfyUI Mixlab 插件 Whisper.available False 报错修复
    • Gitee+PicGo 搭建 Markdown 笔记图床指南

    相关免费在线工具

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • RSA密钥对生成器

      生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

    • Mermaid 预览与可视化编辑

      基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

    • 随机西班牙地址生成器

      随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

    • curl 转代码

      解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online