大模型应用之基于Langchain的测试用例生成

一 用例生成实践效果

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

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

1)仍需要多步人工操作:如复制粘贴文档,编写提示词,拷贝结果,保存用例等

2)响应时间久,结果不稳定:当需求或设计文档内容较大时,提示词太长或超出token限制

因此,我探索了基于Langchain与公司的提供的网关接口使测试用例可以自动、快速、稳定生成的方法,效果如下:

用例生成效果对比使用JoyCoder(GPT4)基于Langchain自研(GPT4)
生成时长 (针对项目--文档内容较多)·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,可减少与大模型问答的次数(减少大模型网关调用次数),提高整体用例文件生成的速度。ConversationSummaryBufferMemory主要是用在提取“摘要”信息的部分,它可以将将需求文档和设计文档内容进行归纳性总结后,再传给大模型



向量数据库:利用公司已有的向量数据库测试环境Vearch,将文件存入。 在创建数据表时,需要了解向量数据库的检索模型及其对应的参数,目前支持六种类型,IVFPQ,HNSW,GPU,IVFFLAT,BINARYIVF,FLAT(详细区别和参数可点此链接),目前我选择了较为基础的IVFFLAT--基于量化的索引,后续如果数据量太大或者需要处理图数据时再优化。另外Langchain也有很方便的vearch存储和查询的方法可以使用



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(因大部分是流程图),结果如下:

用例设计环节,测试时间(人日)占用效果分析可自动生成用例之前可自动生成用例之后
分析需求&理解技术设计0.50.25
与产研确认细节0.250.25
设计及编写用例1(39例)0.5(45例=25例自动生成+20例人工修正/补充)
评审及用例差缺补漏0.50.25
总计(效率提升50%2.5人日1.25人日

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

优势:

•全面快速的进行了用例的逻辑点划分,协助测试分析理解需求及设计

•降低编写测试用例的时间,人工只需要进行内容确认和细节调整

•用例内容更加全面丰富,在用例评审时,待补充的点变少了,且可以有效防止漏测

•如测试人员仅负责一部分功能的测试,也可通过向量数据库搜索的形式,聚焦部分功能的生成

劣势:

•暂时没实现对流程图的理解,当文本描述较少时,生成内容有偏差

•对于有丰富经验的测试人员,自动生成用例的思路可能与自己习惯的思路不一致,需要自己再调整或适应



四 待解决问题及后续计划

1.对于pdf中的流程图(图片形式),实现了文字提取识别(langchain pdf相关的方法支持了ocr识别),后续需要找到更适合解决图内容的解析、检索的方式。

2.生成用例只是测试提效的一小部分,后续需要尝试将大模型应用与日常测试过程,目前的想法有针对diff代码和服务器日志的分析来自动定位缺陷、基于模型驱动测试结合知识图谱实现的自动化测试等方向。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/648739.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

延迟重平衡优化(Deferred Re-balancing Optimization Schedule)

DRW 论文代码 elif args.train_rule DRW:train_sampler Noneidx epoch // 160betas [0, 0.9999]effective_num 1.0 - np.power(betas[idx], cls_num_list)print(f"\neffective_num:{effective_num}")per_cls_weights (1.0 - betas[idx]) / np.array(effective…

【stm32/CubeMX、HAL库】嵌入式实验六:定时器(2)|PWM输出

参考: 【【正点原子】手把手教你学STM32CubeIDE开发】 https://www.bilibili.com/video/BV1Wp42127Cx/?p13&share_sourcecopy_web&vd_source9332b8fc5ea8d349a54c3989f6189fd3 《嵌入式系统基础与实践》刘黎明等编著,第九章定时器&#xff0c…

更适合国内的远程访问方法:自建根服务器基于节点小宝虚拟内网

网盘限速?异地出差忘文件?出差异地办公,访问公司OA、ERP、CRM系统、文件服务器等,快速组建个人局域网,家庭影院共享,享受高质量的视听体验。等等这样的场景,稳定靠谱的远程访问能力显得就更加至…

VGG论文解析—Very Deep Convolutional Networks for Large-Scale Image Recognition

VGG论文解析—Very Deep Convolutional Networks for Large-Scale Image Recognition -2015 研究背景 大规模图像识别的深度卷积神经网络 VGG(牛津大学视觉几何组) 认识数据集:ImageNet的大规模图像识别挑战赛 LSVRC-2014:Image…

FreeRTOS队列之向队列发送消息

本篇文章记录我学习FreeRTOS队列相关的知识,主要是关于向队列发送消息的部分。 一、函数原型 创建好队列以后就可以向队列发送消息了,FreeRTOS提供了8个向队列发送消息的API函数。 1、函数xQueueSend()、xQueueSendToBack()和xQueueSendToFront() 这三个函数都是用于…

windows11下,使用工具验证下载的iso文件完整性

windows11下,要验证下载的iso文件是否正常,可以使用工具生成md5值,再与下载源提供的md5值进行比较,相同,说明下载的正常。 命令如下: certutil -hashfile iso文件名 md5 如下面的例子,生成d…

java nio FileChannel堆内堆外数据读写全流程分析及使用(附详细流程图)

这里是小奏,觉得文章不错可以关注公众号小奏技术 背景 java nio中文件读写不管是普通文件读写,还是基于mmap实现零拷贝,都离不开FileChannel这个类。 随便打开RocketMQ 源码搜索FileChannel 就可以看到使用频率 kafka也是 所以在java中文件读写FileCh…

高奇琦:从大国协调到全球性机制:人工智能大模型全球治理路径探析

内容提要 人工智能大模型全球治理的关键是对大模型进行科学分类。大模型可以分为超大模型和一般模型。对于超大模型的治理,可以参考核武器治理的思路,重点是实现超大模型的有限发展和不扩散。对于一般模型而言,要在安全可控的基础上发挥其对…

昂达固态硬盘数据恢复方法:全面解析与操作指南

在数字化时代,数据已经成为我们生活和工作中不可或缺的一部分。而固态硬盘(SSD)由于其读写速度快、抗震性强等优点,慢慢取代了传统的机械硬盘,成为我们存储数据的主要选择。然而,即便再先进的存储设备&…

OrangePi AIpro初体验之图片视频检测案例真实测评

OrangePi AIpro简介 OrangePi AIpro官网 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能AI 开发板,其搭载了昇腾AI 处理器,可提供8TOPS INT8 的计算能力,内存提供了8GB 和16GB两种版本。可以实现图像、视频等多种数据分析与推理…

网页提示“非私密连接”是为什么?

网页提示“非私密连接”(英文提示可能是 "Your connection is not private" 或 "Your connection is not secure")主要是因为浏览器无法验证你正试图访问的网站的SSL/TLS证书,或者是证书存在问题,从而无法建立…

【机器学习】机器学习在信息安全领域中的典型应用

🚀🚀🚀传送门 🔒机器学习在信息安全领域中的典型应用📕利用机器学习检测恶意行为并阻断攻击🌈使用机器学习分析移动终端安全状况⭐借助机器学习提高信息安全分析水平🎬依靠机器学习自动完成重复…

javaEE—图书管理系统(基础代码版)

前言: 本篇博客是集合了javaEE所学的知识构建的一个基础框架,讲述着面向对象的过程是如何做到多对象交互协作完成框架的构建的。利用了数组,接口,类和对象,抽象类,Object类等知识来完成。 后续会加入数据…

钕铁硼表面磷化处理

大家都知道烧结钕铁硼易氧化、易腐蚀,日久将造成磁性能的衰减甚至丧失,所以使用前必须进行严格的防腐处理。在之前的文章中已经向大家介绍过与烧结钕铁硼表面处理相关的知识和电镀的工艺流程,除了电镀之外,钕铁硼表面处理还可采用…

zstd库数据压缩与解压缩

在 Visual Studio 2019 中使用 C 的 zstd 库进行数据压缩与解压缩 在今天的博客中,我们将探讨如何在 Visual Studio 2019 中使用 zstd 库进行高效的数据压缩和解压缩。zstd(也称为 Zstandard 或 zstd)是由 Facebook 开发的开源压缩库&#x…

数据结构中树的一些基本概念

前言:带你认识二叉树从基本概念开始,步步深入。 目录 树的概念和其中比较重要的基本概念 对概念的深度解析: 树的结构应该如何实现呢? 树的分类: 完全二叉树与满二叉树: 树的概念和其中比较重要的基本…

嵌入式进阶——数码管

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 数码管结构移位寄存器原理图移位寄存器数据流程移位寄存器控制流程移位寄存器串联实现数码管显示 数码管结构 共阴与共阳 共阳数码…

Java SE基础知识(11)

知识梳理: 记不住就看API帮助文档中的pattern类 开发过程中,正则表达式一般不自己写,安装插件any-rule 选择自己想要的正则表达式格式,稍作修改即可

科学提效|AI融入零售业,未来零售的创新之旅

零售业正经历着由人工智能(AI)引领的转型浪潮。AI在零售和消费品(CPG)行业的应用前景广阔,它正以多种创新方式重塑行业的运作模式。且随着技术的不断进步,AI在零售业的应用将变得更加广泛和深入。AI不仅能够…

解锁Facebook的神秘密码:探索社交媒体的奥秘

在当今数字时代,社交媒体已经渗透到我们生活的方方面面。Facebook,作为这个领域中最为瞩目的平台之一,不仅连接着全球数十亿用户,还承载着庞大的信息流和交流网络。然而,Facebook的背后是一个充满着技术和隐私的世界&a…