在前面的章節中,分別介紹了 Web、App、介面自動化測試用例的生成。但是在前文中實現的效果均為在控制檯列印自動化測試的用例。用例需要手動貼上,調整之後再執行。
那麼其實這個手動貼上、執行的過程,也是可以直接透過人工智慧完成的。
應用價值
- 透過人工智慧代替人工操作的部分,節省時間,提升效率。
- 透過封裝更多的 Tools,讓 Agent 更為智慧。
實踐演練
實現原理
實現思路
在理解需求之後,我們可以瞭解到我們需要讓 Agent 具備兩個功能:
- 輸入原始碼資訊,生成 python 檔案。
- 輸入檔名,執行 pytest 測試檔案功能。
如此,可以透過如下兩個步驟實現需求:
- 工具包封裝。
- 實現 Agent。
工具包封裝
為了讓工具包更易被大模型理解,我們將註釋調整為英文,提升準確率。同時為了傳參的時候不出現格式錯誤問題,透過args_schema
限制引數結構與格式(tools 章節有具體講解)。
from langchain_core.tools import tool
from pydantic.v1 import BaseModel, Field
class PythonFileInput(BaseModel):
# 定義引數的描述
filename: str = Field(description="filename")
source_code: str = Field(description="source code data")
class PytestFileName(BaseModel):
# 定義引數的描述
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模組執行pytest命令
result = subprocess.run(['pytest', filename], capture_output=True, text=True)
# 檢查pytest的執行結果
if result.returncode == 0:
print("測試執行成功!")
else:
print("測試執行失敗:")
print(result.stdout)
return result.stdout
透過 AGENT 實現需求
- 首先封裝 Agent,繫結工具,輸入提示詞。在示例中,是在 LangChain 官方提供的
structured-chat-agent
提示詞基礎之上修改的提示詞,新增了一個code
變數。目的是為了後面 code 可以由其他的 chain 的執行結果而來。
# 注意:需要再原提示詞的基礎上新增 {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": "請根據以上原始碼生成檔案", "code": """def test_demo(): return True"""})
由以上的步驟,即可生成一個原始碼檔案:
- 在生成原始碼檔案後,可以繼續補充提示詞,要求Agent 執行對應的測試用例:
if __name__ == '__main__':
agent_executor.invoke({"input": """
請根據以下步驟完成我讓你完成操作,沒有完成所有步驟不能停止:
1. 先根據以上原始碼生成檔案。
2. 根據上一步生成的原始碼檔案,進行執行測試用例操作,並返回終的執行結果
""",
"code": """def test_demo(): return True"""})
到這裡,透過 Agent 就能自動生成測試用例檔案,執行測試用例了。
與其他的場景結合
在前面的章節中,已經實現了自動生成介面自動化測試用例的操作。可以直接與前面的操作結合,自動生成介面自動化測試用例,並執行測試用用例。
注意:load_case 如何實現在前面章節:《基於LangChain手工測試用例轉介面自動化測試生成工具》,已有對應講解
# load_case 的返回結果是介面的自動化測試用例
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": """
請根據以下步驟完成我讓你完成操作,沒有完成所有步驟不能停止:
1. 先根據以上原始碼生成檔案。
2. 根據上一步生成的原始碼檔案,進行執行測試用例操作,並返回終的執行結果
"""})
執行之後,即可在控制檯看到生成的介面自動化測試用例的執行記錄。
總結
- 自動化測試用例的生成與執行的實現原理。
- 自動化測試用例的生成與執行的實現思路。
- 利用 Agent 實現自動化測試用例的生成與執行。