使用 dotnet test 和 TUnit 對 Visual Basic .NET 函式庫進行單元測試

本教學課程會逐步引導您完成建置範例解決方案的互動式體驗,以瞭解單元測試概念。

本文是關於測試 .NET Core 專案。 如果您要測試 ASP.NET Core 專案,請參閱 ASP.NET Core 中的整合測試。

Prerequisites

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

TUnit 完全建立於 Microsoft.Testing.Platform (MTP) 上,不支援 VSTest。 本教學使用 MTP 模式dotnet test,需 .NET 10 SDK。

建立來源專案

開啟終端機視窗。 建立一個名為 unit-testing-vb-tunit 的目錄來存放解決方案。 在此新目錄內,執行下列命令,為類別庫和測試專案建立新的方案檔:

dotnet new sln

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

/unit-testing-vb-tunit
    unit-testing-vb-tunit.slnx
    /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-tunit 目錄。 執行下列命令,將類別庫專案新增至方案:

dotnet sln add ./PrimeService/PrimeService.vbproj

建立測試專案

接下來,建立 PrimeService.Tests 目錄。 下列大綱顯示目錄結構:

/unit-testing-vb-tunit
    unit-testing-vb-tunit.slnx
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests

TUnit 專案範本不包含在 .NET SDK 中。 請使用以下指令安裝:

dotnet new install TUnit.Templates

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

dotnet new TUnit -lang VB

Note

模板短名稱具有大小寫區分。 使用 TUnit,而不是 tunit。

dotnet new 指令會建立一個使用 TUnit 作為測試函式庫的測試專案。 產生的 PrimeService.Tests.vbproj 檔案是一個可執行專案,參考 TUnit 套件,包含測試框架、斷言函式庫和 MTP 測試執行器,因此專案不需要其他測試套件。

範本還新增了範例測驗。 請刪除 PrimeService.Tests 目錄中所有 .vb 檔案和 Data 目錄,因為這個教學會用自己的測試取代它們。

現在,將 PrimeService 類別庫新增為專案的另一個相依性。 使用 dotnet reference add 命令:

dotnet reference add ../PrimeService/PrimeService.vbproj

您有下列最終解答佈局:

/unit-testing-vb-tunit
    unit-testing-vb-tunit.slnx
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests
        Test Source Files
        PrimeService.Tests.vbproj

在 unit-testing-vb-tunit 目錄中執行以下指令:

dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj

設定 dotnet test 的 MTP 模式

因為 TUnit 不支援 VSTest,dotnet test 必須以 MTP 模式執行。 在 unit-testing-vb-tunit 目錄中,建立一個包含以下內容的 global.json 檔案:

{
    "test": {
        "runner": "Microsoft.Testing.Platform"
    }
}

欲了解更多資訊,請參閱 dotnet 測試的 MTP 模式。

建立第一個測試

您撰寫一個失敗的測試,讓它通過,接著重複這個過程。 在 PrimeService.Tests 目錄中,建立一個包含以下程式碼的 PrimeService_IsPrimeShould.vb 檔案:

Imports TUnit.Assertions
Imports TUnit.Assertions.Extensions
Imports TUnit.Core

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

        <Test>
        Public Async Function IsPrime_InputIs1_ReturnFalse() As Task
            Dim result As Boolean = _primeService.IsPrime(1)

            Await Assert.That(result).IsFalse()
        End Function

    End Class
End Namespace

<Test> 屬性表示由測試運行器執行的方法。 TUnit 不需要在類別上設定屬性。 TUnit 的斷言是非同步的,因此測試是會傳回 Task 並等待 Assert.That 的 Async Function。

Visual Basic 會把程式碼放在每個專案的根命名空間底下,所以PrimeService類別就在該專案的PrimeService.Prime.Services命名空間裡。 測試之所以將其稱為 Prime.Services.PrimeService,是因為在測試專案的命名空間中,名稱 PrimeService 指向的是命名空間,而非類別。

從 unit-testing-vb-tunit 目錄中,執行 dotnet test 以建立測試和類別函式庫,然後執行測試。 TUnit 測試專案包含執行測試的程式入口點。 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-tunit 目錄中,再次執行 dotnet test 。 dotnet test 命令會執行 PrimeService 項目的組建,然後執行 PrimeService.Tests 項目的組建。 建置這兩個項目之後,它會執行此單一測試。 它通過了。

新增更多功能

既然您已通過一次測試,現在是時候撰寫更多了。 關於質數,有一些其他的特殊情況:0、-1。 你可以使用<Test>屬性將這些案例新增為新的測試,但這很快就會變得乏味。 TUnit 提供 <Arguments> 屬性,可用來建立一套執行相同程式碼但輸入參數不同的測試套件。

不要建立新的測試,請套用此屬性來建立單一數據驅動測試。 將 IsPrime_InputIs1_ReturnFalse 函數替換為以下程式碼,測試多個小於二(最小的質數)的值:

<Test>
<Arguments(-1)>
<Arguments(0)>
<Arguments(1)>
Public Async Function IsPrime_ValuesLessThan2_ReturnFalse(value As Integer) As Task
    Dim result As Boolean = _primeService.IsPrime(value)

    Await Assert.That(result).IsFalse()
End Function

執行 dotnet test,其中兩個測試會失敗。 要讓所有測試通過,請在 IsPrime 檔案中的 If 方法開頭更改 子句:

If candidate < 2 Then

持續迭代,增加更多測試和主函式庫的程式碼。

您已建立一個小型程式庫及其一組單元測試。 您已建構解決方案,以便新增新的套件和測試是一般工作流程的一部分。 您大部分的時間和精力都集中在解決應用程式的目標上。

也請參閱