次の方法で共有


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

このチュートリアルでは、単体テスト プロジェクトとライブラリ プロジェクトを含むソリューションを構築する方法について説明します。 事前構築済みのソリューションを使用してチュートリアルに従う場合は、 サンプル コードを表示またはダウンロードします。 ダウンロード手順については、サンプルとチュートリアルを参照してください。

ソリューションを作成する

このセクションでは、ソース プロジェクトとテスト プロジェクトを含むソリューションを作成します。 完成したソリューションのディレクトリ構造は次のとおりです。

/unit-testing-using-dotnet-test
    unit-testing-using-dotnet-test.sln
    /PrimeService
        PrimeService.vb
        PrimeService.vbproj
    /PrimeService.Tests
        PrimeService_IsPrimeShould.vb
        PrimeServiceTests.vbproj

次の手順では、テスト ソリューションを作成する手順を示します。 1 つの手順で テスト ソリューションを作成 する手順については、「テスト ソリューションを作成するコマンド」を参照してください。

  • シェル ウィンドウを開きます。

  • 次のコマンドを実行します。

    dotnet new sln -o unit-testing-using-dotnet-test
    

    dotnet new sln コマンドは、unit-testing-using-dotnet-test ディレクトリに新しいソリューションを作成します。

  • ディレクトリを unit-testing-using-dotnet-test フォルダーに変更します。

  • 次のコマンドを実行します。

    dotnet new classlib -o PrimeService -lang VB
    

    dotnet new classlib コマンドは、PrimeService フォルダーに新しいクラス ライブラリ プロジェクトを作成します。 新しいクラス ライブラリには、テストするコードが含まれます。

  • Class1.vbの名前を PrimeService.vb に変更します。

  • PrimeService.vbのコードを次のコードに置き換えます。

    Imports System
    
    Namespace Prime.Services
        Public Class PrimeService
            Public Function IsPrime(candidate As Integer) As Boolean
                Throw New NotImplementedException("Not implemented.")
            End Function
        End Class
    End Namespace
    
  • 前述のコード:

    • 実装されていないことを示すメッセージを含む NotImplementedException がスローされます。
    • チュートリアルの後半で更新されます。
  • unit-testing-using-dotnet-test ディレクトリで、次のコマンドを実行して、クラス ライブラリ プロジェクトをソリューションに追加します。

    dotnet sln add ./PrimeService/PrimeService.vbproj
    
  • 次のコマンドを実行して 、PrimeService.Tests プロジェクトを作成します。

    dotnet new xunit -o PrimeService.Tests -lang VB
    
  • 上記のコマンドでは次のことが行われます。

    • PrimeService.Tests ディレクトリに PrimeService.Tests プロジェクトを作成します。 テスト プロジェクトでは、テスト ライブラリとして xUnit が使用されます。
    • 次の <PackageReference />要素をプロジェクト ファイルに追加して、テスト ランナーを構成します。
      • "Microsoft.NET.Test.Sdk"
      • "xunit"
      • "xunit.runner.visualstudio"
  • 次のコマンドを実行して、ソリューション ファイルにテスト プロジェクトを追加します。

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
    
  • PrimeService クラス ライブラリを依存関係として PrimeService.Tests プロジェクトに追加します。

    dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
    

ソリューションを作成するコマンド

このセクションでは、前のセクションのすべてのコマンドの概要を示します。 前のセクションの手順を完了した場合は、このセクションをスキップします。

次のコマンドは、Windows マシン上にテスト ソリューションを作成します。 macOS および Unix の場合は、 ren コマンドを OS バージョンの ren に更新して、ファイルの名前を変更します。

dotnet new sln -o unit-testing-using-dotnet-test
cd unit-testing-using-dotnet-test
dotnet new classlib -o PrimeService
ren .\PrimeService\Class1.vb PrimeService.vb
dotnet sln add ./PrimeService/PrimeService.vbproj
dotnet new xunit -o PrimeService.Tests -lang VB
dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj

前のセクションの「 PrimeService.vb のコードを次のコードに置き換える」の手順に従います。

テストの作成

テスト 駆動開発 (TDD) で一般的なアプローチは、ターゲット コードを実装する前にテストを記述することです。 このチュートリアルでは、TDD アプローチを使用します。 IsPrime メソッドは呼び出し可能ですが、実装されていません。 IsPrimeのテスト呼び出しが失敗します。 TDD では、失敗することがわかっているテストが記述されます。 ターゲット コードが更新され、テストが成功します。 このアプローチを繰り返し、失敗したテストを記述してから、合格するようにターゲット コードを更新します。

PrimeService.Tests プロジェクトを更新します。

  • PrimeService.Tests/UnitTest1.vb を削除します。
  • PrimeService.Tests/PrimeService_IsPrimeShould.vb ファイルを作成します。
  • PrimeService_IsPrimeShould.vbのコードを次のコードに置き換えます。
Imports Xunit

Namespace PrimeService.Tests
    Public Class PrimeService_IsPrimeShould
        Private ReadOnly _primeService As Prime.Services.PrimeService

        Public Sub New()
            _primeService = New Prime.Services.PrimeService()
        End Sub


        <Fact>
        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

[Fact]属性は、テスト ランナーによって実行されるテスト メソッドを宣言します。 PrimeService.Tests フォルダーから、dotnet test実行します。 dotnet テスト コマンドは、両方のプロジェクトをビルドし、テストを実行します。 xUnit テスト ランナーには、テストを実行するためのプログラム エントリ ポイントが含まれています。 dotnet test は、単体テスト プロジェクトを使用してテスト ランナーを開始します。

IsPrimeが実装されていないため、テストは失敗します。 TDD アプローチを使用して、このテストに合格するように十分なコードのみを記述します。 次のコードを使用して IsPrime を更新します。

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate = 1 Then
        Return False
    End If
    Throw New NotImplementedException("Not implemented.")
End Function

dotnet test を実行します。 テストは成功します。

さらにテストを追加する

0 と -1 の素数テストを追加します。 前のテストをコピーし、0 と -1 を使用するように次のコードを変更できます。

Dim result As Boolean = _primeService.IsPrime(1)

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

パラメーターのみが変更されたときにテスト コードをコピーすると、コードの重複とテストの肥大化が発生します。 次の xUnit 属性を使用すると、同様のテストのスイートを記述できます。

  • [Theory] は、同じコードを実行するが、入力引数が異なる一連のテストを表します。
  • [InlineData] 属性は、これらの入力の値を指定します。

新しいテストを作成するのではなく、上記の xUnit 属性を適用して、単一の理論を作成します。 次のコードを置き換えます。

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

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

次のコードを使用します。

<Theory>
<InlineData(-1)>
<InlineData(0)>
<InlineData(1)>
Sub IsPrime_ValuesLessThan2_ReturnFalse(ByVal value As Integer)
    Dim result As Boolean = _primeService.IsPrime(value)

    Assert.False(result, $"{value} should not be prime")
End Sub

前のコードでは、 [Theory][InlineData] 、2 未満の複数の値のテストを有効にします。 2 は最小の素数です。

dotnet testを実行すると、2 つのテストが失敗します。 すべてのテストに合格するには、次のコードを使用して IsPrime メソッドを更新します。

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate < 2 Then
        Return False
    End If
    Throw New NotImplementedException("Not fully implemented.")
End Function

TDD アプローチに従って、失敗したテストをさらに追加してから、ターゲット コードを更新します。 完成したバージョンのテストライブラリの完全な実装を参照してください。

完成した IsPrime メソッドは、原始性をテストするための効率的なアルゴリズムではありません。

その他のリソース