基于 LangChain 的自动化测试用例的生成与执行

news/2024/11/18 7:34:37/文章来源:https://www.cnblogs.com/hogwarts/p/18436123

在前面的章节中,分别介绍了 Web、App、接口自动化测试用例的生成。但是在前文中实现的效果均为在控制台打印自动化测试的用例。用例需要手动粘贴,调整之后再执行。

那么其实这个手动粘贴、执行的过程,也是可以直接通过人工智能完成的。

应用价值

  • 通过人工智能代替人工操作的部分,节省时间,提升效率。
  • 通过封装更多的 Tools,让 Agent 更为智能。

实践演练

实现原理

实现思路

在理解需求之后,我们可以了解到我们需要让 Agent 具备两个功能:

  1. 输入源码信息,生成 python 文件。
  2. 输入文件名,执行 pytest 测试文件功能。

如此,可以通过如下两个步骤实现需求:

  1. 工具包封装。
  2. 实现 Agent。
工具包封装

为了让工具包更易被大模型理解,我们将注释调整为英文,提升准确率。同时为了传参的时候不出现格式错误问题,通过args_schema限制参数结构与格式(tools 章节有具体讲解)。


from langchain_core.tools import tool
from pydantic.v1 import BaseModel, Fieldclass PythonFileInput(BaseModel):# 定义参数的描述filename: str = Field(description="filename")source_code: str = Field(description="source code data")class PytestFileName(BaseModel):# 定义参数的描述filename: str = Field(description="The name of the file to be executed")@tool(args_schema=PythonFileInput)
def write_file(filename, source_code):"""Generate python files based on input source code"""with open(filename, "w") as f:f.write(source_code)@tool(args_schema=PytestFileName)
def execute_test_file(filename):"""Pass in the file name, execute the test case and return the execution result"""import subprocess# 使用subprocess模块执行pytest命令result = subprocess.run(['pytest', filename], capture_output=True, text=True)# 检查pytest的执行结果if result.returncode == 0:print("测试运行成功!")else:print("测试运行失败:")print(result.stdout)return result.stdout
通过 AGENT 实现需求
  1. 首先封装 Agent,绑定工具,输入提示词。在示例中,是在 LangChain 官方提供的 structured-chat-agent提示词基础之上修改的提示词,添加了一个code变量。目的是为了后面 code 可以由其他的 chain 的执行结果而来。

#  注意:需要再原提示词的基础上添加 {code} 变量
# prompt = hub.pull("hwchase17/structured-chat-agent")
llm = ChatOpenAI()agent1 = create_structured_chat_agent(llm, tools_all, prompt)agent_executor = AgentExecutor(agent=agent1, tools=tools_all,verbose=True,return_intermediate_steps=True,handle_parsing_errors=True)if __name__ == '__main__':agent_executor.invoke({"input": "请根据以上源码生成文件", "code": """def test_demo(): return True"""})

由以上的步骤,即可生成一个源码文件:

  1. 在生成源码文件后,可以继续补充提示词,要求Agent 执行对应的测试用例:
if __name__ == '__main__':agent_executor.invoke({"input": """请根据以下步骤完成我让你完成操作,没有完成所有步骤不能停止:1. 先根据以上源码生成文件。2. 根据上一步生成的源码文件,进行执行测试用例操作,并返回终的执行结果""","code": """def test_demo(): return True"""})

到这里,通过 Agent 就能自动生成测试用例文件执行测试用例了。

与其他的场景结合

在前面的章节中,已经实现了自动生成接口自动化测试用例的操作。可以直接与前面的操作结合,自动生成接口自动化测试用例,并执行测试用用例。

注意:load_case 如何实现在前面章节:《基于LangChain手工测试用例转接口自动化测试生成工具》,已有对应讲解

# load_case 的返回结果是接口的自动化测试用例
chain = (RunnablePassthrough.assign(code=load_case) | agent1
)agent_executor = AgentExecutor(agent=chain, tools=tools_all,verbose=True,return_intermediate_steps=True,handle_parsing_errors=True)if __name__ == '__main__':agent_executor.invoke({"input": """请根据以下步骤完成我让你完成操作,没有完成所有步骤不能停止:1. 先根据以上源码生成文件。2. 根据上一步生成的源码文件,进行执行测试用例操作,并返回终的执行结果"""})

执行之后,即可在控制台看到生成的接口自动化测试用例的执行记录。

总结

  1. 自动化测试用例的生成与执行的实现原理。
  2. 自动化测试用例的生成与执行的实现思路。
  3. 利用 Agent 实现自动化测试用例的生成与执行。

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

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

相关文章

数字孪生赋能BMS:开启电池管理新纪元

这几天,全世界的媒体几乎都在报道黎巴嫩爆炸案。原本此类地缘冲突的影响力是较为有限的,但是这次的事件不太一样:这次爆炸的,是几千个传呼机。这一事件迅速引发了全球范围内对于电子设备安全性的广泛关注:随着社会日益依赖各种高科技产品,从日常通信到交通出行,人们开始…

20240927

Fun is Counting 我们可以发现数组 \(a\) 必须是 \(x\) 或 \(x - 1\),然后分类讨论即可 #include <bits/stdc++.h>using namespace std;#define int long longconst int N = 1e6 + 5, mod = 998244353;int inv[N], f[N], g[N], t, n, a[N];int C(int a, int b) {if (a &l…

海报作业

海报主题:知识的力量设定: 目标:强调教育和知识对个人成长和社会发展的重要性 设计构思:1. 色彩:选择明亮且有活力的颜色,如蓝色和黄色,吸引眼球并传达积极的情绪。图像: 中心可以用一棵大树象征知识之树,树冠由书籍组成。 在树下,可以画出一群不同年龄和背景的人在学…

驱动导致win蓝屏(蓝屏code: 0x9f)

描述:在9月27日12点35分24秒系统发生蓝屏通过系统事件日志来看发现发现从发生蓝屏开始到下一次开机之间相隔4分钟左右 继续分析dump日志,此次蓝屏代码为0x9f通过dump日志来看,造成此次蓝屏的原因是驱动程序处于不一致或无效的电源状态。 In Windows Vista and later version…

wireshark抓不到TLS1.3数据包中证书的解决方案

近日工作中遇到需要分析使用TLS1.3协议进行通信的数据包的情况,但使用wireshark进行分析发现不能抓到服务端证书,感到诧异遂设法解决 这篇博客给出解决方案,和简单的原理分析近日工作中遇到需要分析使用TLS1.3协议进行通信的数据包的情况,但使用wireshark进行分析发现不能抓…

chrome实现点击书签, 新页面打开. (左键点击). 新标签打开书签 .

1. 我找了很多插件, 都没法实现点击书签, 自动新标签打开. 2. 但是我发现一款 chrome , 是可以实现的 https://www.ghxi.com/chrome.html 这是基于 chrome ++ 的增强版. 便携版和安装版使用起来没有任何区别 , 甚至重装系统依旧能用原来的数据. 如何开启新标签打开书签的功能, …

GB28181接入摄像头到LiveGBS流媒体平台时,内网ip和外网ip怎么设置才能正确接收到摄像头视频

@目录1、流媒体服务配置2、播放提示none rtp data receive3、多网卡服务器4、收流端口配置5、端口区间可以如何配置6、搭建GB28181视频直播平台 1、流媒体服务配置LiveGBS中基础配置-》流媒体服务配置中有,本地|内网 IP、外网 IP(可选)、外网IP收流勾选,如何配合使用,如何理…

springcloud整合gateway

gateway作为第二代springcloud网关,是微服务架构中不可缺少的一部分,接下去就简单介绍下如何在springcloud中整合它 此处配合用到了nacos,将gateway服务注册到nacos统一管理 一、添加依赖:<dependency><groupId>org.springframework.cloud</groupId><…

谷歌网站收录查询,利用关键词进行谷歌网站收录查询的方法

利用关键词进行谷歌网站收录查询,可以通过以下几种方法来实现: 一、使用Google Search Console(谷歌搜索控制台) 虽然Google Search Console不直接支持通过关键词批量查询收录情况,但你可以通过以下步骤间接利用关键词来评估收录情况: 注册并验证网站:首先,你需要在Goo…

Oracle:重复数据去重,只取最新的一条数据

前言 最近开发的时候遇到一个任务,需要对重复的数据进行筛选,只取插入时间最早的一条数据。这里介绍一下解决这类去重问题的几种思路 先看样例数据解决思路一 先group by找到每个人最新的数据插入时间(insert_time),再通过insert_time作为条件表关联的条件筛选出每个人最新…

实验1 C语言开发环境使用和数据类型、运算符、表达式

任务1:1 #include<stdio.h> 2 3 int main(){ 4 printf(" O O\n"); 5 printf(" <H> <H>\n"); 6 printf(" I I I I\n"); 7 return 0; 8 } 1 #include<stdio.h>2 3 int main(){4 print…