写点什么

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

  • 2024-08-16
    北京
  • 本文字数:2185 字

    阅读完需:约 7 分钟

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



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

实践演练

需求说明

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

以下为一个获取 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_chain

def 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 生成完整版接口自动化测试用例的方法。


用户头像

社区:ceshiren.com 微信:ceshiren2023 2022-08-29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
基于LangChain手工测试用例转接口自动化测试生成工具_测试_测吧(北京)科技有限公司_InfoQ写作社区