大模型应用之基于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,可减少与大模型问答的次数(减少大模型网关调用次数),提高整体用例文件生成的速度。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 promptMessagesPlaceholder(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_casechain = 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_fileembedding_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代码和服务器日志的分析来自动定位缺陷、基于模型驱动测试结合知识图谱实现的自动化测试等方向。



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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据集][目标检测]旋风检测数据集VOC+YOLO格式157张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):159 标注数量(xml文件个数):159 标注数量(txt文件个数):159 标注类别…

1. MySQL 数据库的基本操作

文章目录 【 1. SQL 的书写规则 】大小写规则常量的表示注释 【 2. RDBMS 术语 】Table 表Filed 域/字段Column 列Record 记录NULL 空值Constraint 约束数据的完整性范式 【 3. 数据库基本操作函数 】3.1 SHOW DATABASES 显示数据库3.2 CREATE DATABASE 创建数据库3.3 ALTER DA…

STM32-14-FSMC_LCD

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU 文章目录 1. 显示器分类2. LCD简…

[Windows] 植物大战僵尸杂交版

游戏包含冒险模式、挑战模式、生存模式三种不同玩法。冒险模式主打关卡闯关,挑战模式则挑战特殊设计的关卡,生存模式结合无尽模式和特殊地图,各具特色。玩家可根据喜好自由选择模式,体验不同的游戏乐趣。快来尝试这款独特的pvz游戏…

6月2(信息差)

🌍特斯拉:Model3高性能版预计6月中旬开启首批交付 🎄微软对开源字体 Cascadia Code 进行重大更新 ✨天猫618加码引爆消费热潮 截至晚9点185个品牌成交破亿 1.瑞士清洁科技公司Librec开发废旧锂离子电池回收技术,可回收电池90%的…

【设计模式】JAVA Design Patterns——Factory Method(虚拟构造器模式)

🔍目的 为创建一个对象定义一个接口,但是让子类决定实例化哪个类。工厂方法允许类将实例化延迟到子类 🔍解释 真实世界例子 铁匠生产武器。精灵需要精灵武器,而兽人需要兽人武器。根据客户来召唤正确类型的铁匠。 通俗描述 它为类…

IDEA2020.3部署旧的的web工程,报错,参考下面的配置

以下内容,需要仔细核对,有些配置只是针对本项目进行的配置,仅供参考,可以解决一些问题。 File->Project Structure: Tomcat配置: 完成。 详细内容,参考:IDEA2020.3部署旧的的web工…

备战十一届大唐杯国赛预选赛

这次省赛带了太多个省一了,具体可看下面的图片,只放了一部分。目前根据可靠消息,应该还有个预选赛和去年一样,就是还会考一次仿真。如果说通过了就是国二起步然后去北方工业争夺国一国二,没过的话就是国三。 每…

Python实用代码片段分享(三)

在今天的博文中,我们将继续分享一些Python编程中非常实用的代码片段。这些代码片段将帮助你更高效地处理常见任务,从字符转换到数据类型检查,应有尽有。 1. ord函数和chr函数 Python的ord()函数可以返回Unicode字符对应的ASCII码值&#xf…

精准检测,可燃气体报警系统的技术原理与特点

在现代化的工业生产与日常生活中,可燃气体泄露事故频发,给人们的生命和财产安全带来了严重威胁。 因此,可燃气体报警检测系统的应用变得尤为重要。它不仅能够实时监测环境中的可燃气体浓度,还能在发现异常情况时及时报警&#xf…

[leetcode hot150]第五十七题,插入区间

题目: 给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示…

【机器学习】——驱动智能制造的青春力量,优化生产、预见故障、提升质量

目录 一.优化生产流程 1.1 数据收集 1.2 数据预处理 1.3 模型训练 1.4 优化建议 1.5 示例代码 二.预测设备故障 2.1 数据收集 2.2 数据预处理 2.3 模型训练 2.4 故障预测 2.5 示例代码 三.提升产品质量 3.1 数据收集 3.2 数据预处理 3.3 模型训练 3.4 质量提升…

最新一站式AI创作中文系统网站源码+系统部署+支持GPT对话、Midjourney绘画、Suno音乐、GPT-4o文档分析等大模型

一、系统简介 本文将介绍最新的一站式AI创作中文系统(集成ChatGPTMidjourneySunoStable Diffusion)——星河易创AI系统,该系统基于ChatGPT的核心技术,融合了自然语言问答、绘画、音乐、文档分享、图片识别等创作功能,…

VTK9.3.0刻度标签重叠的问题

本文采用VTK9.3.0版本,其他版本如VKT8.0亦有同样的问题 VTK显示文本时,Z轴刻度标签出现了重叠,如下图: 寻找好久,没有找到设置标签间距、个数等相关的公有成员函数,此问题一直没有解决。 于是想到改VKT9.…

重生之 SpringBoot3 入门保姆级学习(10、日志基础与使用)

重生之 SpringBoot3 入门保姆级学习(10、日志基础使用) 3.1 日志基础3.2 使用日志3.2.1 基础使用3.2.2 调整日志级别3.2.3 带参数的日志 3.1 日志基础 SpringBoot 默认使用 SLF4j(Simple Logging Facade for Java)和 Logback 实现…

2024089期传足14场胜负前瞻

2024089期售止时间为6月3日(周一)22点00分,敬请留意: 本期1.5以下赔率5场,1.5-2.0赔率5场,其他场次是平半盘、平盘。本期14场难度偏低。以下为基础盘前瞻,大家可根据自身判断,复选增…

pycharm简易使用码云gitee

文章目录 参考文献官网地址安装插件第一个选项报错了不可,第二个选项,可以了新库上传到主分支,push改进实验新建分支,上传为新分支:做另一种改进,选择回退主分支,另建一个分支 使用对于一个新项…

【stm32/CubeMX、HAL库】swjtu嵌入式实验七 ADC 实验

相关电路与IO引脚 注意&#xff1a;串口打印重定向后使用printf打印需要在keil里勾选 Use MicroLIB &#xff0c;否则会卡住。 参看&#xff1a;https://zhuanlan.zhihu.com/p/565613666 串口重定向&#xff1a; /* USER CODE BEGIN Includes */#include <stdio.h>//…

(函数)颠倒字符串顺序(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <string.h>//声明颠倒函数; void reverse(char a[]) {//初始化变量值&#xff1b;int i, j;char t;//循环颠倒&#xff1b;for (i 0, j strl…

寄存器、缓存、内存(虚拟、物理地址)、DDR、RAM的关系

寄存器、缓存、内存、DDR、RAM的关系 1. 主要概念内部存储器&#xff1a;2.1 寄存器&#xff0c;register2.2 主存储器&#xff0c;内存&#xff0c;memory2.3 缓存&#xff0c;高速缓冲存储器&#xff0c;cache 外部存储器2.4 快闪存储器&#xff0c;闪存&#xff0c;flash Me…