大模型应用之基于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 代码框架及部分代码展示

代码框架:

image.png

代码示例:

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代码和服务器日志的分析来自动定位缺陷、基于模型驱动测试结合知识图谱实现的自动化测试等方向。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​​软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

<think>好的,我现在需要回答用户关于如何使用LangChain框架生成和执行测试用例的问题。首先,我要确保自己正确理解用户的需求。用户提到了引用[1]和引用[2],这些内容涉及LangChain测试用例生成与执行中的应用,特别是自动化测试的实现。用户的问题具体是询问如何利用LangChain实现这一过程,因此我需要结合提供的引用信息,并按照系统级指令中的要求来组织回答。 首先,我需要回顾引用中的内容。引用[1]提到了一个使用RunnablePassthrough和AgentExecutor的链式结构,其中load_case函数用于加载测试用例,然后通过代理执行。引用[2]则介绍了测试用例设计方法的枚举类型,包括等价类和因果图方法,并提到集成到测试平台的可能性。 接下来,我需要将这些信息结构化,分步骤解释生成与执行测试用例的过程。根据系统指令,回答需要结构清晰,逐步解决问题,并引用相关段落。同时,要确保正确使用LaTeX格式,例如行内数学表达式用$...$,独立公式用$$...$$,但在这个问题中可能数学公式较少,主要关注代码和流程。 首先,可能需要分步骤说明:测试用例生成测试用例加载、执行测试用例。每个步骤需要结合引用中的代码示例,比如引用[1]中的chain和agent_executor的设置,以及引用[2]中的DesignType枚举类。 然后,需要确保代码块正确展示,比如Python代码的语法是否正确,是否有必要的解释。例如,在引用[1]中,代码展示了如何通过RunnablePassthrough分配code变量,然后执行代理。这部分需要解释每个组件的作用,如RunnablePassthrough、agent1、tools_all等。 另外,用户可能关心如何选择不同的测试用例设计方法,比如等价类或因果图,这需要引用[2]中的DesignType枚举,说明如何集成到生成过程中。 还要注意系统指令中的要求,比如生成相关问题,需要提出三个相关问题,可能涉及性能优化、集成方法、异常处理等。 在组织回答时,要确保每个部分引用正确的来源,如引用[1]和引用[2],并在末尾添加引用标识。同时,检查是否有遗漏的步骤,例如是否需要配置环境、如何处理测试结果等,但根据提供的引用,可能主要聚焦于生成和执行的代码结构。 最后,确保回答符合中文语言要求,避免使用Markdown格式,使用自然的口语化表达,同时保持逻辑清晰和技术准确性。需要验证所有步骤是否覆盖用户的问题,并正确引用提供的资料,避免添加未提及的内容。</think>### 如何使用 LangChain 实现测试用例生成与自动执行 #### 一、测试用例生成与执行的实现步骤 1. **测试用例生成** LangChain 通过定义测试用例设计方法的枚举类型(如等价类、因果图)实现灵活选择生成策略。例如引用[2]中定义的`DesignType`类: ```python class DesignType(Enum): EP = "等价类测试用例设计" CE = "因果图测试用例设计" ``` 通过大模型(如集成 Spark 3.0)解析需求文档,生成符合选定方法的测试用例[^2]。 2. **测试用例加载与绑定** 使用`RunnablePassthrough`将生成测试用例加载到执行链中。引用[1]中的代码展示了如何通过`load_case`函数加载用例并绑定到链式操作: ```python chain = ( RunnablePassthrough.assign(code=load_case) | agent1 ) ``` 此步骤将生成测试用例转换为可执行的代码逻辑[^1]。 3. **执行测试用例** 通过`AgentExecutor`实现自动化执行,支持工具集成和中间步骤追踪: ```python agent_executor = AgentExecutor( agent=chain, tools=tools_all, verbose=True, return_intermediate_steps=True, handle_parsing_errors=True ) agent_executor.invoke({"input": "执行测试用例"}) ``` 执行结果会包含测试通过率、失败原因等详细信息[^1]。 #### 二、关键组件说明 - **`load_case`函数**:需提前实现用例加载逻辑(如从文件或数据库读取),返回结构化测试数据[^1]。 - **工具集成(`tools_all`)**:可包含 HTTP 请求工具、断言库等,用于实际接口调用和结果验证。 - **错误处理**:`handle_parsing_errors=True`确保执行过程中语法或逻辑错误能被捕获并反馈。 #### 三、典型应用场景 1. **接口自动化测试**:将手工测试用例转换为自动化脚本(如引用[1]中描述的转换工具)。 2. **多方法测试设计**:根据需求动态选择等价类或因果图方法生成用例(如引用[2]中的枚举类型)。 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值