﻿# 如何在 VS Code 順利啟用測試總管 (Test Explorer) 測試 .NET 應用程式

我最近在嘗試使用 [GitHub Copilot](https://github.com/features/copilot) 來撰寫單元測試，而在使用的過程中，我發現 [Visual Studio Code](https://code.visualstudio.com/) 的測試總管 (Test Explorer) 竟然抓不到我專案中的測試案例，研究了一下才發現是 [.NET Core Test Explorer](https://marketplace.visualstudio.com/items?itemName=formulahendry.dotnet-test-explorer) 沒有正確設定導致的。不過，其實 [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) 擴充套件本來就內建了 C# 的測試轉接器 (Test Adapter)，不需要 `.NET Core Test Explorer` 就能跑，索性我就把套件刪除了。今天這篇文章我就來分享如何設定讓 `C# Dev Kit` 能夠正確的啟用測試總管 (Test Explorer)，方便我們執行單元測試。

![A wide image depicting a programmer in a modern, well-lit office, using Visual Studio Code on a large monitor  The focus is on the screen, which shows](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b7537ab6b95193dbc62e-ba9237cc-6422-4207-b07d-f258357cd565.jpg)

### 關於 .NET Core Test Explorer 的設定方法

其實你也不一定要移除 [.NET Core Test Explorer](https://marketplace.visualstudio.com/items?itemName=formulahendry.dotnet-test-explorer) 擴充套件，只是要做額外設定才能正常運作。

首先，微軟新推出的 [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) 擴充套件有支援 `*.sln` 方案檔功能，你可以從 Visual Studio Code 開啟整個方案資料夾，資料夾下可以包含多個專案(`*.csproj`)，開發起來比較方便。

不過，若要讓 [.NET Core Test Explorer](https://marketplace.visualstudio.com/items?itemName=formulahendry.dotnet-test-explorer) 擴充套件可以正常抓到測試案例的項目，你必須要在專案的根目錄下新增 `.vscode/settings.json` 設定檔，並加入以下設定：

```json
{
    "dotnet-test-explorer.testProjectPath": "**/*[Tt]ests.@(csproj|vbproj|fsproj)"
}
```

> 這個設定是會自動找尋任意目錄下是否有 `*Tests.csproj`、`*Tests.vbproj`、`*Tests.fsproj` 專案檔，有的話就會從這些專案檔中找尋所有可能的測試案例，並自動加入到測試總管 (Test Explorer) 中。

不過，我認為 [.NET Core Test Explorer](https://marketplace.visualstudio.com/items?itemName=formulahendry.dotnet-test-explorer) 擴充套件應該可以完整刪除了，因為 [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) 擴充套件內建的功能中，幾乎可以完整取代 [.NET Core Test Explorer](https://marketplace.visualstudio.com/items?itemName=formulahendry.dotnet-test-explorer) 擴充套件中的所有功能。

### 關於 C# Dev Kit 擴充套件

為了要讓 [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) 擴充套件可以成功識別方案或專案中的測試案例，其實有一些步驟需要設定，而且針對不同的測試框架也有不同的設定方法，以下我就分別針對 [xUnit](https://learn.microsoft.com/dotnet/core/testing/unit-testing-with-dotnet-test)、[NUnit](https://learn.microsoft.com/dotnet/core/testing/unit-testing-with-nunit)、[MSTest](https://learn.microsoft.com/dotnet/core/testing/unit-testing-with-mstest) 來說明設定的方式。

不過，在開始設定之前，我想先跟大家溝通測試案例的管理方法，因為管理單元測試的程式碼有 2 種常見的作法：

1.  將**類別**與**測試類別**寫在同一個**專案**中，甚至放在**同一個資料夾下**的不同 `*.cs` 檔案中
    
    在同一個專案中，將類別與測試類別分開放置，這樣的好處是可以讓專案的結構比較清楚，而且要找到測試方法也很容易，因為檔名有共通性，檔案總管中也很容易找到測試程式碼。
    
    這種方法需要在同一個專案下，額外安裝測試框架相關的 NuGet 套件。
    
2.  將**類別**與**測試類別**寫在同一個**方案**下，但分別放在不同的專案中
    
    這也是一種常見的測試管理方法，將類別放在另一個獨立的 `{ProjectName}Tests` 專案中，可以讓測試程式碼全部集中，不會跟主要的程式碼放在一起。
    
    建立獨立的測試專案，可以透過 `dotnet new xunit` 這樣的命令快速建立專案，建立的過程會自動設定好所有必要的 NuGet 套件，初始化專案比較方便。不過，較為麻煩的地方就在於，我們需要將原本的專案加入到測試專案中，這樣才能參考到原本專案的類別，並對這些類別進行測試。
    
    這種方法不需要在原本專案中加入測試相關的 NuGet 套件，專案本身比較乾淨。
    
    例如我想替 ASP.NET Core MVC 專案建立一個相對應的測試專案，就可以這樣執行 .NET CLI：
    
    ```bash
    # 建立 ASP.NET Core MVC 專案
    dotnet new mvc -n mvc1
    
    # 建立 xUnit 測試專案
    dotnet new xunit -n mvc1.tests
    
    # 建立方案檔
    dotnet new sln
    
    # 將專案加入方案檔
    dotnet sln add .\mvc1\mvc1.csproj
    dotnet sln add .\mvc1.tests\mvc1.tests.csproj
    
    # 將 mvc1.tests 專案引入 mvc1 專參考
    dotnet add .\mvc1.tests\mvc1.tests.csproj reference .\mvc1\mvc1.csproj
    ```
    

### 設定 xUnit 測試專案

如果你想讓一個沒有測試案例的專案，變成可以執行 [xUnit](https://xunit.net/) 測試的專案，你必須手動執行以下步驟：

1.  安裝以下 4 個 NuGet 套件：
    
    ```
    Microsoft.NET.Test.Sdk
    xunit
    xunit.runner.visualstudio
    coverlet.collector
    ```
    
    安裝的 .NET CLI 命令為：
    
    ```bash
    dotnet add package Microsoft.NET.Test.Sdk
    dotnet add package xunit
    dotnet add package xunit.runner.visualstudio
    dotnet add package coverlet.collector
    ```
    
    這種安裝設定方法通常可以安裝到最新版的 NuGet 套件。
    
2.  建置專案
    
    ```bash
    dotnet build
    ```
    
    建置成功後，就會在 Visual Studio Code 的測試總管 (Test Explorer) 中看到所有的測試案例了！
    
    ![Test Explorer](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/da9c6dce26321e4709d9-2f4104bc-3b5c-4b92-a631-66cc5a87a2e3.png)
    
3.  執行測試
    
    你可以從測試總管 (Test Explorer) 執行測試，也可以使用 .NET CLI 命令執行測試：
    
    ```bash
    dotnet test
    ```
    

### 設定 NUnit 測試專案

如果你想讓一個沒有測試案例的專案，變成可以執行 [NUnit](https://nunit.org/) 測試的專案，你必須手動執行以下步驟：

1.  安裝以下 3 個 NuGet 套件：
    
    ```
    Microsoft.NET.Test.Sdk
    nunit
    NUnit3TestAdapter
    ```
    
    安裝的 .NET CLI 命令為：
    
    ```bash
    dotnet add package Microsoft.NET.Test.Sdk
    dotnet add package nunit
    dotnet add package NUnit3TestAdapter
    ```
    
    這種安裝設定方法通常可以安裝到最新版的 NuGet 套件。
    
2.  建置專案
    
    ```bash
    dotnet build
    ```
    
    建置成功後，就會在測試總管 (Test Explorer) 中看到所有的測試案例了！
    
3.  執行測試
    
    你可以從測試總管 (Test Explorer) 執行測試，也可以使用 .NET CLI 命令執行測試：
    
    ```bash
    dotnet test
    ```
    

### 設定 MSTest 測試專案

如果你想讓一個沒有測試案例的專案，變成可以執行 [MSTest](https://learn.microsoft.com/zh-tw/dotnet/core/testing/unit-testing-with-mstest?WT.mc_id=DT-MVP-4015686) 測試的專案，你必須手動執行以下步驟：

1.  安裝以下 4 個 NuGet 套件：
    
    ```
    Microsoft.NET.Test.Sdk
    MSTest.TestAdapter
    MSTest.TestFramework
    coverlet.collector
    ```
    
    安裝的 .NET CLI 命令為：
    
    ```bash
    dotnet add package Microsoft.NET.Test.Sdk
    dotnet add package MSTest.TestAdapter
    dotnet add package MSTest.TestFramework
    dotnet add package coverlet.collector
    ```
    
    這種安裝設定方法通常可以安裝到最新版的 NuGet 套件。
    
2.  建置專案
    
    ```bash
    dotnet build
    ```
    
    建置成功後，就會在測試總管 (Test Explorer) 中看到所有的測試案例了！
    
3.  執行測試
    
    你可以從測試總管 (Test Explorer) 執行測試，也可以使用 .NET CLI 命令執行測試：
    
    ```bash
    dotnet test
    ```
    

### 簡介 C# Dev Kit 擴充套件內建的測試相關功能

1.  執行/偵錯測試案例
    
    [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) 會在你的編輯器中測試方法 (Test methods) 左側地方，出現一個綠色的三角形按鈕，按下去就可以執行測試，或是按下右鍵，選擇 `Run Test` 或 `Debug Test` 來執行測試。
    
    ![運行/偵錯測試使用案例](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/c55fe24cd550c75373fd-92301520-bd2b-4ff6-b7ee-9cc21f7c09dd.png)
    
2.  測試總管 (Test Explorer)
    
    Visual Studio Code 有內建測試總管 (Test Explorer)，預設會顯示你目前的 VS Code Workspace 中所有的測試案例，您可以選擇 Visual Studio Code 左側(或右側)的活動欄上的**燒杯按鈕**將其開啟。您還可以執行/偵錯您的測試案例並從那裡查看其測試結果。
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/c170fbec9d21739739e2-01c6f3c6-68c6-490b-a1ab-7a09d856e1cb.png)
    
3.  查看測試結果
    
    執行/偵錯測試案例後，相關測試專案的狀態將在編輯器裝飾和測試資源管理器中更新。當你點擊測試失敗的項目時，還會自動開啟測試程式的位置，並顯示測試失敗的原因與追蹤堆疊資訊。
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/5477e6fff813f3d7f070-9cd1b61c-c89a-41c1-a6cd-ece2c1ff0470.png)
    
4.  VS Code 測試命令
    
    透過在命令面板 ( `Ctrl+Shift+P` 或 `F1` ) 中搜尋 `Test:` 可以找到所有測試命令。
    
    ![Testing command in Command Palette](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/d874af0725f3ba6ee70c-10517505-372c-4469-a210-e4d596857b93.png)
    
5.  VS Code 測試設定
    
    有一些特定於測試的 VS Code 設定，可以透過在設定編輯器中搜尋測試來找到 ( `Ctrl+,` )。
    
    ![Testing settings](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/acebe86998bb688bc91b-31af4464-b98a-47ab-985e-34f194925064.png)
    

### 相關連結

-   [Testing C# with C# Dev Kit in Visual Studio Code](https://code.visualstudio.com/docs/csharp/testing)
-   [C# Dev Kit - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit)
-   [使用 MSTest 和 .NET 進行 C# 單元測試 - .NET | Microsoft Learn](https://learn.microsoft.com/zh-tw/dotnet/core/testing/unit-testing-with-mstest?WT.mc_id=DT-MVP-4015686)
-   [NUnit.org](https://nunit.org/)
-   [xUnit.net](https://xunit.net/)
