建立和執行單元測試,檢查您的程式碼是否如預期般運作。 它被稱為單元測試,因為您將程式的功能分解為離散的可測試行為,您可以將其作為單獨 的單元進行測試。 Visual Studio 測試總管提供彈性且有效率的方式來執行單元測試,並在 Visual Studio 中檢視其結果。 Visual Studio 會安裝 Microsoft 的單元測試框架,用於受管理及原生程式碼。 使用 單元測試框架 來建立單元測試、執行它們並報告這些測試的結果。 當您進行變更時,請重新執行單元測試,以測試程式碼是否仍能正常運作。 Visual Studio Enterprise 可以使用 Live Unit Testing 自動執行此動作,這會偵測受程式碼變更影響的測試,並在您輸入時在背景執行測試。
當單元測試成為軟體開發工作流程不可或缺的一部分時,它對程式碼品質的影響最大。 一旦您撰寫函式或其他應用程式程式碼區塊,請建立單元測試,以驗證程式碼的行為,以回應輸入資料的標準、界限和不正確案例,並檢查程式碼所做的任何明確或隱含假設。 使用 測試驅動開發時,您會在撰寫程式碼之前建立單元測試,因此您可以使用單元測試作為設計文件和功能規格。
測試總管也能執行實作了測試總管插件介面的第三方和開放原始碼單元測試框架。 您可以透過 Visual Studio 延伸模組管理員和 Visual Studio 資源庫新增其中許多架構。 如需詳細資訊,請參閱 安裝第三方單元測試架構。
開始
如需直接進入編碼的單元測試簡介,請參閱下列其中一篇文章:
銀行解決方案範例
在本文中,我們以名為 的 MyBank 虛構應用程式的開發為例。 您不需要實際程式碼來遵循本文中的說明。 測試方法是以 C# 撰寫,並使用 Microsoft Unit Testing Framework for Managed Code 呈現。 然而,這些概念很容易轉移到其他語言和框架上。
我們第一次嘗試為應用程式設計 MyBank ,包括一個代表個人帳戶及其與銀行交易的帳戶元件,以及一個代表彙總和管理個別帳戶的功能的資料庫元件。
我們建立包含 Bank 兩個專案的解決方案:
AccountsBankDB
我們第一次嘗試設計 Accounts 專案時,包含一個用於保存帳戶基本資訊的類別、一個指定任何類型帳戶的通用功能(例如從帳戶中存入和提取資產)的介面,以及一個從代表支票帳戶的介面派生的類別。 我們透過建立下列原始檔來開始帳戶專案:
AccountInfo.cs 定義帳戶的基本資訊。
IAccount.cs 定義了帳戶的標準
IAccount介面,包括從帳戶存入和提取資產以及檢索帳戶餘額的方法。CheckingAccount.cs 包含
CheckingAccount實作IAccount支票帳戶介面的類別。
我們從經驗中知道,從支票賬戶提款必須做的一件事是確保提取的金額小於賬戶餘額。 因此,我們在 IAccount.Withdraw 中覆蓋了 CheckingAccount 方法,並使用一個方法來檢查此條件。 方法可能如下所示:
public void Withdraw(double amount)
{
if(m_balance >= amount)
{
m_balance -= amount;
}
else
{
throw new ArgumentException(nameof(amount), "Withdrawal exceeds balance!");
}
}
現在我們已經有了一些程式碼,是時候進行測試了。
使用 Copilot 建立單元測試
從 Visual Studio 2026 Insiders 版本開始,你可以使用 GitHub Copilot testing for .NET 自動產生單元測試。 GitHub Copilot 的 .NET 測試不僅產生測試,還會除錯測試,並在 Test Explorer 中執行。 更多資訊請參閱 GitHub Copilot 對 .NET 的測試概述。 這是產生測試的推薦方法。
或者,你也可以用 Copilot /tests slash 指令從程式碼產生單元測試。 例如,您可以鍵入 /tests using NUnit Framework 以產生 NUnit 測試。 如需詳細資訊,請參閱 在 Copilot Chat 中使用斜線命令。
產生並執行單元測試
使用 Visual Studio 2026 Insiders 建置版,你可以使用 GitHub Copilot 的 .NET 測試 自動產生單元測試。
本文所述的大多數程序都適用於手動產生的測試。 如果你想深入了解單元測試,可以閱讀本文後續內容,或跳到 「在測試檔案總管中執行測試」這一章節。
使用 Copilot 建立單元測試
你可以用 Copilot /tests slash 指令從程式碼產生單元測試。 例如,您可以鍵入 /tests using NUnit Framework 以產生 NUnit 測試。 如需詳細資訊,請參閱 在 Copilot Chat 中使用斜線命令。
建立單元測試專案和測試方法 (C#)
針對 C#,從程式碼產生單元測試專案和單元測試存根通常會更快。 或者,您可以選擇根據您的需求手動建立單元測試專案和測試。 如果您想要使用第三方框架從程式碼建立單元測試,則需要安裝下列其中一個擴充功能: NUnit 或 xUnit。 如果您未使用 C#,請略過本節,並移至 手動建立單元測試專案和單元測試。
產生單元測試專案和單元測試存根
在程式碼編輯器視窗中,以滑鼠右鍵按一下,然後從滑鼠右鍵功能表中選擇 [ 建立單元測試 ]。
備註
[ 建立單元測試] 功能表命令僅適用於 C# 程式碼。 若要搭配 .NET Core 或 .NET Standard 使用此方法,需要 Visual Studio 2019 或更新版本。
選取 [ 確定 ] 以接受預設值以建立單元測試,或變更用來建立和命名單元測試專案和單元測試的值。 您可以選取預設新增至單元測試方法的程式碼。
單元測試存根會在新的單元測試專案中針對類別中的所有方法建立。
現在繼續了解如何 編寫測試 以使您的單元測試有意義,以及您可能想要添加的任何額外的單元測試以徹底測試您的代碼。
建立單元測試專案和測試方法 (C#)
針對 C#,從程式碼產生單元測試專案和單元測試存根通常會更快。 或者,您可以選擇根據您的需求手動建立單元測試專案和測試。 如果您想要使用第三方框架從程式碼建立單元測試,則需要安裝下列其中一個擴充功能: NUnit 或 xUnit。 如果您未使用 C#,請略過本節,並移至 手動建立單元測試專案和單元測試。
產生單元測試專案和單元測試存根
在程式碼編輯器視窗中,以滑鼠右鍵按一下,然後從滑鼠右鍵功能表中選擇 [ 建立單元測試 ]。
備註
[ 建立單元測試] 功能表命令僅適用於 C# 程式碼。 若要搭配 .NET Core 或 .NET Standard 使用此方法,需要 Visual Studio 2019 或更新版本。
選取 [ 確定 ] 以接受預設值以建立單元測試,或變更用來建立和命名單元測試專案和單元測試的值。 您可以選取預設新增至單元測試方法的程式碼。
單元測試存根會在新的單元測試專案中針對類別中的所有方法建立。
現在繼續了解如何 編寫測試 以使您的單元測試有意義,以及您可能想要添加的任何額外的單元測試以徹底測試您的代碼。
手動建立單元測試專案和單元測試
單元測試專案通常鏡像單一程式碼專案的結構。 在 MyBank 範例中,您會將兩個名為 和 AccountsTestsBankDbTests 的Bank單元測試專案新增至解決方案。 測試專案名稱是任意的,但採用標準命名慣例是個好主意。
若要將單元測試專案新增至解決方案:
在 [方案總管] 中,以滑鼠右鍵按一下解決方案,然後選擇>新增專案]。
在專案範本搜尋方塊中輸入 test ,以尋找您要使用的測試架構的單元測試專案範本。 (在本文中的範例中,我們使用 MSTest。
在下一頁上,為專案命名。 若要測試
Accounts我們範例的專案,您可以將專案AccountsTests命名為 。在您的單元測試專案中,新增受測程式碼專案的參考,在我們的範例中新增 Accounts 專案。
若要為程式碼專案創建參考要點:
在 [方案總管] 的單元測試專案中,以滑鼠右鍵按一下 [參考 ] 或 [相依性] 節點,然後選擇 [新增專案參考 ] 或 [新增參考] ,以可用的選項為準。
在 [參考管理員 ] 對話方塊中,開啟 [解決方案] 節點,然後選擇 [專案]。 選取程式碼專案名稱,然後關閉對話方塊。
每個單元測試專案都包含對應程式碼專案中類別名稱的類別。 在我們的範例中, AccountsTests 專案將包含下列類別:
AccountInfoTestsclass 包含AccountInfo專案中的Accounts類別的單元測試方法CheckingAccountTestsclass 包含 class 的CheckingAccount單元測試方法。
撰寫測試
您使用的單元測試架構和 Visual Studio IntelliSense 會引導您撰寫程式碼專案的單元測試程式碼。 若要在 測試總管中執行,大部分的架構都需要您新增特定屬性來識別單元測試方法。 這些框架還提供了一種方法(通常通過斷言語句或方法屬性)來指示測試方法是否通過或失敗。 其他屬性用於識別選擇性設定方法,這些方法會在類別初始化時以及在每個測試方法之前執行;而拆卸方法則會在每個測試方法之後及類別銷毀前執行。
AAA (Arrange、Act、Assert) 模式是為受測方法撰寫單元測試的常用方式。
單元測試方法的 Arrange 區段會初始化物件,並設定傳遞至受測方法之資料值。
Act段落使用已安排的參數調用被測方法。
[Assert] 區段會驗證所測試方法的動作是否如預期般運作。 針對 .NET,類別中 Assert 的方法通常會用於驗證。
若要測試 CheckingAccount.Withdraw 範例的方法,我們可以撰寫兩個測試:一個驗證方法的標準行為,另一個驗證超過餘額的提款會失敗 (下列程式碼顯示 .NET 中支援的 MSTest 單元測試。 在類別中 CheckingAccountTests ,我們新增了以下方法:
[TestMethod]
public void Withdraw_ValidAmount_ChangesBalance()
{
// arrange
double currentBalance = 10.0;
double withdrawal = 1.0;
double expected = 9.0;
var account = new CheckingAccount("JohnDoe", currentBalance);
// act
account.Withdraw(withdrawal);
// assert
Assert.AreEqual(expected, account.Balance);
}
[TestMethod]
public void Withdraw_AmountMoreThanBalance_Throws()
{
// arrange
var account = new CheckingAccount("John Doe", 10.0);
// act and assert
Assert.ThrowsException<System.ArgumentException>(() => account.Withdraw(20.0));
}
如需 Microsoft 單元測試架構的詳細資訊,請參閱下列其中一篇文章:
設定單元測試的超時
如果您使用 MSTest 架構,您可以使用TimeoutAttribute 來設定單個測試方法的超時:
[TestMethod]
[Timeout(2000)] // Milliseconds
public void My_Test()
{ ...
}
若要將逾時設定為允許的最大值:
[TestMethod]
[Timeout(TestTimeout.Infinite)] // Milliseconds
public void My_Test ()
{ ...
}
在測試總管中執行測試
當您建置測試專案時,測試會出現在 [測試總管] 中。 如果 [測試總管] 不可見,請在 Visual Studio 功能表上選擇 [ 測試 ],選擇 [Windows],然後選擇 [測試總管] (或按 Ctrl + E、 T)。
當您執行、撰寫及重新執行測試時, 測試總管 可以將結果顯示在 [失敗的測試]、[ 已通過的測試]、[略 過的測試 ] 和 [未執行測試] 群組中。 您可以在工具列中選擇不同的依據選項來分組。
您也可以透過在全域層級比對搜尋方塊中的文字,或選取其中一個預先定義的篩選器來篩選任何檢視中的測試。 您可以隨時執行選擇的任何測試。 測試執行的結果會立即顯示在檔案瀏覽器視窗頂端的通過/失敗狀態條中。 當您選取測試時,會顯示測試方法結果的詳細資料。
執行和檢視測試
[測試總管] 工具列可協助您探索、組織及執行您感興趣的測試。
您可以選擇 [全部執行] 來執行所有測試 (或按 Ctrl + R、 V),或選擇 [執行] 以選擇要執行的測試子集 (Ctrl + R、 T)。 選取測試,以在測試詳細資料窗格中檢視該測試的詳細資料。 從滑鼠右鍵功能表 (鍵盤:F12) 中選擇 [開啟測試] ,以顯示所選測試的原始碼。
如果個別測試沒有相依性,無法以任何順序執行,請在工具列的設定功能表中開啟平行測試執行。 這可以顯著減少運行所有測試所需的時間。
每次建置後執行測試
若要在每個本機組建之後執行單元測試,請開啟 [測試總管] 工具列中的設定圖示,然後選取 [建置之後執行測試]。
篩選和分組測試清單
當您有大量測試時,您可以在 [測試總管] 搜尋方塊中輸入,以依指定的字串篩選清單。 您可以從篩選器清單中選擇,以進一步限制篩選器事件。
| Button | Description |
|---|---|
|
若要依類別將測試分組,請選擇 Group By (分組依據 ) 按鈕。 |
如需詳細資訊,請參閱 使用測試總管執行單元測試。
問答
問:如何偵錯單元測試?
A: 使用 測試總管 來啟動偵錯測試的工作階段。 使用 Visual Studio 偵錯工具逐步執行程式碼,可讓您在單元測試和受測專案之間無縫地來回切換。 若要開始偵錯:
在 Visual Studio 編輯器中,在您要偵錯的一或多個測試方法中設定中斷點。
備註
因為測試方法可以以任何順序執行,所以在您要偵錯的所有測試方法中設定岔斷點。
在 [測試總管] 中,選取測試方法,然後從捷徑功能表中選擇 [調試選取的測試]。
了解 除錯單元測試的更多詳細資訊。
問:如果我使用 TDD,如何從測試中生成代碼?
一個: 使用快速動作在專案程式碼中產生類別和方法。 在測試方法中撰寫陳述式,呼叫您要產生的類別或方法,然後開啟錯誤下方顯示的燈泡。 如果呼叫是新類別的建構函式,請從功能表中選擇 [產生類型] ,然後遵循精靈將類別插入程式碼專案中。 如果呼叫的是一個方法,請從 IntelliSense 功能表中選擇 產生方法。
問:我可以建立單元測試,將多組資料作為輸入來執行測試嗎?
A: 可以。
資料驅動測試方法 可讓您使用單一單元測試方法來測試一系列值。 請使用 DataRow、DynamicData 或 DataSource 屬性來指定包含您要測試的變數值的資料來源。
屬性方法會針對資料來源中的每一列執行一次。 如果任何一次迭代失敗,測試總管會報告該方法的測試失敗。 方法的測試結果詳細資料窗格會顯示每一列資料的通過/失敗狀態方法。
深入瞭解 資料驅動單元測試。
問:我可以檢視單元測試測試了多少程式碼嗎?
A: 可以。 您可以使用 Visual Studio 中的 Visual Studio Code 涵蓋範圍工具,判斷單元測試實際測試的程式碼數量。 支援原生和受控語言,以及單元測試架構可執行的所有單元測試架構。
A: 可以。 您可以使用 Visual Studio Enterprise 中的 Visual Studio Code 涵蓋範圍工具,判斷單元測試實際測試的程式碼數量。 支援原生和受控語言,以及單元測試架構可執行的所有單元測試架構。
您可以在選擇的測試或整個解決方案中的所有測試上執行程式碼覆蓋測試。 「程式碼覆蓋率結果」視窗會顯示產品程式碼區塊被測試的百分比,並依照行、函數、類別、命名空間及模組分類呈現。
若要在解決方案中執行測試方法的程式碼涵蓋範圍,請選擇 [測試>][分析所有測試的程式碼涵蓋範圍]。
涵蓋面結果會出現在「 程式碼涵蓋面結果」 視窗中。
進一步了解 程式碼涵蓋範圍。
問:我可以在程式碼中測試具有外部相依性的方法嗎?
A: 可以。 如果您有 Visual Studio Enterprise,則 Microsoft Fakes 可以與您使用單元測試架構針對 Managed 程式碼所撰寫的測試方法搭配使用。
Microsoft Fakes 使用兩種方法來建立外部相依性的替代類別:
存根 會產生替代類別,這些類別衍生自目標相依類別的父介面。 可以用存根方法替換目標類別的公用虛擬方法。
Shim 會使用執行時期工具,將呼叫目標方法的動作轉移至非虛擬方法的替代 shim 方法。
在這兩種方法中,您都會使用由相依方法呼叫所產生的委派,來指定您在測試方法中所需要的行為。
深入瞭解如何使用 Microsoft Fakes 隔離單元測試方法。
Q:我可以使用其他單元測試框架來建立單元測試嗎?
A: 是的,請按照以下步驟尋找並安裝其他框架。 重新啟動 Visual Studio 之後,請重新開啟解決方案以建立單元測試,然後在此處選取已安裝的架構:
您的單元測試存根將使用選取的架構建立。
問:如何匯出單元測試結果?
一個: 您可以搭配命令列或 Visual Studio IDE 使用 .runsettings 檔案來設定單元測試並設定測試結果檔案。 如需詳細資訊,請參閱 LoggerRunSettings 元素。