本文介紹瞭如何基於開源框架並結合 LLM 構建 AI 代理驅動的自動化測試框架,從而實現更具彈性的自動化測試套件。原文:AI-Native Test Automation is Here
端到端測試是確保軟件質量的最佳實踐,但對許多開發者來説仍是痛點。傳統框架常常導致測試套件脆弱、維護成本高昂。由於依賴特定選擇器,比如 CSS ID,這些選擇器在最小的重構中都可能崩潰,從而導致測試不穩定、開發週期緩慢,需要不斷追趕開發進度。
本文深入探討了構建 AI 代理驅動的現代且具彈性的測試框架,介紹實現這一目標的三個開源組件:browser-use、pytest 和 Allure Report,以及如何將這些方案構建成統一解決方案,該方案被稱為 AgentiTest。
Browser Use: AI 賦能驅動
解決方案的核心是 browser-use,這是一個 Python 庫,使 AI 代理能控制網頁瀏覽器,是將人類語言轉化為機器動作的引擎。
browser-use 協調大語言模型與 Playwright 控制的瀏覽器之間的交互,其運作核心是一個 ReAct(推理與動作) 循環:
- 檢查(Observe):代理檢查當前網頁,將其 DOM 簡化為乾淨且可操作的訪問樹,為所有交互元素提供結構化視圖。
- 推理(Reason):將這個簡化視圖連同高層任務(例如,“找到搜索欄,輸入'Vertex AI',然後按回車”)一起發送給 LLM。LLM 分析上下文,決定下一步執行的最佳動作。
- 行動(Act):代理使用其底層 Playwright 驅動執行 LLM 返回的命令(例如:type_into_element(index=5, text='Vertex AI'))。
這個循環會持續進行,直到代理確認原始任務已完成。browser-use 的一個關鍵功能是其狀態管理。 代理歷史會追蹤每一個動作、LLM 的思考過程、訪問的網址和截圖,提供將在後續報告中使用的審計軌跡。
工作原理
browser-use 允許定義代理,賦予其任務,並用幾行代碼運行:
import asyncio
from browser_use import Agent
from browser_use.llm import ChatGoogle
async def main():
# 通過 task 和 LLM 定義代理
agent = Agent(
task="Go to wikipedia.org and search for the 'Roman Empire'",
llm=ChatGoogle(model="gemini-2.5-pro"),
)
# 執行代理,等待結果
result = await agent.run()
print(result.final_result())
asyncio.run(main())
pytest:結構化測試運行器
browser-use 負責瀏覽器交互, 而 pytest 則為測試提供結構、組織和執行引擎。
一個簡單的 pytest 示例
如果你有一個名為 test_example.py 的文件,pytest 會自動發現並運行其中的測試函數。
# test_example.py 內容
def test_always_passes():
assert 1 == 1
以用這個命令從終端運行:pytest
pytest 關鍵概念
-
固定功能(Fixtures):固定功能是設置(setup)/拆卸(teardown)函數,為 conftest.py 裏的測試提供一致的基線:
llm():函數範圍的固定功能,在整個測試運行中初始化一次ChatGoogle模型。browser_session():函數範圍的固定功能,為每個測試創建新的、隔離的瀏覽器會話,確保測試之間不會相互干擾。
- 依賴注入:pytest 會自動將固定功能的輸出提供給任何將它們列為參數的測試函數,大大簡化了測試設置。
# conftest.py
@pytest.fixture(scope="session")
def llm() -> ChatGoogle:
# ... 初始化邏輯 ...
return ChatGoogle(model=model_name)
# test_community_website.py
async def test_search_for_term(self, llm, browser_session, term):
# llm 和 browser_session 由 pytest 自動提供
...
- 參數化:為避免重複編寫代碼,我們用標記器(marker)運行一個帶有多組輸入的單一測試函數。這非常適合數據驅動場景,比如用單一測試定義測試四個不同鏈路的導航。
# test_community_website.py
@pytest.mark.parametrize(
"link_text, expected_path_segment",
[
("Google Workspace", "google-workspace"),
("AppSheet", "appsheet"),
# ... 更多參數 ...
],
)
async def test_main_navigation(self, llm, browser_session, link_text, expected_path_segment):
# 此測試將針對上述列表中的每個元組分別運行一次
...
Allure Report: 講故事的人
測試運行的質量取決於報告。Allure Report 將原始的成功/失敗輸出轉化為交互式 HTML 儀表盤,講述執行過程中發生的完整故事。
pytest 和 Allure 通過 allure-pytest 插件實現連接。運行 pytest 時,這個插件會作為監聽器,連接到 pytest 的執行生命週期,攔截測試事件(如測試的開始和結束),並解釋 Allure 裝飾器和函數調用。
對於每個事件和附件,Allure 會在 --alluredir 命令行選項指定的目錄中生成對應的 JSON 或附件文件。這個原始結果文件文件夾是 Allure 命令行工具用來生成最終精緻的 HTML 報告的通用數據格式。
Allure 的功能使我們能夠結構化並豐富本報告:
裝飾組織大師:用 Allure 裝飾、組織 pytest 報告:
@allure.feature("Search Functionality"):創建高層次分組。@allure.story("Searching for Terms"""):定義該功能中的用户故事。@allure.title("Search for '{term}'"): 為每個參數化測試用例設置動態標題。
結果附件:報告中包含中間和最終輸出,功能如下:
allure.step():上下文管理器,將一組動作分組為報告中的可摺疊步驟。allure.attach():將富數據(如文本、截圖和網址)附加到當前步驟。
環境上下文:Allure 會在其結果目錄中查找命名 environment.properties 的文件。pytest 固定功能會自動生成該文件,它會在報告中填充上下文,比如操作系統、瀏覽器版本和運行時使用的 LLM。
AgentiTest 架構
剛剛介紹的每個組件都可以集成到端到端架構中:
測試啓動與編排(pytest)
整個流程從開發者開始,他用自然語言編寫測試並執行 pytest 命令。該命令激活 pytest 框架,作為中央編排器,其首要任務是查閲 conftest.py 文件,為諸如 Gemini LLM 實例和瀏覽器會話等工具做好準備,這些固定功能隨後將對所有測試開放。每個測試都提供自然語言任務和預期輸出。
代理執行循環(brower-use)
瀏覽器代理類接管控制,檢查網頁當前狀態並將完整上下文發送給 Gemini 模型。Gemini 處理上下文並返回特定命令,例如 click(selector='text="AppSheet"')。
接着,代理使用 Playwright 執行命令,從而改變目標網站狀態。整個反饋循環持續進行,代理觀察新狀態並將其發送回 LLM 以確定下一步作,直到整個任務完成。
報告與可視化(Allure)
與執行循環並行運行的報告流水線是靜默運行的。allure-pytest 插件連接 pytest 的執行生命週期,監聽測試事件和 Allure 特定命令。
每當代理執行一步,自定義 record_step 鈎子都會捕捉上下文,包括代理的內部“想法”、當前網址和截圖,然後用 allure.attach() 來報告這些信息。
測試結束後,allure serve 命令處理測試工件並渲染 HTML 報告。
谷歌雲社區測試案例
為觀察這些概念如何轉化為現實場景,AgentiTest 倉庫包含示例測試文件 test_community_website.py,該套件測試谷歌雲社區官網,這是個允許用户、合作伙伴和谷歌員工提問並協作的公開論壇。
這些示例測試旨在驗證面向用户的功能,對非技術利益相關者來説直觀易懂。測試套件檢查兩個主要區域:
- 主頁內容:代理通過點擊每個主要導航鏈接(如“Google Workspace”)驗證導航,成功引導用户進入正確的對應頁面。然後確認會員、在線用户和解決方案的關鍵社區統計數據都在頁面上可見。
- 搜索功能:代理會搜索像“BigQuery”這樣的已知詞,並驗證其是否被帶到搜索結果頁面。為了測試非法路徑,代理會尋找隨機且無意義的字符串,確認網站正確顯示“無結果”信息。
如何開始
總體而言,該自動化測試框架效果遠超各部分之和,基於代理的方法讓我們比以往任何時候都更具韌性,所有這些都建立在流行的開源測試工具之上,能夠輕鬆集成到 DevOps 工作流中。
準備好開始了嗎?
- 探索 AgentiTest 框架:克隆源代碼,運行測試,並適配自己的項目。
- 查看谷歌雲社區:看看演示中使用的網站 ,想象一下如何用自然語言編寫測試。
- 從 Google Cloud 和 Gemini 開始:該項目由谷歌 Gemini 模型驅動。要獲得 API 密鑰並開始嘗試,可以先從 Google Cloud 免費套餐開始,該套餐提供免費積分,方便探索各種服務。
你好,我是俞凡,在Motorola做過研發,現在在Mavenir做技術工作,對通信、網絡、後端架構、雲原生、DevOps、CICD、區塊鏈、AI等技術始終保持着濃厚的興趣,平時喜歡閲讀、思考,相信持續學習、終身成長,歡迎一起交流學習。為了方便大家以後能第一時間看到文章,請朋友們關注公眾號"DeepNoMind",並設個星標吧,如果能一鍵三連(轉發、點贊、在看),則能給我帶來更多的支持和動力,激勵我持續寫下去,和大家共同成長進步!
本文由mdnice多平台發佈