基于LangChain手工測試用例轉接口自動化測試生成工具

接口自動化測試用例是一個老生常談的問題,在未引入人工智能之前跌造,也有非常多的生成方案杆怕,比如如下所示,通過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()

總結

  1. 掌握接口自動化測試用例生成的原理蹈矮。
  2. 了解如何通過大語言模型生成接口自動化測試腳本與數(shù)據砰逻。
  3. 掌握通過LangChain生成完整版接口自動化測試用例的方法。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末泛鸟,一起剝皮案震驚了整個濱河市蝠咆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌北滥,老刑警劉巖刚操,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異再芋,居然都是意外死亡菊霜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門济赎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鉴逞,“玉大人记某,你說我怎么就攤上這事」辜瘢” “怎么了液南?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叭喜。 經常有香客問我贺拣,道長,這世上最難降的妖魔是什么捂蕴? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任譬涡,我火速辦了婚禮,結果婚禮上啥辨,老公的妹妹穿的比我還像新娘涡匀。我一直安慰自己,他們只是感情好溉知,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布陨瘩。 她就那樣靜靜地躺著,像睡著了一般级乍。 火紅的嫁衣襯著肌膚如雪舌劳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天玫荣,我揣著相機與錄音甚淡,去河邊找鬼。 笑死捅厂,一個胖子當著我的面吹牛贯卦,可吹牛的內容都是我干的。 我是一名探鬼主播焙贷,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼撵割,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辙芍?” 一聲冷哼從身側響起啡彬,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎故硅,沒想到半個月后沼死,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渠羞,經...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡湖员,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年屑迂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捐晶。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡菲语,死狀恐怖妄辩,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情山上,我是刑警寧澤眼耀,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站佩憾,受9級特大地震影響哮伟,放射性物質發(fā)生泄漏。R本人自食惡果不足惜妄帘,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一楞黄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抡驼,春花似錦鬼廓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馏锡,卻和暖如春雷蹂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杯道。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工萎河, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蕉饼。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像玛歌,于是被迫代替她去往敵國和親昧港。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內容