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

news2024/11/19 15:31:40

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

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

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

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

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

在这里插入图片描述

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

二 细节介绍
1 基于 Langchain 的测试用例生成方案

因 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(因大部分是流程图),实际用例设计环节提效可达到 50%。

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

优势:

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

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

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

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

劣势:

•对复杂流程图不能很好的理解,当文本描述较少时,生成内容有偏差

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

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

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

可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把全套AI技术和大模型入门资料、操作变现玩法都打包整理好,希望能够真正帮助到大家。

👉AI大模型学习路线汇总👈
大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)
在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

👉大模型视频和PDF合集👈
观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【通过新能源汽车的智慧数字底盘技术看计算机的相关技术堆栈?以后是软硬结合的全能程序员的天下,取代全栈(前后端都会的全栈程序员)】

汽车的“智慧数字底盘”是一个综合性的技术平台,旨在提升车辆的性能、安全性和驾驶体验。它集成了多种先进的技术和系统,是全能程序员的必杀技! 1. 传感器技术 a. 激光雷达(LiDAR) 用于生成高分辨率的3D地图&#…

PG sql调优案例学习

一,开发范式 1.不要轻易把字段嵌入到表达式 例:在sal列上有索引,但是条件语句中把sal列放在了表达式当中,导致索引被压抑,因为索引里面储存的是sal列的值,而不是sal加上100以后的值。 在条件中查询谁的工资1002000。这样写即使在sal上有索引也会走全表…

【倪诗韵神品连珠琴】音质纯净共鸣好,漆髹水墨黑云纹,讲究

【倪诗韵神品连珠琴】音质纯净共鸣好,漆髹水墨黑云纹,用料讲究。 此琴音质纯净共鸣好,非常清透,适合清风清新俊逸之流,琴体造型秀气,漆髹水墨黑云纹,用料讲究,木材纹理竖直而无疤。琴…

【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版7(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言绘制进度条UI控制关卡进度测试按配置表使用关卡进度变化源码结束语 前言 本节主要实现关卡进度条的功能 绘制进度条UI 控制关卡进度测试 新增ProgressPanel代码,控制关卡进度 public class ProgressPanel : Mon…

kettle学习(利用jsonPath定位,json文件转换)

kettle学习(利用jsonPath定位,json文件转换) 于数据处理的广袤天地间,我们时常需应对各类繁杂状况与各式格式。Kettle 作为极具威力的数据集成利器,赋予了我们诸多功能与无限可能此次博客里,我们将重点投向…

一站到底-Vue移动端从零到一构建高效应用

​🌈个人主页:前端青山 🔥系列专栏:vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:一文精通Vue移动端:从零到一构建高效应用 目录 1、项目创建 2、引入组件库 二、功能实…

上位机图像处理和嵌入式模块部署(f407 mcu内部flash编程)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于f407这样的mcu来说,有的时候我们需要对mcu内部的flash进行编程处理。有两种情况需要对flash进行编程,一种情况是可能一…

深度学习500问——Chapter10:迁移学习(2)

文章目录 11.2 迁移学习的基本思路有哪些 11.2.1 基于样本迁移 11.2.2 基于特征迁移 11.2.3 基于模型迁移 11.2.4 基于关系迁移 11.2 迁移学习的基本思路有哪些 迁移学习的基本方法可以分为四种。这四种基本方法分别是:基于样本的迁移,基于模型的迁移&a…

电子元器件批发的几种模式

电子元器件的批发模式多种多样,以下是几种常见的模式: 传统批发模式:传统的电子元器件批发模式是指厂商或代理商通过与制造商签订合同,大批量购买元器件,并将其以较低的价格批发给零售商或其他中小型企业。这种模式通常…

树-二叉树的最大路径和

一、问题描述 二、解题思路 因为各个节点的值可能为负数,初始化res(最大路径和)的值为最小整数:Integer.MIN_VALUE 我们这里使用深度遍历(递归)的方法,先看某一个子树的情况: 这里有一个技巧,…

【C#】pdf按页分割文件,以及分页合并,效果还不错,你值得拥有

欢迎来到《小5讲堂》 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 背景效果单页分割文件合并多页分割插件说明相关文章 背景 最近遇到一…

STM32Cube系列教程11:STM32 AES加解密模块性能测试

文章目录 本次测试环境本次测试所使用的系统时钟为48MHz本次测试主要测试对大量数据进行加解密所需的时间,本次为不严谨测试,忽略了程序调用耗时,结果仅供参考。 AES算法与数据加解密加密与解密对称加解密AES算法AES-ECBAES-CBC 填充算法PKCS…

ITIL简介重要组成部分

ITIL简介&重要组成部分 ITIL(Information Technology Infrastructure Library)是一个IT服务管理的最佳实践框架,通过服务战略、服务设计、服务过渡、服务运营和持续服务改进五个核心模块,帮助组织优化IT服务流程,…

嘴尚绝卤味:健康美味,引领卤味新风尚

在快节奏的现代生活中,人们对于美食的追求从未停歇。卤味作为中国传统美食的代表之一,以其独特的口感和丰富的营养,深受广大消费者的喜爱。而在众多卤味品牌中,嘴尚绝卤味凭借其健康、美味的特色,成为了市场上的佼佼者…

Pytorch解决 多元回归 问题的算法

Pytorch解决 多元回归 问题的算法 回归是一种基本的统计建模技术,用于建立因变量与一个或多个自变量之间的关系。 我们将使用 PyTorch(一种流行的深度学习框架)来开发和训练线性回归模型。 二元回归的简单示例 训练数据集(可获取&…

分离式光电液位传感器有哪些特点?

分离式光电液位传感器是一种先进的液位检测技术,在科学技术的不断推进下得到了广泛应用。相比传统的液位传感器,分离式光电液位传感器具有许多独特的特点。 传感器采用了先进的光学技术,将传感器装在需要检测液位的位置,并采用了…

非GIS专业,真的不适合WebGIS开发吗?

到底是哪些人在新中地特训营学GIS开发? 很多同学对GIS开发的认知还停留在GIS专业的学生才能学GIS开发,然而,在新中地教育,非GIS专业的学生几乎占一半。 除了GIS专业,还有测绘、遥感等跟GIS差别不大的专业学生选择来学…

面试官:你讲下接口防重放如何处理?

前言 我们的API接口都是提供给第三方服务/客户端调用,所有请求地址以及请求参数都是暴露给用户的。 我们每次请求一个HTTP请求,用户都可以通过F12,或者抓包工具fd看到请求的URL链接,然后copy出来。这样是非常不安全的,有人可能会…

鸿蒙轻内核A核源码分析系列二 数据结构-位图操作

在进一步分析之前,本文我们先来熟悉下OpenHarmony鸿蒙轻内核提供的位操作模块,在互斥锁等模块对位操作有使用。位操作是指对二进制数的bit位进行操作。程序可以设置某一变量为状态字,状态字中的每一bit位(标志位)可以具…

Kubernetes——HPA自动伸缩机制

目录 前言 一、概念 1.定义 2.核心概念 3.工作原理 4.HPA的配置关键参数 5.关键组件 5.1HPA控制器(HPA Controller) 5.2Metrics Server 5.3自定义指标适配器(Custom Metrics Adapter) 5.4Deployment/ReplicaSet 5.5Po…