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
テスト ソリューションを作成する手順を次に示します。 テスト ソリューションをワンステップで作成する手順については、テスト ソリューションを作成するためのコマンドに関する記事を参照してください。
シェル ウィンドウを開きます。
次のコマンドを実行します。
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
上記のコマンドにより、次のことが行われます。
- PrimeService.Tests ディレクトリに PrimeService.Tests プロジェクトが作成されます。 このテスト プロジェクトでは、テスト ライブラリとして xUnit が使用されます。
- プロジェクト ファイルに次の
<PackageReference />
要素を追加することで、テスト ランナーを構成します。- "Microsoft.NET.Test.Sdk"
- "xunit"
- "xunit.runner.visualstudio"
次のコマンドを実行して、ソリューション ファイルにテスト プロジェクトを追加します。
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
PrimeService.Tests プロジェクトへの依存関係として
PrimeService
クラス ライブラリを追加します。dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
ソリューションを作成するためのコマンド
このセクションでは、前のセクション内のすべてのコマンドの概要を示します。 前のセクションの手順を完了している場合は、このセクションをスキップしてください。
次のコマンドによって、Windows コンピューター上にテスト ソリューションが作成されます。 macOS と Unix の場合は、ren
コマンドを ren
の OS バージョンに更新してファイルの名前を変更します。
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
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 test コマンドで、両方のプロジェクトをビルドし、テストを実行します。 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
メソッドは、素数性をテストするための効率的なアルゴリズムではありません。
その他の技術情報
.NET