本教學課程會逐步引導您完成建置範例解決方案的互動式體驗,以瞭解單元測試概念。 如果您想要使用預先建置的解決方案來遵循教學課程,請在開始之前檢視或下載範例程式代碼。 如需下載指示,請參閱 範例和教學課程。
本文是關於測試 .NET Core 專案。 如果您要測試 ASP.NET Core 專案,請參閱 ASP.NET Core 中的整合測試。
先決條件
- 最新 .NET SDK
- Visual Studio Code 編輯器
- C# 開發套件
建立來源專案
開啟終端機視窗。 建立名為 unit-testing-using-mstest 的目錄來保存解決方案。 在此新目錄中,執行 dotnet new sln,為類別庫和測試專案建立新的方案檔。 建立 PrimeService 目錄。 下列大綱顯示到目前為止的目錄和檔案結構:
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
將 PrimeService 設為目前目錄,然後執行 dotnet new classlib 來建立來源專案。
將目錄變更回 unit-testing-using-mstest 目錄。 執行 dotnet sln add,將類別庫專案新增至方案:
dotnet sln add PrimeService/PrimeService.csproj
將 Class1.cs 目錄中的 PrimeService 重新命名為 PrimeService.cs。 將 檔案中的程式代碼取代為下列程式代碼,以建立 PrimeService 類別失敗的實作:
using System;
namespace Prime.Services
{
public class PrimeService
{
public bool IsPrime(int candidate)
{
throw new NotImplementedException("Please create a test first.");
}
}
}
建立測試專案
建立 PrimeService.Tests 目錄。 下列大綱顯示目錄結構:
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
將 PrimeService.Tests 目錄設為目前目錄,並使用 dotnet new mstest建立新專案。 dotnet new 命令會建立使用 MSTest 作為測試連結庫的測試專案。 範本會在 PrimeServiceTests.csproj 檔案中設定測試執行器:
<ItemGroup>
<PackageReference Include="MSTest" Version="4.1.0" />
</ItemGroup>
Note
所示的套件版本僅為範例。 由dotnet new mstest產生的版本取決於你的 .NET SDK。 範本和下載的範例可能不會使用最新的 NuGet 套件版本。
要在建立並執行測試後檢查更新,請從測試專案目錄執行 dotnet package list --outdated 。 用 dotnet package add <PACKAGE_NAME> 來更新套件參考到最新相容的穩定版本。 更新前先閱讀有沒有破壞性變更的釋出說明,更新後再執行 dotnet test 一次。
如果你使用 .NET 9 SDK 或更早版本,請改用 dotnet list package --outdated 和dotnet add package <PACKAGE_NAME>。
測試專案需要其他套件才能建立和執行單元測試。 上一個步驟中的 dotnet new 新增了程式代碼涵蓋範圍報告所需的 MSTest 套件和工具。
將 PrimeService 類別庫新增為專案的另一個相依性。 使用 dotnet reference add 命令:
dotnet reference add ../PrimeService/PrimeService.csproj
您可以在 GitHub 上的 範例存放庫 中看到整個檔案。
下列大綱顯示最終解決方案配置:
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Test Source Files
PrimeServiceTests.csproj
變更為 unit-testing-using-mstest 目錄,然後執行 dotnet sln add:
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
建立第一個測試
編寫一個失敗的測試,使其通過,然後重複此過程。 從 PrimeService.Tests 目錄移除 UnitTest1.cs,並使用下列內容建立名為 PrimeService_IsPrimeShould.cs 的新 C# 檔案:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Prime.Services;
namespace Prime.UnitTests.Services
{
[TestClass]
public class PrimeService_IsPrimeShould
{
private readonly PrimeService _primeService;
public PrimeService_IsPrimeShould()
{
_primeService = new PrimeService();
}
[TestMethod]
public void IsPrime_InputIs1_ReturnFalse()
{
bool result = _primeService.IsPrime(1);
Assert.IsFalse(result, "1 shouldn't be prime");
}
}
}
TestClass 屬性 表示包含單元測試的類別。 TestMethod 屬性 表示方法是測試方法。
MSTest 為每個測試建立一個新的測試類別實例,因此建構子會為每個測試建立獨立 PrimeService 的實例。 建構子僅包含該類別中每個測試所需的設定。 如果你的測試需要不同的設定,可以在測試方法裡建立物件,或從這些方法呼叫輔助方法。 如需指引,請參閱 「使用輔助方法取代設定與拆除」。
儲存此檔案並執行 dotnet test,以建置測試和類別庫,然後執行測試。 MSTest 測試執行器包含執行測試的程式進入點。
dotnet test 使用您建立的單元測試專案啟動測試執行器。
您的測試失敗,因為您尚未建立實作。 在可運作的 PrimeService 類別中撰寫最簡單的程式代碼,讓此測試通過:
public bool IsPrime(int candidate)
{
if (candidate == 1)
{
return false;
}
throw new NotImplementedException("Please create a test first.");
}
在 unit-testing-using-mstest 目錄中,再次執行 dotnet test。
dotnet test 命令會執行 PrimeService 項目的組建,然後執行 PrimeService.Tests 項目的組建。 建置這兩個項目之後,它會執行此單一測試。 它通過了。
新增更多功能
現在您已經通過了一次測試,是時候寫更多了。 關於質數,有一些其他的特殊情況:0、-1。 您可以使用 TestMethod 屬性來新增測試,但這很快就會變得乏味。 還有其他 MSTest 屬性可讓您撰寫一套類似的測試。 測試方法可以執行相同的程序代碼,但有不同的輸入自變數。 您可以使用 DataRow 屬性 來指定這些輸入的值。
不要建立新的測試,而是套用這兩個屬性來建立單一數據驅動測試。 數據驅動測試是一種方法,可測試小於兩個值的數個值,這是最低質數。 在 PrimeService_IsPrimeShould.cs中新增測試方法:
[TestMethod]
[DataRow(-1)]
[DataRow(0)]
[DataRow(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
bool result = _primeService.IsPrime(value);
Assert.IsFalse(result, $"{value} should not be prime");
}
執行 dotnet test,其中兩個測試會失敗。 若要讓所有測試都通過,請變更 if 檔案中 IsPrime 方法開頭的 子句:
if (candidate < 2)
在主程式庫中新增更多測試、更多理論和更多代碼,以繼續迭代。 您已獲得測試的完成版本 ,及函式庫 的完整實作。
您建置了一個小型程式庫,以及該程式庫的一組單元測試。 您已建構解決方案,讓新增套件和測試成為一般工作流程的一部分。 您將大部分時間和精力集中在解決應用程序的目標上。
在 Azure Pipelines 中執行測試
要在推送變更時自動執行測試,請將 Azure Pipelines 設定加入包含你已完成的解決方案的儲存庫。 你需要一個 Azure DevOps 專案,並且有 Microsoft 託管代理的存取權限。 關於先決條件,請參見 建立你的第一個管線。
在你的儲存庫根部建立
azure-pipelines.yml一個包含以下內容的檔案。 範例假設PrimeService和PrimeService.Tests目錄位於儲存庫根節點,且兩個專案都以 .NET 10 為目標。trigger: - main pool: vmImage: ubuntu-latest steps: - task: UseDotNet@2 displayName: Install .NET SDK inputs: packageType: sdk version: 10.0.x - task: DotNetCoreCLI@2 displayName: Run MSTest tests inputs: command: test projects: PrimeService.Tests/PrimeService.Tests.csproj arguments: --configuration Release publishTestResults: true調整設定以符合你的儲存庫:
- 如果你的分行名稱不同,請在
trigger中用該分行名稱取代main。 - 如果你的解決方案在子目錄中,請將
projects更新為測試專案相對於儲存庫根目錄的路徑。 - 如果你的專案針對不同的 .NET 版本,請在
UseDotNet@2任務中調整version以匹配。 例如,對於以8.0.x為目標的專案,請使用net8.0。 如果你的儲存庫包含global.json檔案,請確保已安裝的 SDK 符合其版本要求。
- 如果你的分行名稱不同,請在
提交並推送你的解決方案和
azure-pipelines.yml檔案到你的 Git 倉庫。在你的 Azure DevOps 專案中,選擇「Pipelines>」,或「建立管線」,如果這是你的第一個管線。 選擇你的儲存庫提供者和儲存庫。
在「配置你的管線」頁面,選擇「現有 Azure Pipelines YAML 檔案」,選擇分支和
/azure-pipelines.yml,然後選擇「繼續」。 檢視設定並選擇 執行。
該UseDotNet@2任務會安裝 .NET SDK。
該DotNetCoreCLI@2任務執行 dotnet test,其會還原相依性、建置測試專案及其參考函式庫,並在 Release 配置中執行測試。
當 publishTestResults: true時,任務會產生 TRX 結果檔案並發佈結果,即使測試失敗。 執行結束後,打開管線執行的 測試 分頁,檢視通過與失敗的測試。 測試失敗也會導致測試任務與管線失敗。
Note
這個範例使用了 .NET 10 SDK 的dotnet new mstest預設 VSTest 設定。 如果你啟用 Microsoft.Testing.Platform (MTP),請參閱「在持續整合中執行 MTP 測試」以了解所需的執行者配置。