基於 LangChain 的自動化測試用例的生成與執行

霍格沃兹测试开发学社發表於2024-09-27

在前面的章節中,分別介紹了 Web、App、介面自動化測試用例的生成。但是在前文中實現的效果均為在控制檯列印自動化測試的用例。用例需要手動貼上,調整之後再執行。

那麼其實這個手動貼上、執行的過程,也是可以直接透過人工智慧完成的。

應用價值

  • 透過人工智慧代替人工操作的部分,節省時間,提升效率。
  • 透過封裝更多的 Tools,讓 Agent 更為智慧。

實踐演練

實現原理

實現思路

在理解需求之後,我們可以瞭解到我們需要讓 Agent 具備兩個功能:

  1. 輸入原始碼資訊,生成 python 檔案。
  2. 輸入檔名,執行 pytest 測試檔案功能。

如此,可以透過如下兩個步驟實現需求:

  1. 工具包封裝。
  2. 實現 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 實現需求
  1. 首先封裝 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"""})

由以上的步驟,即可生成一個原始碼檔案:

  1. 在生成原始碼檔案後,可以繼續補充提示詞,要求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. 根據上一步生成的原始碼檔案,進行執行測試用例操作,並返回終的執行結果
                """})

執行之後,即可在控制檯看到生成的介面自動化測試用例的執行記錄。

總結

  1. 自動化測試用例的生成與執行的實現原理。
  2. 自動化測試用例的生成與執行的實現思路。
  3. 利用 Agent 實現自動化測試用例的生成與執行。

相關文章