Visual Studio Code 中的 Python 測試
Python 擴充套件建立在 VS Code 內建的 測試功能之上,為 Python 內建的 unittest 框架和 pytest 提供測試發現、測試覆蓋率以及執行和除錯測試的功能。
配置測試
當安裝了 Python 擴充套件並在編輯器中打開了 Python 檔案時,VS Code 活動欄會顯示一個測試燒杯圖示,代表 **測試資源管理器** 檢視。如果尚未啟用測試框架,開啟測試資源管理器會顯示一個 **配置 Python 測試** 按鈕。選擇 **配置 Python 測試** 會提示您選擇一個測試框架和一個包含測試的資料夾。如果您使用 unittest,您還需要選擇用於標識測試檔案的檔案 glob 模式。
檔案 glob 模式是一種定義的字串模式,它使用萬用字元根據萬用字元匹配或不匹配檔名或資料夾名。

隨時可以透過 命令面板 使用 **Python: 配置測試** 命令來配置測試,或者透過在設定編輯器或 settings.json 檔案中設定 python.testing.unittestEnabled 或 python.testing.pytestEnabled 來配置,具體描述請參閱 VS Code 設定文件。每個框架也有特定的配置設定,如 測試配置設定 部分所述,用於它們的資料夾和模式。
如果您啟用了 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 的空檔案。
如果測試發現成功,您將在測試資源管理器中看到列出的測試。

當直接從測試資源管理器觸發測試發現時,您還可以取消正在進行的測試發現呼叫。使用 **Cancel** 按鈕,該按鈕在發現期間會替換 **Refresh** 按鈕。

如果發現失敗(例如,測試框架未安裝或您的測試檔案中有語法錯誤),您將在測試資源管理器中看到錯誤訊息,其中包含指向日誌的連結。您可以檢查 **Python** 輸出面板以檢視完整的錯誤訊息(使用 **View** > **Output** 選單命令顯示 **Output** 面板,然後在右側的下拉列表中選擇 **Python**)。

執行測試
您可以使用以下任何操作來執行測試:
-
開啟一個測試檔案,選擇顯示在測試定義行旁邊的裝訂線上的綠色執行圖示,如上一節所示。此命令僅執行該一個方法。

-
從命令面板,透過執行以下任何命令:
- Test: Run All Tests - 執行所有已發現的測試。
- Test: Run Tests in Current File - 執行編輯器中開啟檔案的所有測試。
- Test: Run Test at Cursor - 僅執行編輯器中游標下的測試方法。
-
從 **測試資源管理器**:
-
要執行所有已發現的測試,請選擇“測試資源管理器”頂部的播放按鈕。

-
要執行特定的一組測試或單個測試,請選擇檔案、類或測試,然後選擇該項右側的播放按鈕。

-
您還可以透過測試資源管理器執行選定的測試。為此,請 Ctrl+Click(macOS 上為 Cmd+Click)要執行的測試,右鍵單擊其中一個測試,然後選擇 **Run Test**。
-
測試執行後,VS Code 會直接在編輯器中以裝訂線裝飾的形式顯示結果。失敗的測試也將在編輯器中突出顯示,並帶有“Peek View”,顯示測試執行錯誤訊息以及所有測試執行的歷史記錄。您可以按 Escape 鍵關閉檢視,您可以透過開啟使用者設定(在 **命令面板** 中使用 **Preferences: Open Settings (UI)** 命令)並將 **Testing: Automatically Open Peek View** 設定的值更改為 never 來停用它。
在 **測試資源管理器** 中,會顯示單個測試以及包含這些測試的任何類和檔案的結果。如果資料夾中的任何測試未透過,資料夾將顯示失敗圖示。

VS Code 還在 **測試結果** 面板中顯示測試結果。

執行帶覆蓋率的測試
要執行帶覆蓋率的測試,請選擇測試資源管理器中的覆蓋率執行圖示,或從您通常觸發測試執行的任何選單中選擇 **Run with coverage** 選項。如果您使用 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 的 測試覆蓋率文件。
除錯測試
要除錯測試,請右鍵單擊函式定義旁邊的裝訂線裝飾,然後選擇 **Debug Test**,或選擇測試資源管理器中該測試旁邊的 **Debug Test** 圖示。

執行或除錯測試不會自動儲存測試檔案。在執行測試之前,請務必儲存對測試的更改,否則您很可能會因為結果仍反映檔案的先前版本而感到困惑!
您可以使用命令面板中的以下命令來除錯測試:
- Test: Debug All Tests - 為工作區中的所有測試啟動偵錯程式。
- Test: Debug Tests in Current File - 為您在編輯器中開啟的檔案中定義的測試啟動偵錯程式。
- Test: Debug Test at Cursor - 僅為編輯器中游標所在的方法啟動偵錯程式。您還可以使用測試資源管理器中的 **Debug Test** 圖示來啟動所選範圍和所有已發現測試的偵錯程式。
您還可以透過將 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檔案的路徑。提示:您可以右鍵單擊資源管理器檢視中的檔案並選擇 **Copy Path** 來複制路徑。
- 在專案根目錄下建立一個
- 根據需要,在
settings.json檔案的"python.testing.unittestArgs": []中新增 Django 測試引數,並刪除與 Django 不相容的任何引數。
預設情況下,Python 擴充套件會在專案根目錄下查詢並載入 .env 檔案。如果您的 .env 檔案不在專案根目錄下,或者您正在使用 VS Code 變數替換,請將 "python.envFile": "${workspaceFolder}/<path-to-.env>" 新增到您的 settings.json 檔案中。這使得 Python 擴充套件在執行和發現測試時能夠從該檔案載入環境變數。有關 Python 環境變數的更多資訊。
導航到“測試”檢視,然後選擇 **Refresh Tests** 按鈕,即可顯示您的 Django 測試!
故障排除
如果您的 Django 單元測試未顯示在“測試”檢視中,請嘗試以下故障排除步驟:
- 在 **Python** 輸出面板中搜索錯誤訊息。它們可能提供測試未被發現的原因的線索。
- 嘗試在 終端中執行 Django 測試。然後將相同的命令“翻譯”到 VS Code 設定中。例如,如果您在終端中執行
python manage.py test --arg,您會向.env檔案新增MANAGE_PY_PATH='./manage.py',並在 VS Code 設定中將"python.testing.unittestArgs": [--arg]設定為--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 本身提供,您可以在 VS Code 設定編輯器中搜索“Testing”找到它們。有關更多資訊,請參見 VS Code 設定。
通用 Python 設定
| 設定 (python.testing.) |
預設值 | 描述 |
|---|---|---|
| autoTestDiscoverOnSaveEnabled | true |
指定是在儲存測試檔案時啟用還是停用自動執行測試發現。更改此設定後,您可能需要重新載入窗口才能使其生效。 |
| cwd | null | 指定測試的可選工作目錄。此設定的存在會動態調整 pytest 的 --rootdir 引數。 |
| autoTestDiscoverOnSavePattern | **/*.py |
當 autoTestDiscoverOnSaveEnabled 為 true 時,指定一個 glob 模式來確定哪些檔案更改會觸發自動測試發現。 |
| 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的模式。
要以第一次失敗就停止測試執行,請在引數陣列中新增快速失敗選項 "-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 使用相同的方法訪問正在執行的原始碼。為防止此行為,請在除錯測試時將 --no-cov 包含在 pytestArgs 中,例如,透過將 "env": {"PYTEST_ADDOPTS": "--no-cov"} 新增到您的除錯配置中。(有關如何設定該啟動配置,請參見上面的 除錯測試。)(有關更多資訊,請參見 pytest-cov 文件中的 偵錯程式和 PyCharm。)
IntelliSense 設定
| IntelliSense 設定 (python.analysis.) |
預設值 | 描述 |
|---|---|---|
| inlayHints.pytestParameters | false | 是否顯示 pytest 夾具引數型別的內嵌提示。可接受的值為 true 或 false。 |