使用 dotnet test 與 MSTest 為 Visual Basic .NET Core 程式庫進行單元測試
本教學課程會引導您逐步進行建置範例方案的互動式體驗,以了解單元測試概念。 如果您想要使用預先建置的方案進行教學課程,請在開始之前檢視或下載範例程式碼。 如需下載指示,請參閱範例和教學課程。
本文旨在說明如何測試 .NET Core 專案。 如果您要測試 ASP.NET Core 專案,請參閱 ASP.NET Core 中的整合測試。
建立來源專案
開啟 Shell 視窗。 建立名為 unit-testing-vb-mstest 的目錄來放置解決方案。
在這個新目錄中,執行 dotnet new sln
以建立新方案。 此練習可讓您更輕鬆地管理類別庫與單元測試專案。
在方案目錄中,建立 PrimeService 目錄。 到目前為止,您有下列目錄與檔案結構:
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
將 PrimeService 設為目前的目錄,然後執行 dotnet new classlib -lang VB
以建立來源專案。 將 Class1.VB 重新命名為 PrimeService.VB。 建立會失敗的 PrimeService
類別實作:
Namespace Prime.Services
Public Class PrimeService
Public Function IsPrime(candidate As Integer) As Boolean
Throw New NotImplementedException("Please create a test first")
End Function
End Class
End Namespace
將目錄變更回 unit-testing-vb-using-mstest 目錄。 執行 dotnet sln add .\PrimeService\PrimeService.vbproj
以將類別庫專案加到方案中。
建立測試專案
接著,建立 PrimeService.Tests 目錄。 下列大綱顯示目錄結構:
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
將 PrimeService.Tests 目錄設為目前的目錄,然後使用 dotnet new mstest -lang VB
建立新的專案。 此命令會建立將 MSTest 用作為測試程式庫的測試專案。 產生的範本會在 PrimeServiceTests.vbproj 中設定測試執行器:
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
<PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
<PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</ItemGroup>
測試專案需要其他套件來建立和執行單元測試。 上一個步驟中的 dotnet new
已新增 MSTest 和 MSTest 執行器。 現在,將 PrimeService
類別庫新增為專案的另一個相依性。 使用 dotnet add reference
命令:
dotnet add reference ../PrimeService/PrimeService.vbproj
您可以在 GitHub 的範例存放庫中看到完整檔案。
您有下列最終方案配置:
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
Test Source Files
PrimeServiceTests.vbproj
執行 unit-testing-vb-mstest 目錄中的 dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj
。
建立第一個測試
您會撰寫一個失敗測試,讓它通過,然後重複此程序。 將 UnitTest1.vb 從 PrimeService.Tests 目錄移除,並建立名為 PrimeService_IsPrimeShould.VB 的新 Visual Basic 檔案。 新增下列程式碼:
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Namespace PrimeService.Tests
<TestClass>
Public Class PrimeService_IsPrimeShould
Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
<TestMethod>
Sub IsPrime_InputIs1_ReturnFalse()
Dim result As Boolean = _primeService.IsPrime(1)
Assert.IsFalse(result, "1 should not be prime")
End Sub
End Class
End Namespace
<TestClass>
屬性指出包含測試的類別。 <TestMethod>
屬性表示由測試執行器執行的方法。 從 unit-testing-vb-mstest,執行 dotnet test
來建置測試及類別庫,然後執行測試。 MSTest 測試執行器包含執行測試的程式進入點。 dotnet test
會使用您建立的單元測試專案來開始測試執行器。
您的測試失敗。 您尚未建立實作。 在可運作的 PrimeService
類別中撰寫最簡單的程式碼以讓此測試成功:
Public Function IsPrime(candidate As Integer) As Boolean
If candidate = 1 Then
Return False
End If
Throw New NotImplementedException("Please create a test first.")
End Function
在 unit-testing-vb-mstest 目錄中,再次執行 dotnet test
。 dotnet test
命令會依序執行 PrimeService
專案和 PrimeService.Tests
專案的建置。 建置這兩個專案之後,它將會執行此單一測試。 測試通過。
新增更多功能
現在,您已經讓一個測試順利通過,您可以撰寫更多測試。 還有一些其他適用於質數 0、-1 的簡單案例。 您可以使用 <TestMethod>
屬性將那些案例新增為新測試,但很快就會單調乏味。 因此,還有其他 MSTest 屬性,可讓您撰寫類似的測試套件。 <DataTestMethod>
屬性代表執行相同程式碼但有不同輸入引數的測試套件。 您可以使用 <DataRow>
屬性來指定這些輸入值。
您不需要建立新測試,只要套用這兩個屬性以建立單一理論即可。 該理論是一種方法,這種方法會測試數個低於二 (最小的質數) 的值:
<TestClass>
Public Class PrimeService_IsPrimeShould
Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
<DataTestMethod>
<DataRow(-1)>
<DataRow(0)>
<DataRow(1)>
Sub IsPrime_ValuesLessThan2_ReturnFalse(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsFalse(result, $"{value} should not be prime")
End Sub
<DataTestMethod>
<DataRow(2)>
<DataRow(3)>
<DataRow(5)>
<DataRow(7)>
Public Sub IsPrime_PrimesLessThan10_ReturnTrue(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsTrue(result, $"{value} should be prime")
End Sub
<DataTestMethod>
<DataRow(4)>
<DataRow(6)>
<DataRow(8)>
<DataRow(9)>
Public Sub IsPrime_NonPrimesLessThan10_ReturnFalse(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsFalse(result, $"{value} should not be prime")
End Sub
End Class
執行 dotnet test
,然後會有兩個測試失敗。 若要使所有測試通過,請變更方法開頭的 if
子句:
if candidate < 2
繼續在主要程式庫中新增更多測試、更多理論和更多程式碼,以反覆執行。 您有測試的完成版和程式庫的完整實作。
您已建置好小型的程式庫和該程式庫的一組單元測試, 您已建立方案結構,因此加入新套件與測試是一般工作流程的一部分。 您已集中大部分的時間與精力以解決應用程式目標。