次の方法で共有


dotnet テストと NUnit を使用した Visual Basic .NET Core ライブラリの単体テスト

このチュートリアルでは、単体テストの概念を学習するためのサンプル ソリューションを段階的に構築する対話型エクスペリエンスについて説明します。 事前に構築されたソリューションを使ってチュートリアルを進めたい場合は、開始する前にサンプルコードを表示またはダウンロードしてください。 ダウンロード手順については、サンプルとチュートリアルを参照してください。

この記事では、.NET Core プロジェクトのテストについて説明します。 もし ASP.NET Core プロジェクトをテストする場合は、ASP.NET Core の統合テストを参照してください。

[前提条件]

  • .NET 8 SDK 以降のバージョン。
  • 任意のテキスト エディターまたはコード エディター。

ソース プロジェクトの作成

シェル ウィンドウを開きます。 ソリューションを保持する 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="4.3.2" />
  <PackageReference Include="NUnit3TestAdapter" Version="5.0.0" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
</ItemGroup>

.NET 9 より前のバージョンの NUnit テスト フレームワークでは、生成されたコードが古いバージョンの NUnit テスト フレームワークを参照している可能性があります。 dotnet CLI を使用してパッケージを更新できます。 または、 PrimeService.Tests.vbproj ファイルを開き、パッケージ参照項目グループの内容を上記のコードに置き換えます。

テスト プロジェクトでは、単体テストを作成して実行するために他のパッケージが必要です。 dotnet new 前の手順で NUnit と NUnit テスト アダプターを追加しました。 次に、 PrimeService クラス ライブラリを別の依存関係としてプロジェクトに追加します。 dotnet reference add コマンドを使用します。

dotnet reference add ../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

最初のテストの作成

失敗したテストを 1 つ記述し、合格させ、プロセスを繰り返します。 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.That(result, [Is].False, $"1 should not be prime")
        End Sub

    End Class
End Namespace

<TestFixture>属性は、テストを含むクラスを示します。 <Test>属性は、テスト ランナーによって実行されるメソッドを表します。 unit-testing-vb-nunit から、dotnet testを実行してテストとクラス ライブラリをビルドし、テストを実行します。 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をもう一度実行します。 dotnet test コマンドは、PrimeService プロジェクトのビルドを実行してから、PrimeService.Tests プロジェクトに対してビルドを実行します。 両方のプロジェクトをビルドした後、この 1 つのテストを実行します。 成功します。

その他の機能の追加

テストが1つ成功したので、さらに多くのテストケースを書きましょう。 素数には、他にも 0、-1 という単純なケースがいくつかあります。 これらのケースは、 <Test> 属性を持つ新しいテストとして追加できますが、それはすぐに面倒になります。 同様のテストのスイートを記述できる他の xUnit 属性があります。 <TestCase>属性は、同じコードを実行するが、入力引数が異なる一連のテストを表します。 <TestCase>属性を使用して、これらの入力の値を指定できます。

新しいテストを作成する代わりに、次の 2 つの属性を適用して、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.That(result, [Is].False, $"{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.That(result, [Is].True, $"{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.That(result, [Is].False, $"{value} should not be prime")
    End Sub
End Class

dotnet test を実行すると、これらのテストのうち 2 つが失敗します。 すべてのテストに合格するには、PrimeServices.cs ファイル内の if メソッドの先頭にある Main 句を変更します。

if candidate < 2

メイン ライブラリにテストを追加し、理論を増やし、さらに多くのコードを追加して、反復を続けます。 テストの完了バージョンライブラリの完全な実装があります。

あなたは、小さなライブラリとそのライブラリの単体テストのセットを構築しました。 新しいパッケージとテストの追加が通常のワークフローの一部になるように、ソリューションを構築しました。 アプリケーションの目標を解決するために、ほとんどの時間と労力が集中しています。