接口自動化測試用例是一個老生常談的問題,在未引入人工智能之前跌造,也有非常多的生成方案杆怕,比如如下所示,通過har生成接口自動化測試用例:
image.png
但是以上的生成方式依然是有一些弊端壳贪,比如 har 本身雖然能表述一定的接口信息和業(yè)務信息陵珍,但是畢竟無法用來表述全部的應用場景與用例場景。而大部分的應用場景和用例場景违施,均是通過自然語言進行描述的互纯。而解析自然語言,則是大語言模型擅長做的事情磕蒲。
實踐演練
需求說明
以下內容為3條接口測試用例:
測試模塊 | 測試標題 | 測試步驟 | 預期結果 |
---|---|---|---|
接口功能 | 正常情況下的請求 | 發(fā)送一個正常的GET請求 | 響應狀態(tài)碼為 200 留潦,并返回請求者的IP地址 |
接口功能 | 非法請求方法 | 發(fā)送一個非GET請求,如POST或者PUT | 響應狀態(tài)碼為 405 |
接口功能 | 無效的請求路徑 | 發(fā)送一個不存在的路徑 | 響應狀態(tài)碼為404 |
以下為一個獲取ip接口的har文件:
- 接口Har文件(需要可留言領取)
實現(xiàn)原理
接下來亿卤,將通過這兩個數(shù)據文件自動生成對應的測試用例愤兵。
image.png
通過功能用例生成測試腳本
在這個過程中,測試用例本身是自然語言排吴,自然語言的解析與處理本身就是大模型非常擅長的工作秆乳。而可以通過 LangChain 簡化整個的實現(xiàn)的過程。
編寫的提示詞模版信息如下所示:
template = """
你是一個自動化測試工程師钻哩,精通的技術棧為 Python pytest requests庫
以下是這個接口的具體信息屹堰,
{context}
Question: {input}"""
通過功能測試用例生成的自動化測試腳本如下所示:
#1. Test case: 正常情況下的請求
import pytest
import 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 pytest
import requests
def test_invalid_request_method():
url = 'http://example.com/invalid_request_method'
response = requests.post(url)
assert response.status_code == 405
# 3. Test case: 無效的請求路徑
import pytest
import requests
def test_invalid_request_path():
url = 'http://example.com/invalid_request_path'
response = requests.get(url)
assert response.status_code == 404
當然,在此過程中可以很明顯的發(fā)現(xiàn)街氢,自動生成的用例是沒有任何的接口信息的扯键。原因是我們給到的數(shù)據里面就是沒有接口信息的。
填充接口數(shù)據
接下來珊肃,將讀取har文件中的接口數(shù)據信息荣刑,和腳本進行結合馅笙。
提示詞模版如下:
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 ChatOpenAI
from langchain_community.document_loaders.text import TextLoader
from langchain_core.output_parsers import JsonOutputParser, StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from 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():
"""
通過大模型生成測試數(shù)據。
:return:
"""
template = """
你是一個自動化測試工程師瞪浸,精通的技術棧為 Python pytest requests庫
以下是這個接口的具體信息儒将,你的
{context}
請求的參數(shù)信息將輸入一個字典,輸入的內容為
{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 = """
根據每條測試用例的測試步驟钩蚊,生成對應的測試數(shù)據信息,
每條測試用例要求都有一條對應的單獨的pytest函數(shù)
"""
print(chain.invoke({"input": input_template}))
if __name__ == '__main__':
get_case()
總結
- 掌握接口自動化測試用例生成的原理蹈矮。
- 了解如何通過大語言模型生成接口自動化測試腳本與數(shù)據砰逻。
- 掌握通過LangChain生成完整版接口自動化測試用例的方法。