在 Visual Studio 中使用測試總管來寫入 Python 的單元測試
單元測試是測試應用程式中其他程式碼單元 (通常是隔離的函數、類別等) 的程式碼片段。 應用程式通過所有單元測試之後,您至少可以確定低階程式功能皆能正確運作。
在設計程式時,Python 會廣泛地使用單元測試來驗證案例。 Visual Studio 中的 Python 支援包含在開發程序的內容內針對單元測試進行探索、執行及偵錯,而且不需要個別執行測試。
本文章提供搭配 Python 的 Visual Studio 中的單元測試功能簡介。 如需單元測試的整體詳細資訊,請參閱對程式碼進行單元測試。
必要條件
已在 Windows 中安裝 Visual Studio 並支援 Python 工作負載。 如需詳細資訊,請參閱在 Visual Studio 中安裝 Python 支援。
具有程式碼的 Python 專案,或具有 Python 程式碼的資料夾。
不支援 Visual Studio for Mac。 如需詳細資訊,請參閱 Visual Studio for Mac 發生什麼事? Windows、Mac 和 Linux 上的 Visual Studio Code 可透過可用的延伸模組與 Python 搭配運作。
選取 Python 專案的測試架構
Visual Studio 支援兩個適用於 Python、unittest 和 pytest 的測試架構 (在 Visual Studio 2019 16.3 版及更新版本中可用)。 根據預設,當您建立 Python 專案時,不會選取任何架構。
請遵循下列步驟來選取 Python 專案的測試架構:
在方案總管中,以滑鼠右鍵按一下專案名稱,然後選取 [屬性]。
在專案 [屬性] 窗格中,選取 [測試] 索引標籤,然後選擇您的 [測試架構] 類型:
針對 unittest 架構,Visual Studio 會為測試探索指派專案的根目錄。 預設值為
.
,但您可以在配置專案設定時指定不同的位置。 也可以為測試檔案名 Pattern 指定一個或多個字串,例如test*.py, test_*.py
。針對 pytest 架構,透過使用標準 pytest .ini 設定檔來指定諸如測試位置和檔案名稱模式等測試選項。 根據預設,工作區/專案資料夾會用於位置。 預設檔案名稱模式包括
test_*py
和*_test.py
。 如需詳細資訊,請參閱 pytest 參考文件。
注意
當您定義檔案名稱模式時,請記住底線 (
_
) 等特殊字元與萬用字元 (*
) 不相符。 如果您要在檔案名稱中使用特殊字元,請在模式定義中指定這些字元,例如test_*.py
。若要儲存架構選取和設定,可以使用 Ctrl+S 鍵盤快速鍵。
設定架構之後,Visual Studio 會啟動測試探索,並開啟 [測試總管]。
在沒有專案的情況下設定 Python 的測試
Visual Studio 可讓您使用 Python 程式碼開啟資料夾,以在沒有專案的情況下執行及測試現有的 Python 程式碼。 在這種情況下,您必須使用 PythonSettings.json 檔案來設定測試。
使用 [開啟本機資料夾] 選項開啟現有的 Python 程式碼:
開啟 Python 資料夾時,Visual Studio 會建立數個隱藏的資料夾,用於管理專案的相關設定。 若要在 [方案總管] 中查看這些資料夾 (以及任何其他隱藏的檔案和資料夾,例如 .git 資料夾),請選取 [顯示所有檔案] 選項:
在 [方案總管] 中,展開 [本機設定] 資料夾,然後按兩下 PythonSettings.json 檔案,在編輯器中開啟檔案。
注意
大部分的組態顯示兩個設定檔案:PythonSettings.json 和 ProjectSettings.json。 在此練習中,您需要修改 PythonSettings.json 檔案。
如果您沒有在 [本機設定] 資料夾中看到 PythonSettings.json 檔案,請手動建立它:
以滑鼠右鍵按一下 [本機設定] 資料夾,然後選取 [新增]>[新增檔案]。
將檔案命名為 PythonSettings.json,然後選取 Enter 以儲存變更。
Visual Studio 會自動在編輯器中開啟新檔案。
在 PythonSettings.json 檔案中,新增下列程式碼來定義
TestFramework
。 視您所需的測試架構而定,將架構值設定為 pytest 或 unittest:{ "TestFramework": "unittest", "UnitTestRootDirectory": "testing", "UnitTestPattern": "test_*.py" }
針對 unittest 架構,如果您未在 PythonSettings.json 檔案中定義
UnitTestRootDirectory
和UnitTestPattern
設定的特定值,Visual Studio 會分別使用.
和test*.py
的預設值來新增這些欄位。針對 pytest 架構,設定選項總是在 pytest .ini 設定檔中指定,而不是透過 Visual Studio 設定指定。
如果您的 Python 程式包含 src 資料夾,它獨立於包含測試的資料夾,請使用 PythonSettings.json 檔案中的
SearchPaths
設定來指定 src 資料夾的路徑:"SearchPaths": [".\\src"]
將您的變更儲存到 PythonSettings.json 檔案。
設定架構之後,Visual Studio 會啟動指定架構的測試探索。 您可以在 [測試總管] 中存取測試。
新增和探索測試
根據預設,Visual Studio 會將 unittest 和 pytest 測試識別為名稱開頭為 test
的方法。
若要查看 Visual Studio 如何啟動測試探索,請遵循下列步驟:
在 Visual Studio 中開啟 Python 專案。
設定專案的測試架構屬性,如選取 Python 專案的測試架構中所述。
在 [方案總管] 中,以滑鼠右鍵按一下專案,然後選取 [新增]>[新項目]。
在 [新增項目] 對話方塊中,選取 [Python 單元測試] 檔案類型。
輸入符合您為專案屬性所指定之模式定義的檔案名。
選取 [新增]。
Visual Studio 會使用預設程式碼建立測試檔案:
import unittest class Test_test1(unittest.TestCase): def test_A(self): self.fail("Not implemented") if __name__ == '__main__': unittest.main()
此程式碼會匯入標準
unittest
模組,並從unittest.TestCase
方法中衍生測試類別。 當您直接執行指令碼時,此程式碼也會叫用unittest.main()
函數。
當您新增測試檔案時,Visual Studio 會在 [測試總管] 中提供它們。
使用 [測試總管] 檢視測試
設定測試架構和測試檔案之後,Visual Studio 會搜尋測試,並在 [測試總管] 中顯示它們。
以下是您可以使用 [測試總管] 的一些方式:
選取 [測試]>[測試總管],以開啟 [測試總管]。
開啟 [測試總管] 視窗時,請使用鍵盤快速鍵 CTRL+R、A 來觸發測試探索。
按兩下 [測試總管] 中的測試,在編輯器中開啟對應的來源檔案:
使用工具列上的 [分組依據] 選項來組織測試的檢視:
可以在 [搜尋] 欄位中輸入文字,依據名稱來篩選測試:
執行測試並檢視測試執行狀態,如下一節所述。
如需 unittest
模組和撰寫測試的詳細資訊,請參閱 Python 文件。
使用 [測試總管] 執行測試
在 [測試總管] 中,可使用多種方式來執行測試:
- 選取 [全部執行 (檢視中的測試)],根據您的篩選設定來執行目前檢視中顯示的所有測試。
- 使用 [執行] 功能表中的命令,將已失敗、已通過或未執行的測試作為一個群組來執行。
- 選取一個或多個測試,以滑鼠右鍵按一下,然後選取 [執行選取的測試] 選項。
Visual Studio 會在後台執行測試。 [測試總管] 會在每個測試完成時更新其狀態:
通過的測試會顯示綠色的打勾圖示,以及完成測試回合所花費的時間:
失敗的測試會顯示紅色 X 和輸出連結 (會顯示測試回合的主控台輸出和
unittest
輸出):
使用偵錯工具來檢查測試
單元測試是程式碼片段,它們和其他程式碼一樣會有錯誤,有時需要在偵錯工具中執行。 在 Visual Studio 偵錯工具中,您可以設定中斷點、檢視變數以及逐步檢視程式碼。 Visual Studio 也提供診斷工具以進行單元測試。
請檢閱有關使用 Visual Studio 偵錯工具檢查測試的這些要點:
根據預設,測試偵錯會使用 Visual Studio 2019 16.5 版和更新版本的 debugpy 偵錯工具。 某些舊版 Visual Studio 會使用 ptvsd 4 偵錯工具。 如果使用舊版 Visual Studio 並偏好 ptvsd 3 偵錯工具,請選取 [工具]>[選項]>[Python]>[偵錯] 底下的 [使用舊版偵錯工具] 選項。
若要開始偵錯,請在程式碼中設定初始中斷點,然後在 [測試總管] 中以滑鼠右鍵按一下測試 (或一系列測試),然後選取 [偵錯選取的測試]。 Visual Studio 會以與針對應用程式碼一樣的方式,啟動 Python 偵錯工具。
如果您願意,可以使用 [分析所選測試的程式碼涵蓋範圍]。 如需詳細資訊,請參閱使用程式碼涵蓋範圍來決定所測試的程式碼數量。