当前位置: 首页 > news >正文

基于LangChain手工测试用例转接口自动化测试生成工具!

接口自动化测试用例是一个老生常谈的问题,在未引入人工智能之前,也有非常多的生成方案,比如如下所示,通过har生成接口自动化测试用例:

图片

但是以上的生成方式依然是有一些弊端,比如 har 本身虽然能表述一定的接口信息和业务信息,但是毕竟无法用来表述全部的应用场景与用例场景。而大部分的应用场景和用例场景,均是通过自然语言进行描述的。而解析自然语言,则是大语言模型擅长做的事情。

实践演练

需求说明

以下内容为3条接口测试用例:

测试模块测试标题测试步骤预期结果
接口功能正常情况下的请求发送一个正常的GET请求响应状态码为 200 ,并返回请求者的IP地址
接口功能非法请求方法发送一个非GET请求,如POST或者PUT响应状态码为 405
接口功能无效的请求路径发送一个不存在的路径响应状态码为404

以下为一个获取ip接口的har文件:

  • 接口Har文件(需要可留言领取)

实现原理

接下来,将通过这两个数据文件自动生成对应的测试用例。

图片

通过功能用例生成测试脚本

在这个过程中,测试用例本身是自然语言,自然语言的解析与处理本身就是大模型非常擅长的工作。而可以通过 LangChain 简化整个的实现的过程。

编写的提示词模版信息如下所示:

template = """你是一个自动化测试工程师,精通的技术栈为 Python pytest requests库以下是这个接口的具体信息,
{context}
Question: {input}"""

通过功能测试用例生成的自动化测试脚本如下所示:

#1. Test case: 正常情况下的请求import pytestimport requests
def test_normal_request():    url = 'http://example.com/normal_request'    response = requests.get(url)    assert response.status_code == 200    assert response.json()['ip_address'] == 'requester_ip'#2. Test case: 非法请求方法import pytestimport requestsdef test_invalid_request_method():    url = 'http://example.com/invalid_request_method'    response = requests.post(url)    assert response.status_code == 405# 3. Test case: 无效的请求路径import pytestimport requestsdef test_invalid_request_path():    url = 'http://example.com/invalid_request_path'    response = requests.get(url)    assert response.status_code == 404

当然,在此过程中可以很明显的发现,自动生成的用例是没有任何的接口信息的。原因是我们给到的数据里面就是没有接口信息的。

填充接口数据

接下来,将读取har文件中的接口数据信息,和脚本进行结合。

提示词模版如下:

template = """    你是一个自动化测试工程师,你非常熟悉requests库    {context}    Question:     请根据传入的接口信息提取request中的 ip 、 url 、method、json。    key值为前面提到的字段,如果没有则无需添加。如果有则提取对应的value。    要求返回的格式为json格式"""

生成结果如下:

{  "ip": "182.92.156.22",  "url": "https://httpbin.ceshiren.com/ip",  "method": "GET"}
完整代码

再将以上的过程结合之后,完整版的代码如下所示

from langchain_community.chat_models.openai import ChatOpenAIfrom langchain_community.document_loaders.text import TextLoaderfrom langchain_core.output_parsers import JsonOutputParser, StrOutputParserfrom langchain_core.prompts import PromptTemplatefrom langchain_core.runnables import RunnablePassthroughfrom utils.langchain_debug import langchain_debug
langchain_debug()llm = ChatOpenAI()def get_by_filename(filename):    info = TextLoader(f'./data/{filename}')    return info.load()def get_case_data(_):    template = """        你是一个自动化测试工程师,你非常熟悉requests库        {context}        Question: {input}        请根据传入的接口信息提取request中的 ip 、 url 、method、json。        key值为前面提到的字段,如果没有则无需添加。如果有则提取对应的value。        要求返回的格式为json格式        """    prompt = PromptTemplate.from_template(template=template, )    data_chain = (            RunnablePassthrough.assign(context=lambda x: get_by_filename("ip.har"), )            | prompt            | llm            | JsonOutputParser()    )    return data_chaindef get_case():    """    通过大模型生成测试数据。    :return:    """    template = """        你是一个自动化测试工程师,精通的技术栈为 Python pytest requests库        以下是这个接口的具体信息,你的
        {context}
        请求的参数信息将输入一个字典,输入的内容为        {req}
        Question: {input}"""    # 模板提示,输出 json 格式的回答    prompt = PromptTemplate.from_template(        template=template, )    chain = (            RunnablePassthrough.            assign(context=lambda x: get_by_filename("获取ip测试用例.md"),                   req=get_case_data)            | prompt            | llm            | StrOutputParser()    )
    input_template = """    根据每条测试用例的测试步骤,生成对应的测试数据信息,    每条测试用例要求都有一条对应的单独的pytest函数    """    print(chain.invoke({"input": input_template}))if __name__ == '__main__':    get_case()

总结

  1. 掌握接口自动化测试用例生成的原理。

  2. 了解如何通过大语言模型生成接口自动化测试脚本与数据。

  3. 掌握通过LangChain生成完整版接口自动化测试用例的方法。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 第七章数据安全10分
  • Excel求和方法之
  • Pytorch如何判断两个模型的权重是否相同(比较权重差异/参数字典)
  • 推荐适合七夕的SVG模版(第II期)
  • FreeBSD启动后进入单用户模式,但是发现zfs系统是只读的,应该怎样挂载成可读可写呢?
  • SpringCloudAlibaba基础七-2 seata的使用
  • Docker Swarm
  • ArcGIS Pro SDK (十二)布局 6 地图框和环绕要素
  • 年薪30万+,TOP大厂月薪10万+....网络安全工程师凭什么?
  • npm install
  • 如何修改计算机ip地址?几招教你轻松改
  • Java Web|day5.MyBatis
  • 快排/堆排/归并/冒泡/
  • 分布式知识总结(一致性Hash算法)
  • Vue3列表(List)
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 30天自制操作系统-2
  • AHK 中 = 和 == 等比较运算符的用法
  • Angular 响应式表单之下拉框
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • FineReport中如何实现自动滚屏效果
  • Java 23种设计模式 之单例模式 7种实现方式
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • magento2项目上线注意事项
  • mockjs让前端开发独立于后端
  • 关于extract.autodesk.io的一些说明
  • 将回调地狱按在地上摩擦的Promise
  • 跳前端坑前,先看看这个!!
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 阿里云重庆大学大数据训练营落地分享
  • ​VRRP 虚拟路由冗余协议(华为)
  • # Apache SeaTunnel 究竟是什么?
  • $.proxy和$.extend
  • (1)虚拟机的安装与使用,linux系统安装
  • (27)4.8 习题课
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (安卓)跳转应用市场APP详情页的方式
  • (力扣题库)跳跃游戏II(c++)
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)为C# Windows服务添加安装程序
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • **PHP二维数组遍历时同时赋值
  • .apk 成为历史!
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .net连接oracle数据库
  • .NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强
  • .net中调用windows performance记录性能信息
  • 。。。。。
  • /dev/sda2 is mounted; will not make a filesystem here!
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @Not - Empty-Null-Blank
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116