使用 dotnet test 與 NUnit 為 Visual Basic .NET Core 程式庫進行單元測試

本教學課程會引導您逐步進行建置範例方案的互動式體驗,以了解單元測試概念。 如果您想要使用預先建置的方案進行教學課程,請在開始之前檢視或下載範例程式碼。 如需下載指示,請參閱範例和教學課程

本文說明如何測試 .NET Core 專案。 如果您要測試ASP.NET Core專案,請參閱ASP.NET Core 中的整合測試

必要條件

  • .NET Core 2.1 SDK 或更新版本。
  • 您偏好的文字編輯器或程式碼編輯器。

建立來源專案

開啟 Shell 視窗。 建立名稱為 unit-testing-vb-nunit 的目錄來放置方案。 在此新目錄中,執行下列命令以針對類別庫與測試專案建立新方案檔:

dotnet new sln

接著,建立 PrimeService 目錄。 下列大綱顯示到目前為止的檔案結構:

/unit-testing-vb-nunit
    unit-testing-vb-nunit.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-nunit
    unit-testing-vb-nunit.sln
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests

PrimeService.Tests 目錄設為目前的目錄,然後使用下列命令建立新的專案:

dotnet new nunit -lang VB

dotnet new 命令會建立將 NUnit 用作測試程式庫的測試專案。 產生的範本會在 PrimeServiceTests.vbproj 檔案中設定測試執行器:

<ItemGroup>
  <PackageReference Include="nunit" Version="3.13.3" />
  <PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
</ItemGroup>

測試專案需要其他套件來建立和執行單元測試。 上一個步驟中的 dotnet new 新增了 NUnit 與 NUnit 測試配接器。 現在,將 PrimeService 類別庫新增為專案的另一個相依性。 使用 dotnet add reference 命令:

dotnet add reference ../PrimeService/PrimeService.vbproj

您可以在 GitHub 的範例存放庫中看到完整檔案。

您有下列最終方案配置:

/unit-testing-vb-nunit
    unit-testing-vb-nunit.sln
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests
        Test Source Files
        PrimeService.Tests.vbproj

unit-testing-vb-nunit 目錄中執行下列命令:

dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj

建立第一個測試

撰寫一個會失敗的測試,再使其通過,然後重複這個過程。 在 PrimeService.Tests 目錄中,將 UnitTest1.vb 檔案重新命名為 PrimeService_IsPrimeShould.VB,並將其整個內容取代為下列程式碼:

Imports NUnit.Framework

Namespace PrimeService.Tests
    <TestFixture>
    Public Class PrimeService_IsPrimeShould
        Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()

        <Test>
        Sub IsPrime_InputIs1_ReturnFalse()
            Dim result As Boolean = _primeService.IsPrime(1)

            Assert.False(result, "1 should not be prime")
        End Sub

    End Class
End Namespace

<TestFixture> 屬性指出包含測試的類別。 <Test> 屬性表示由測試執行器執行的方法。 從 unit-testing-vb-nunit,執行 來建置測試及類別庫,然後執行測試。 NUnit 測試執行器包含執行測試的程式進入點。 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-nunit 目錄中,再次執行 dotnet test 命令會依序執行 PrimeService 專案和 PrimeService.Tests 專案的建置。 建置這兩個專案之後,它將會執行此單一測試。 測試通過。

新增更多功能

現在,您已經讓一個測試順利通過,您可以撰寫更多測試。 還有一些其他適用於質數 0、-1 的簡單案例。 您可以使用 <Test> 屬性將那些案例新增為新測試,但很快就會單調乏味。 因此,還有其他 xUnit 屬性,可讓您撰寫類似的測試套件。 <TestCase> 屬性代表執行相同程式碼但有不同輸入引數的測試套件。 您可以使用 <TestCase> 屬性來指定這些輸入值。

您不需要建立新的測試,而可以改為套用這兩個屬性來建立一系列的測試,以測試數個小於 2 (最小質數) 的值:

<TestFixture>
Public Class PrimeService_IsPrimeShould
    Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()

    <TestCase(-1)>
    <TestCase(0)>
    <TestCase(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

    <TestCase(2)>
    <TestCase(3)>
    <TestCase(5)>
    <TestCase(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

    <TestCase(4)>
    <TestCase(6)>
    <TestCase(8)>
    <TestCase(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 檔案中 Main 方法開頭處的 if 子句:

if candidate < 2

繼續在主要程式庫中新增更多測試、更多理論和更多程式碼,以反覆執行。 您有測試的完成版程式庫的完整實作

您已建置好小型的程式庫和該程式庫的一組單元測試, 您已建立方案結構,因此加入新套件與測試是一般工作流程的一部分。 您已集中大部分的時間與精力以解決應用程式目標。