在 Visual Studio Code 中進行 Python 測試

Python 擴充功能建立在 VS Code 內建的 測試功能之上,並為 Python 內建的 unittest 框架以及 pytest 提供測試探索、測試覆蓋率,以及執行與偵錯測試的功能。

設定測試

當安裝了 Python 擴充功能且在編輯器中開啟 Python 檔案時,VS Code 活動列上會顯示一個燒杯圖示,代表測試總管 (Test Explorer) 檢視。如果尚未啟用測試框架,開啟測試總管會顯示設定 Python 測試 (Configure Python Tests) 按鈕。選擇設定 Python 測試會提示您選擇測試框架以及包含測試的資料夾。如果您使用 unittest,還需要選擇用於識別測試檔案的檔案 glob 模式。

注意

檔案 glob 模式是一種定義好的字串模式,根據萬用字元來比對檔案或資料夾名稱,以決定是否包含某些檔案。

Configure Python Tests button displayed in the Test Explorer when tests haven't been configured.

您可以隨時透過命令選擇區 (Command Palette) 使用 Python: Configure Tests 命令,或按照 VS Code 設定 (Settings) 文件所述,在設定編輯器或 settings.json 檔案中設定 python.testing.unittestEnabledpython.testing.pytestEnabled 來設定測試。如 測試組態設定 所述,每個框架也針對其資料夾和模式有特定的組態設定。

如果您啟用 pytest 但目前啟用的環境中尚未安裝它,Python 擴充功能會嘗試在背景安裝。此外,如果兩個框架都已啟用,Python 擴充功能將僅執行 pytest

注意

Python 擴充功能支援的 pytest 最低版本為 7.0.0。

測試探索

依預設,Python 擴充功能會在您啟用框架後嘗試探索測試。您隨時可以使用命令選擇區中的 Test: Refresh Tests 命令來觸發測試探索。

提示

python.testing.autoTestDiscoverOnSaveEnabled 預設設為 true,這意味著每當您在工作區中新增、刪除或更新任何 Python 檔案時,都會自動進行測試探索。若要停用此功能,請依照 VS Code 設定 (Settings) 文件所述,在設定編輯器或 settings.json 檔案中將值設為 false。您需要重新載入視窗以使此設定生效。若要進一步控制自動測試探索中包含的檔案,請調整 python.testing.autoTestDiscoverOnSavePattern 設定(預設為 **/*.py)。

測試探索會對目前框架套用探索模式(可使用 測試組態設定 進行自訂)。預設行為如下:

  • python.testing.unittestArgs:在專案頂層資料夾中尋找名稱中包含 "test" 的任何 Python (.py) 檔案。所有測試檔案必須是可匯入的模組或套件。您可以使用 -p 組態設定自訂檔案比對模式,並使用 -t 設定自訂資料夾。

  • python.testing.pytestArgs:在目前資料夾及其所有子資料夾中的任何位置,尋找名稱以 "test_" 開頭或以 "_test" 結尾的任何 Python (.py) 檔案。

提示

有時放置在子資料夾中的測試無法被探索,因為這些測試檔案無法被匯入。若要使其可匯入,請在該資料夾中建立一個名為 __init__.py 的空白檔案。

如果測試探索成功,您將會在測試總管中看到測試清單。

The VS Code Test Explorer for Python tests

當直接從測試總管觸發測試探索時,您也可以取消正在進行的測試探索呼叫。請使用取消 (Cancel) 按鈕,該按鈕會在探索期間取代重新整理 (Refresh) 按鈕。

Cancel test discovery button in the Test Explorer.

如果探索失敗(例如未安裝測試框架,或測試檔案中有語法錯誤),您會在測試總管中看到錯誤訊息,其中包含指向記錄的連結。您可以檢查 Python 輸出面板以查看完整的錯誤訊息(使用檢視 (View) > 輸出 (Output) 功能表命令顯示輸出面板,然後從右側下拉式選單中選擇 Python)。

Discovery failure error messaged displayed in the Test Explorer

執行測試

您可以使用下列任何動作來執行測試:

  • 開啟測試檔案後,點選測試定義行旁裝訂邊 (gutter) 顯示的綠色執行圖示(如上一節所示)。此命令僅執行該特定方法。

    Run test icon displayed on the gutter when the test file is open in the editor

  • 從命令選擇區執行下列任何命令:

    • Test: Run All Tests - 執行所有已探索的測試。
    • Test: Run Tests in Current File - 執行編輯器中開啟的檔案內的所有測試。
    • Test: Run Test at Cursor - 僅執行編輯器中游標所在位置的測試方法。
  • 測試總管

    • 若要執行所有已探索的測試,請選取測試總管頂部的播放按鈕。

      Running all tests through Test Explorer

    • 若要執行特定的一組測試或單一測試,請選取該檔案、類別或測試,然後選取該項目右側的播放按鈕。

      Running tests at specific scopes through Test Explorer

    • 您也可以透過測試總管執行選定的測試。若要執行此操作,請按住 Ctrl+點擊(在 macOS 上為 Cmd+點擊)選取您要執行的測試,對其中一個按右鍵,然後選擇執行測試 (Run Test)

測試執行後,VS Code 會直接在編輯器中以裝訂邊裝飾顯示結果。失敗的測試也會在編輯器中反白顯示,並提供一個 Peek View,顯示測試執行錯誤訊息以及所有測試執行的歷史記錄。您可以按 Escape 關閉該檢視。您也可以透過開啟使用者設定(在命令選擇區中輸入偏好設定:開啟設定 (UI) 命令)並將測試:自動開啟 Peek View 設定的值變更為 never 來停用它。

測試總管中,結果會顯示個別測試以及包含這些測試的類別和檔案。如果資料夾內的任何測試未通過,資料夾將顯示失敗圖示。

Test results on a unittest class and in Test Explorer

VS Code 也會在測試結果 (Test Results) 面板中顯示測試結果。

Test results in the Test Results panel

執行含覆蓋率的測試

若要在啟用覆蓋率的情況下執行測試,請選取測試總管中的覆蓋率執行圖示,或從您通常觸發測試執行的任何選單中選擇使用覆蓋率執行 (Run with coverage) 選項。如果您使用 pytest,Python 擴充功能會使用 pytest-cov 外掛程式執行覆蓋率分析;若是 unittest,則使用 coverage.py

注意

在執行具覆蓋率的測試之前,請確保已為您的專案安裝正確的測試覆蓋率套件。分支覆蓋率僅支援覆蓋率版本 >= 7.7。

覆蓋率執行完成後,編輯器中會反白顯示程式碼行以標示行層級的覆蓋率。測試覆蓋率結果會以「測試覆蓋率 (Test Coverage)」子頁籤形式出現在測試總管中,您也可以透過命令選擇區中的測試:聚焦於測試覆蓋率檢視 (Testing: Focus on Test Coverage View) 指令(⇧⌘P (Windows, Linux Ctrl+Shift+P))導覽至該處。在此面板上,您可以查看工作區中每個檔案和資料夾的行覆蓋率指標,以及相關的分支覆蓋率。

Gif showing running Python tests with coverage.

若要在使用 pytest 時對覆蓋率執行過程進行更精細的控制,您可以編輯 python.testing.pytestArgs 設定以包含您的規格。當 python.testing.pytestArgs 中存在 pytest 引數 --cov 時,Python 擴充功能將不會對覆蓋率引數進行任何額外編輯,以確保您的自訂設定生效。如果找不到 --cov 引數,擴充功能會在執行前將 --cov=. 新增至 pytest 引數,以便在工作區根目錄啟用覆蓋率。

有關測試覆蓋率的更多資訊,請造訪 VS Code 的 測試覆蓋率文件

偵錯測試

若要偵錯測試,請在函數定義旁的裝訂邊裝飾上按右鍵並選擇偵錯測試 (Debug Test),或選取測試總管中該測試旁邊的偵錯測試圖示。

Debug Test icon in the Test Explorer

注意

執行或偵錯測試不會自動儲存測試檔案。請務必在執行前儲存測試的變更,否則您可能會對結果感到困惑,因為它們仍反映的是檔案的舊版本!

您可以使用下列命令從命令選擇區來偵錯測試:

  • Test: Debug All Tests - 為工作區中的所有測試啟動偵錯工具。
  • Test: Debug Tests in Current File - 為編輯器中開啟的檔案中定義的測試啟動偵錯工具。
  • Test: Debug Test at Cursor - 僅為您在編輯器中將游標聚焦的方法啟動偵錯工具。您也可以使用測試總管中的偵錯測試圖示,為選定範圍內的所有測試以及所有已探索到的測試啟動偵錯工具。

您也可以透過在 settings.json 檔案中將 testing.defaultGutterClickAction 設定值變更為 debug,將點選裝訂邊裝飾的預設行為從執行變更為偵錯。

偵錯工具對於測試的運作方式與其他 Python 程式碼相同,包括中斷點、變數檢查等。若要自訂測試偵錯設定,您可以透過在工作區的 .vscode 資料夾內的 launch.jsonsettings.json 檔案中新增 "purpose": ["debug-test"] 到您的設定中,來指定測試偵錯組態。當您執行 Test: Debug All TestsTest: Debug Tests in Current FileTest: 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 偵錯 (Debugging) 文章。

並行執行測試

透過 pytest-xdist 套件支援使用 pytest 平行執行測試。請造訪其 文件,以取得有關如何使用 pytest-xdist 的更多資訊。

當啟用 xdist 且引數中未指定工作站 (worker) 數量時,Python 擴充功能會根據在測試總管中選取的測試數量,自動最佳化工作站數量。

Django 單元測試

Python 擴充功能也支援探索和執行 Django 單元測試!只需幾個額外的設定步驟,即可讓您的 Django 測試被探索到:

  1. 在您的 settings.json 檔案 中設定 "python.testing.unittestEnabled": true,
  2. MANAGE_PY_PATH 新增為環境變數。
    1. 在專案根目錄建立 .env 檔案。
    2. MANAGE_PY_PATH='<path-to-manage.py>' 新增至 .env 檔案,並將 <path-to-manage.py> 取代為您應用程式 manage.py 檔案的路徑。

      提示:您可以透過在檔案總管檢視中對檔案按右鍵並選擇複製路徑 (Copy Path) 來複製路徑。

  3. 根據需要將 Django 測試引數新增至 settings.json 檔案 中的 "python.testing.unittestArgs": [],並移除與 Django 不相容的任何引數。
注意

預設情況下,Python 擴充功能會在專案根目錄尋找並載入 .env 檔案。如果您的 .env 檔案不在專案根目錄,或是您使用了 VS Code 變數替換,請在您的 settings.json 檔案 中新增 "python.envFile": "${workspaceFolder}/<path-to-.env>"。這能讓 Python 擴充功能在執行和探索測試時載入此檔案中的環境變數。取得有關 Python 環境變數 的更多資訊。

導覽至測試檢視,並選取重新整理測試 (Refresh Tests) 按鈕以顯示您的 Django 測試!

疑難排解

如果您的 Django 單元測試未顯示在測試檢視中,請嘗試以下故障排除步驟:

  • Python 輸出面板中搜尋錯誤訊息。它們可能會提供測試未被探索到的原因。
  • 嘗試在終端機中執行 Django 測試。然後將相同的命令「翻譯」為 VS Code 設定。例如,如果您在終端機執行 python manage.py test --arg,則應將 MANAGE_PY_PATH='./manage.py' 新增至 .env 檔案,並在 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 如果錯誤 Peek View 已開啟,則開啟並移動到總管中下一個失敗測試的 Peek View。
Test: Go to Previous Test Failure 如果錯誤 Peek View 已開啟,則開啟並移動到總管中上一個失敗測試的 Peek View。
Test: Peek Output 為失敗的測試方法開啟錯誤 Peek View。
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」時即可找到。

通用 Python 設定

設定
(python.testing.)
預設值 說明
autoTestDiscoverOnSaveEnabled true 指定是否在儲存測試檔案時啟用或停用自動執行測試探索。變更此設定後,您可能需要重新載入視窗以套用變更。
cwd null 指定測試的選用工作目錄。此設定的存在會動態調整 pytest 的 --rootdir 引數。
autoTestDiscoverOnSavePattern **/*.py 指定一個 glob 模式,當 autoTestDiscoverOnSaveEnabledtrue 時,該模式決定哪些檔案變更會觸發自動測試探索。
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 使用相同的技術來存取正在執行的原始程式碼。若要防止此行為,請在偵錯測試時於 pytestArgs 中包含 --no-cov,例如將 "env": {"PYTEST_ADDOPTS": "--no-cov"} 新增至您的偵錯組態中。(請參閱上方的 偵錯測試 以了解如何設定該啟動組態。)(如需詳細資訊,請參閱 pytest-cov 文件中的 Debuggers and PyCharm。)

IntelliSense 設定

IntelliSense 設定
(python.analysis.)
預設值 說明
inlayHints.pytestParameters false 是否顯示 pytest 固定引數 (fixture argument) 類型的嵌入式提示 (inlay hints)。接受的值為 truefalse

參見

  • Python 環境 - 控制編輯與偵錯時所使用的 Python 直譯器。
  • 設定參考 - 探索 VS Code 中所有與 Python 相關的設定。
© . This site is unofficial and not affiliated with Microsoft.