作者:麻省大學阿默斯特分校等離子體實驗室的 Juan Altmayer Pizzorno 和 Emery Berger。
CoverUp 自動產生測試,確保測試更多程式碼(即增加程式碼覆蓋率)。如果您還沒有測試套件,CoverUp 還可以從頭開始建立測試套件。新測試基於您的程式碼,這使得它們對於回歸測試非常有用。
CoverUp 旨在與 pytest 測試框架緊密配合。為了產生測試,它首先使用 SlipCover 測量套件的覆蓋範圍。然後,它選擇需要更多測試的程式碼部分(即未發現的程式碼)。然後,CoverUp 與法學碩士進行對話,提示進行測試,檢查結果以驗證它們是否運行並增加覆蓋範圍(再次使用 SlipCover),並根據需要重新提示進行調整。最後,CoverUp 選擇性地檢查新測試是否整合良好,並嘗試解決它發現的任何問題。
有關技術細節和完整評估,請參閱我們的 arXiv 論文CoverUp:基於覆蓋率的 LLM 測試生成(PDF)。
CoverUp 可從 PyPI 取得,因此您只需使用以下命令即可安裝
$ python3 -m pip install coverup
CoverUp 可與 OpenAI、Anthropic 或 AWS Bedrock 模型一起使用;它要求將存取詳細資訊分別定義為 shell 環境變數: OPENAI_API_KEY
、 ANTHROPIC_API_KEY
或AWS_ACCESS_KEY_ID
/ AWS_SECRET_ACCESS_KEY
/ AWS_REGION_NAME
。
例如,對於 OpenAI,您將建立一個帳戶,確保其有正餘額,然後建立一個 API 金鑰,將其「秘密金鑰」(通常以sk-
開頭的字串)儲存在名為OPENAI_API_KEY
的環境變數中:
$ export OPENAI_API_KEY= < ...your-api-key... >
如果您的模組名為mymod
,其原始程式碼位於src
下且測試位於tests
下,您可以執行 CoverUp 作為
$ coverup --source-dir src/mymod --tests-dir tests
然後,CoverUp 在tests
目錄下建立名為test_coverup_N.py
的測試,其中N
是數字。
在這裡,我們讓 CoverUp 為流行的 Flask 套件創建了額外的測試:
$ coverup --package src/flask --tests tests
Measuring coverage... 90.9%
Prompting gpt-4o-2024-05-13 for tests to increase coverage...
(in the following, G=good, F=failed, U=useless and R=retry)
100%|███████████████████████████████████████| 92/92 [01:01<00:00, 1.50it/s, G=55, F=122, U=20, R=0, cost=~$4.19]
Measuring coverage... 94.4%
$
在短短一分多鐘的時間內,CoverUp 將 Flask 的測試覆蓋率從 90.9% 提高到 94.4%。
在評估每個新產生的測試時,CoverUp 會執行多次它,以嘗試偵測任何不穩定的測試;可使用--repeat-tests
和--no-repeat-tests
選項進行調整。如果 CoverUp 偵測到新產生的測試不穩定,它會提示法學碩士進行更正。
CoverUp 僅向套件新增測試,這些測試在單獨執行時會通過並增加覆蓋率。然而,測試可能會「污染」狀態,以導致其他測試失敗的方式改變它。預設情況下,CoverUp 使用 pytest-cleanslate 外掛程式隔離測試,解決任何(記憶體中)測試污染;可以透過傳入--no-isolate-tests
選項來停用它。也可以要求 CoverUp 尋找並停用污染測試模組或功能( --disable-polluting
)或簡單地停用任何失敗的測試(``--disable-failing`)。
為了評估 LLM 產生的測試,CoverUp 必須執行它們。為了獲得最佳安全性並最大限度地降低系統損壞的風險,我們建議使用 Docker 來執行 CoverUp。
該圖顯示了 CoverUp 與 CodaMosa 的比較,CodaMosa 是基於 Pynguin 測試生成器的最先進的基於搜尋的測試產生器。對於此實驗,CoverUp 和 CodaMosa 都「從頭開始」創建測試,即忽略任何現有的測試套件。長條圖顯示了 CoverUp 和 CodaMosa 對於各種 Python 模組的覆蓋百分比差異;高於 0 的綠色條表示 CoverUp 實現了更高的覆蓋率。
如圖所示,對於大多數模組,CoverUp 的覆蓋率高於 CodaMosa。
這是 CoverUp 的早期版本。請享受它,並在我們努力改進它的過程中原諒任何干擾。我們歡迎錯誤報告、體驗報告和功能請求(請提出問題)。