在 Visual Studio Code 中進行 Python 測試
Python 擴充套件構建於 VS Code 內建的測試功能之上,為 Python 的內建 unittest 框架和 pytest 提供了測試發現、測試覆蓋率以及執行和除錯測試的功能。
配置測試
當安裝了 Python 擴充套件並且在編輯器中打開了 Python 檔案時,VS Code 的活動欄上會顯示一個測試燒杯圖示,代表測試資源管理器檢視。如果尚未啟用測試框架,開啟測試資源管理器會顯示一個配置 Python 測試按鈕。選擇配置 Python 測試會提示您選擇一個測試框架和一個包含測試的資料夾。如果您使用 unittest,您還需要選擇用於識別測試檔案的檔案 glob 模式。
檔案 glob 模式是一個定義的字串模式,它根據萬用字元來匹配檔案或資料夾名稱,以包含或不包含檔案。
可以隨時透過命令面板中的Python: Configure Tests(Python: 配置測試)命令來配置測試,或者如 VS Code 設定文件中所述,在設定編輯器或 settings.json
檔案中設定 python.testing.unittestEnabled
或 python.testing.pytestEnabled
。每個框架也都有特定的配置設定,詳見測試配置設定中關於其資料夾和模式的描述。
如果您啟用了 pytest,並且它當前未安裝在已啟用的環境中,Python 擴充套件會嘗試在後臺安裝它。此外,如果兩個框架都已啟用,Python 擴充套件將只執行 pytest
。
Python 擴充套件支援的 pytest 最低版本為 7.0.0。
測試發現
預設情況下,一旦您啟用了一個框架,Python 擴充套件就會嘗試發現測試。您可以隨時使用命令面板中的Test: Refresh Tests(測試: 重新整理測試)命令來觸發測試發現。
python.testing.autoTestDiscoverOnSaveEnabled
預設設定為 true
,這意味著每當您在工作區中新增、刪除或更新任何 Python 檔案時,都會自動進行測試發現。要停用此功能,請將該值設定為 false
,這可以在設定編輯器或 settings.json
檔案中完成,如 VS Code 設定文件中所述。您需要重新載入窗口才能使此設定生效。為了更好地控制自動測試發現中包含的檔案,請調整 python.testing.autoTestDiscoverOnSavePattern
設定,該設定預設為 **/*.py
。
測試發現會應用當前框架的發現模式(可以使用測試配置設定進行自定義)。預設行為如下:
-
python.testing.unittestArgs
: 在頂層專案資料夾中查詢任何名稱中包含 "test" 的 Python (.py
) 檔案。所有測試檔案必須是可匯入的模組或包。您可以使用-p
配置設定自定義檔案匹配模式,並使用-t
設定自定義資料夾。 -
python.testing.pytestArgs
: 在當前資料夾及其所有子資料夾中查詢任何名稱以 "test_" 開頭或以 "_test" 結尾的 Python (.py
) 檔案。
有時,位於子資料夾中的測試無法被發現,因為這些測試檔案無法匯入。要使它們可匯入,請在該資料夾中建立一個名為 __init__.py
的空檔案。
如果測試發現成功,您將在測試資源管理器中看到列出的測試:
當直接從測試資源管理器觸發測試發現時,您也可以取消正在進行的測試發現呼叫。使用取消按鈕,該按鈕在發現期間會替換重新整理按鈕。
如果發現失敗(例如,未安裝測試框架或測試檔案中有語法錯誤),您將在測試資源管理器中看到一條錯誤訊息,其中包含指向日誌的連結。您可以檢查 Python 輸出面板以檢視完整的錯誤訊息(使用檢視 > 輸出選單命令顯示輸出面板,然後從右側的下拉選單中選擇 Python)。
執行測試
您可以使用以下任何操作來執行測試:
-
開啟一個測試檔案,選擇顯示在測試定義行旁邊行號槽中的綠色執行圖示,如上一節所示。此命令僅執行該方法。
-
透過執行以下任何命令從命令面板執行:
- Test: Run All Tests(測試: 執行所有測試)- 執行所有已發現的測試。
- Test: Run Tests in Current File(測試: 運行當前檔案中的測試)- 執行在編輯器中開啟的檔案中的所有測試。
- Test: Run Test at Cursor(測試: 執行游標處的測試)- 僅執行編輯器中游標下的測試方法。
-
從測試資源管理器:
-
要執行所有已發現的測試,請選擇測試資源管理器頂部的播放按鈕。
-
要執行特定的測試組或單個測試,請選擇檔案、類或測試,然後選擇該專案右側的播放按鈕。
-
您還可以透過測試資源管理器執行選定的一組測試。為此,請按住 Ctrl+單擊(在 macOS 上為 Cmd+單擊)您希望執行的測試,右鍵單擊其中一個,然後選擇執行測試。
-
測試執行後,VS Code 會以行號槽裝飾的形式直接在編輯器中顯示結果。失敗的測試也會在編輯器中高亮顯示,並帶有一個速覽檢視,顯示測試執行的錯誤訊息和所有測試執行的歷史記錄。您可以按 Escape 關閉該檢視,也可以透過開啟使用者設定(在命令面板中使用首選項: 開啟設定 (UI)命令)並將 Testing: Automatically Open Peek View(測試: 自動開啟速覽檢視)設定的值更改為 never
來停用它。
在測試資源管理器中,會顯示單個測試以及包含這些測試的任何類和檔案的結果。如果資料夾中的任何測試未透過,資料夾將顯示一個失敗圖示。
VS Code 也會在測試結果面板中顯示測試結果。
帶覆蓋率執行測試
要啟用覆蓋率來執行測試,請選擇測試資源管理器中的覆蓋率執行圖示,或從任何您通常觸發測試執行的選單中選擇帶覆蓋率執行選項。如果您使用的是 pytest,Python 擴充套件會使用 pytest-cov
外掛執行覆蓋率測試;對於 unittest,則使用 coverage.py
。
在帶覆蓋率執行測試之前,請確保為您的專案安裝了正確的測試覆蓋率包。分支覆蓋率僅在 coverage 版本 >= 7.7 時支援。
覆蓋率執行完成後,編輯器中的程式碼行會根據行級覆蓋率高亮顯示。測試覆蓋率結果會作為“測試覆蓋率”子選項卡出現在測試資源管理器中,您也可以透過命令面板中的Testing: Focus on Test Coverage View(測試: 聚焦於測試覆蓋率檢視)(⇧⌘P(Windows、Linux 為 Ctrl+Shift+P))導航到該面板。在此面板上,您可以檢視工作區中每個檔案和資料夾的行覆蓋率指標,以及相關的分支覆蓋率。
為了在使用 pytest 時更精細地控制您的覆蓋率執行,您可以編輯 python.testing.pytestArgs
設定以包含您的規範。當 pytest 引數 --cov
存在於 python.testing.pytestArgs
中時,Python 擴充套件將不會對覆蓋率引數進行額外編輯,以使您的自定義生效。如果沒有找到 --cov
引數,擴充套件將在執行前向 pytest 引數新增 --cov=.
,以在工作區根目錄啟用覆蓋率。
有關測試覆蓋率的更多資訊,請訪問 VS Code 的測試覆蓋率文件。
除錯測試
要除錯測試,請右鍵單擊函式定義旁邊的行號槽裝飾,然後選擇除錯測試,或選擇測試資源管理器中該測試旁邊的除錯測試圖示。
執行或除錯測試不會自動儲存測試檔案。在執行測試之前,請務必儲存對測試的更改,否則您可能會對結果感到困惑,因為它們仍然反映的是檔案的先前版本!
您可以使用命令面板中的以下命令來除錯測試:
- Test: Debug All Tests(測試: 除錯所有測試)- 為您工作區中的所有測試啟動偵錯程式。
- Test: Debug Tests in Current File(測試: 除錯當前檔案中的測試)- 為您在編輯器中開啟的檔案中定義的測試啟動偵錯程式。
- Test: Debug Test at Cursor(測試: 除錯游標處的測試)- 僅為編輯器中游標所在的測試方法啟動偵錯程式。您還可以使用測試資源管理器中的除錯測試圖示來為選定範圍內的所有測試和所有已發現的測試啟動偵錯程式。
您還可以透過在您的 settings.json
檔案中將 testing.defaultGutterClickAction
設定的值更改為 debug
,來更改單擊行號槽裝飾的預設行為,使其變為除錯測試而不是執行測試。
偵錯程式對測試的工作方式與其他 Python 程式碼相同,包括斷點、變數檢查等。要自定義除錯測試的設定,您可以在工作區 .vscode
資料夾的 launch.json
或 settings.json
檔案中指定測試除錯配置,方法是向您的配置中新增 "purpose": ["debug-test"]
。當您執行Test: Debug All Tests(測試: 除錯所有測試)、Test: Debug Tests in Current File(測試: 除錯當前檔案中的測試)和Test: Debug Test at Cursor(測試: 除錯游標處的測試)命令時,將使用此配置。
例如,下面 launch.json
檔案中的配置停用了用於除錯測試的 justMyCode
設定:
{
"name": "Python: Debug Tests",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"purpose": ["debug-test"],
"console": "integratedTerminal",
"justMyCode": false
}
如果您有多個帶有 "purpose": ["debug-test"]
的配置條目,將使用第一個定義,因為我們目前不支援此請求型別的多個定義。
有關除錯的更多資訊或瞭解其在 VS Code 中的工作原理,請閱讀 Python 除錯配置和通用的 VS Code 除錯文章。
並行執行測試
透過 pytest-xdist
包支援並行執行 pytest 測試。請訪問他們的文件,瞭解有關如何使用 pytest-xdist
的更多資訊。
當啟用 xdist
且引數中未指定工作程序數時,Python 擴充套件會根據測試資源管理器中選擇的測試數量自動最佳化工作程序數。
Django 單元測試
Python 擴充套件還支援發現和執行 Django 單元測試!只需幾個額外的設定步驟,您就可以發現您的 Django 測試:
- 在您的
settings.json
檔案中設定"python.testing.unittestEnabled": true,
。 - 將
MANAGE_PY_PATH
新增為環境變數:- 在您的專案根目錄下建立一個
.env
檔案。 - 將
MANAGE_PY_PATH='<path-to-manage.py>'
新增到.env
檔案中,將<path-to-manage.py>
替換為您應用程式的manage.py
檔案的路徑。提示:您可以透過在資源管理器檢視中右鍵單擊檔案並選擇複製路徑來複制路徑。
- 在您的專案根目錄下建立一個
- 根據需要,將 Django 測試引數新增到
settings.json
檔案中的"python.testing.unittestArgs": []
,並移除任何與 Django 不相容的引數。
預設情況下,Python 擴充套件會在專案根目錄查詢並載入 .env
檔案。如果您的 .env
檔案不在專案根目錄,或者您正在使用 VS Code 變數替換,請將 "python.envFile": "${workspaceFolder}/<path-to-.env>"
新增到您的 settings.json
檔案中。這使得 Python 擴充套件在執行和發現測試時能夠從此檔案載入環境變數。獲取有關Python 環境變數的更多資訊。
導航到測試檢視,然後選擇重新整理測試按鈕,您的 Django 測試就會顯示出來!
故障排除
如果您的 Django 單元測試未在測試檢視中顯示,請嘗試以下故障排除步驟:
- 在 Python 輸出面板中搜索錯誤訊息。它們可能會提供關於為什麼您的測試未被發現的線索。
- 嘗試在終端中執行 Django 測試。然後將相同的命令“轉換”為 VS Code 設定。例如,如果您在終端中執行
python manage.py test --arg
,您將在.env
檔案中新增MANAGE_PY_PATH='./manage.py'
,並在 VS Code 設定中設定"python.testing.unittestArgs": ["--arg"]
。或者,您也可以在 Python 輸出面板中找到 Python 擴充套件執行的命令。 - 如果您最初使用的是相對路徑,請在設定
MANAGE_PY_PATH
環境變數時使用manage.py
檔案的絕對路徑。
測試命令
以下是 VS Code 中 Python 擴充套件支援的所有測試命令。這些都可以透過命令面板找到:
命令名稱 | 描述 |
---|---|
Python: Configure Tests | 配置要與 Python 擴充套件一起使用的測試框架。 |
Test: Clear All Results | 清除所有測試狀態,因為 UI 會在會話之間持久化測試結果。 |
Test: Debug All Tests | 除錯所有已發現的測試。相當於 2021.9 版本之前的 Python: Debug All Tests。 |
Test: Debug Failed Tests | 除錯在最近一次測試執行中失敗的測試。 |
Test: Debug Last Run | 除錯在最近一次測試執行中執行的測試。 |
Test: Debug Test at Cursor | 除錯編輯器中游標所在的測試方法。類似於 2021.9 版本之前的 Python: Debug Test Method...。 |
Test: Debug Tests in Current File | 除錯當前編輯器中處於焦點狀態的檔案中的測試。 |
Test: Go to Next Test Failure | 如果錯誤速覽檢視已開啟,則開啟並移動到資源管理器中下一個失敗測試的速覽檢視。 |
Test: Go to Previous Test Failure | 如果錯誤速覽檢視已開啟,則開啟並移動到資源管理器中上一個失敗測試的速覽檢視。 |
Test: Peek Output | 為失敗的測試方法開啟錯誤速覽檢視。 |
Test: Refresh Tests | 執行測試發現並更新測試資源管理器以反映任何測試的更改、新增或刪除。類似於 2021.9 版本之前的 Python: Discover Tests。 |
Test: Rerun Failed Tests | 執行在最近一次測試執行中失敗的測試。類似於 2021.9 版本之前的 Python: Run Failed Tests。 |
Test: Rerun Last Run | 除錯在最近一次測試執行中執行的測試。 |
Test: Run All Tests | 執行所有已發現的測試。相當於 2021.9 版本之前的 Python: Run All Tests。 |
Test: Run All Tests with Coverage | 執行所有已發現的測試並計算您的程式碼被測試覆蓋的程度。 |
Test: Run Test at Cursor | 執行編輯器中游標所在的測試方法。類似於 2021.9 版本之前的 Python: Run Test Method...。 |
Test: Run Test in Current File | 運行當前編輯器中處於焦點狀態的檔案中的測試。相當於 2021.9 版本之前的 Python: Run Current Test File。 |
Test: Show Output | 開啟包含所有測試執行詳細資訊的輸出。類似於 2021.9 版本之前的 Python: Show Test Output。 |
Testing: Focus on Test Explorer View | 開啟測試資源管理器檢視。類似於 2021.9 版本之前的 Testing: Focus on Python View。 |
Test: Stop Refreshing Tests | 取消測試發現。 |
測試配置設定
Python 測試的行為由 VS Code 提供的通用 UI 設定以及特定於 Python 和您已啟用的任何框架的設定驅動。
通用 UI 設定
影響測試功能 UI 的設定由 VS Code 本身提供,當您搜尋“Testing”時,可以在 VS Code 設定編輯器中找到它們。
通用 Python 設定
設定 (python.testing.) |
預設值 | 描述 |
---|---|---|
autoTestDiscoverOnSaveEnabled | true |
指定在儲存測試檔案時是啟用還是停用自動執行測試發現。更改此設定後,您可能需要重新載入窗口才能使其生效。 |
cwd | null | 為測試指定一個可選的工作目錄。此設定的存在會動態調整 pytest 的 --rootdir 引數。 |
autoTestDiscoverOnSavePattern | **/*.py |
指定一個 glob 模式,當 autoTestDiscoverOnSaveEnabled 為 true 時,該模式決定了哪些檔案更改會觸發自動測試發現。 |
debugPort | 3000 |
用於除錯 unittest 測試的埠號。 |
promptToConfigure | true |
指定如果發現潛在的測試,VS Code 是否提示配置測試框架。 |
unittest 配置設定
Unittest 設定 (python.testing.) |
預設值 | 描述 |
---|---|---|
unittestEnabled | false |
指定是否啟用 unittest 作為測試框架。pytest 的相應設定應被停用。 |
unittestArgs | ["-v", "-s", ".", "-p", "*test*.py"] |
傳遞給 unittest 的引數,其中每個用空格分隔的元素都是列表中的一個獨立項。有關預設值的描述,請參見下文。 |
unittest 的預設引數如下:
-v
設定預設詳細程度。移除此引數可獲得更簡潔的輸出。-s .
指定發現測試的起始目錄。如果您的測試在“test”資料夾中,請將引數更改為-s test
(在引數陣列中意為"-s", "test"
)。-p *test*.py
是用於查詢測試的發現模式。在這種情況下,它是任何包含“test”一詞的.py
檔案。如果您以不同方式命名測試檔案,例如在每個檔名後附加“_test”,則在陣列的相應引數中使用類似*_test.py
的模式。
要在第一次失敗時停止測試執行,請將 fail fast 選項 "-f"
新增到引數陣列中。
有關所有可用選項的完整集合,請參閱 unittest 命令列介面。
pytest 配置設定
pytest 設定 (python.testing.) |
預設值 | 描述 |
---|---|---|
pytestEnabled | false |
指定是否啟用 pytest 作為測試框架。unittest 的相應設定應被停用。 |
pytestPath | "pytest" |
pytest 的路徑。如果 pytest 位於當前環境之外,請使用完整路徑。 |
pytestArgs | [] |
傳遞給 pytest 的引數,其中每個用空格分隔的元素都是列表中的一個獨立項。請參閱 pytest 命令列選項。 |
pytest 的預設引數如下:
rootdir
根據工作區中是否存在python.testing.cwd
設定進行動態調整。
您還可以使用 pytest.ini
檔案來配置 pytest,如 pytest 配置中所述。
如果您安裝了 pytest-cov 覆蓋率模組,VS Code 在除錯時不會在斷點處停止,因為 pytest-cov 使用相同的技術來訪問正在執行的原始碼。為防止此行為,請在除錯測試時在 pytestArgs
中包含 --no-cov
,例如,透過在您的除錯配置中新增 "env": {"PYTEST_ADDOPTS": "--no-cov"}
。(有關如何設定該啟動配置,請參閱上文的除錯測試。)(更多資訊,請參閱 pytest-cov 文件中的偵錯程式和 PyCharm。)
IntelliSense 設定
IntelliSense 設定 (python.analysis.) |
預設值 | 描述 |
---|---|---|
inlayHints.pytestParameters | false | 是否顯示 pytest fixture 引數型別的內聯提示。接受的值為 true 或 false 。 |