基于 LangChain 的自動化測試用例的生成與執(zhí)行

在前面的章節(jié)中悼嫉,分別介紹了 Web、App回还、接口自動化測試用例的生成裆泳。但是在前文中實現(xiàn)的效果均為在控制臺打印自動化測試的用例。用例需要手動粘貼柠硕,調(diào)整之后再執(zhí)行工禾。

那么其實這個手動粘貼、執(zhí)行的過程蝗柔,也是可以直接通過人工智能完成的闻葵。

應(yīng)用價值

  • 通過人工智能代替人工操作的部分,節(jié)省時間癣丧,提升效率槽畔。
  • 通過封裝更多的 Tools,讓 Agent 更為智能坎缭。

實踐演練

實現(xiàn)原理

image.png

實現(xiàn)思路

在理解需求之后竟痰,我們可以了解到我們需要讓 Agent 具備兩個功能:

  1. 輸入源碼信息,生成 python 文件掏呼。
  2. 輸入文件名坏快,執(zhí)行 pytest 測試文件功能。

如此憎夷,可以通過如下兩個步驟實現(xiàn)需求:

  1. 工具包封裝莽鸿。
  2. 實現(xiàn) Agent。
工具包封裝

為了讓工具包更易被大模型理解拾给,我們將注釋調(diào)整為英文祥得,提升準(zhǔn)確率。同時為了傳參的時候不出現(xiàn)格式錯誤問題蒋得,通過args_schema限制參數(shù)結(jié)構(gòu)與格式(tools 章節(jié)有具體講解)级及。


from langchain_core.tools import tool
from pydantic.v1 import BaseModel, Field

class PythonFileInput(BaseModel):
    # 定義參數(shù)的描述
    filename: str = Field(description="filename")
    source_code: str = Field(description="source code data")

class PytestFileName(BaseModel):
    # 定義參數(shù)的描述
    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模塊執(zhí)行pytest命令
    result = subprocess.run(['pytest', filename], capture_output=True, text=True)
    # 檢查pytest的執(zhí)行結(jié)果
    if result.returncode == 0:
        print("測試運行成功!")
    else:
        print("測試運行失敹钛谩:")
    print(result.stdout)
    return result.stdout

通過 AGENT 實現(xiàn)需求
  1. 首先封裝 Agent饮焦,綁定工具,輸入提示詞窍侧。在示例中县踢,是在 LangChain 官方提供的 structured-chat-agent提示詞基礎(chǔ)之上修改的提示詞,添加了一個code變量伟件。目的是為了后面 code 可以由其他的 chain 的執(zhí)行結(jié)果而來硼啤。

#  注意:需要再原提示詞的基礎(chǔ)上添加 {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": "請根據(jù)以上源碼生成文件", "code": """def test_demo(): return True"""})

由以上的步驟,即可生成一個源碼文件:

image.png
  1. 在生成源碼文件后斧账,可以繼續(xù)補充提示詞谴返,要求Agent 執(zhí)行對應(yīng)的測試用例:
if __name__ == '__main__':
    agent_executor.invoke({"input": """
               請根據(jù)以下步驟完成我讓你完成操作煞肾,沒有完成所有步驟不能停止:
                1. 先根據(jù)以上源碼生成文件。
                2. 根據(jù)上一步生成的源碼文件嗓袱,進(jìn)行執(zhí)行測試用例操作扯旷,并返回終的執(zhí)行結(jié)果
                """,
               "code": """def test_demo(): return True"""})
image.png

到這里,通過 Agent 就能自動生成測試用例文件索抓,執(zhí)行測試用例了。

與其他的場景結(jié)合

在前面的章節(jié)中毯炮,已經(jīng)實現(xiàn)了自動生成接口自動化測試用例的操作逼肯。可以直接與前面的操作結(jié)合桃煎,自動生成接口自動化測試用例篮幢,并執(zhí)行測試用用例。

注意:load_case 如何實現(xiàn)在前面章節(jié):《基于LangChain手工測試用例轉(zhuǎn)接口自動化測試生成工具》为迈,已有對應(yīng)講解

# load_case 的返回結(jié)果是接口的自動化測試用例
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": """
               請根據(jù)以下步驟完成我讓你完成操作三椿,沒有完成所有步驟不能停止:
                1. 先根據(jù)以上源碼生成文件。
                2. 根據(jù)上一步生成的源碼文件葫辐,進(jìn)行執(zhí)行測試用例操作搜锰,并返回終的執(zhí)行結(jié)果
                """})

執(zhí)行之后,即可在控制臺看到生成的接口自動化測試用例的執(zhí)行記錄耿战。

image.png

總結(jié)

  1. 自動化測試用例的生成與執(zhí)行的實現(xiàn)原理蛋叼。
  2. 自動化測試用例的生成與執(zhí)行的實現(xiàn)思路。
  3. 利用 Agent 實現(xiàn)自動化測試用例的生成與執(zhí)行剂陡。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狈涮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸭栖,更是在濱河造成了極大的恐慌歌馍,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晕鹊,死亡現(xiàn)場離奇詭異松却,居然都是意外死亡,警方通過查閱死者的電腦和手機捏题,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門玻褪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人公荧,你說我怎么就攤上這事带射。” “怎么了循狰?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵窟社,是天一觀的道長券勺。 經(jīng)常有香客問我,道長灿里,這世上最難降的妖魔是什么关炼? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮匣吊,結(jié)果婚禮上儒拂,老公的妹妹穿的比我還像新娘。我一直安慰自己色鸳,他們只是感情好社痛,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著命雀,像睡著了一般蒜哀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吏砂,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天撵儿,我揣著相機與錄音,去河邊找鬼狐血。 笑死淀歇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的氛雪。 我是一名探鬼主播房匆,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼报亩!你這毒婦竟也來了浴鸿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弦追,失蹤者是張志新(化名)和其女友劉穎岳链,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劲件,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡掸哑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了零远。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苗分。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖牵辣,靈堂內(nèi)的尸體忽然破棺而出摔癣,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布择浊,位于F島的核電站戴卜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琢岩。R本人自食惡果不足惜投剥,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望担孔。 院中可真熱鬧江锨,春花似錦、人聲如沸糕篇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娩缰。三九已至,卻和暖如春谒府,著一層夾襖步出監(jiān)牢的瞬間拼坎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工完疫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泰鸡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓壳鹤,卻偏偏與公主長得像盛龄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芳誓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容