このチュートリアルでは、単体テスト プロジェクトとライブラリ プロジェクトを含むソリューションを構築する方法について説明します。 事前構築済みのソリューションを使用してチュートリアルに従う場合は、 サンプル コードを表示またはダウンロードします。 ダウンロード手順については、サンプルとチュートリアルを参照してください。
ソリューションを作成する
このセクションでは、ソース プロジェクトとテスト プロジェクトを含むソリューションを作成します。 完成したソリューションのディレクトリ構造は次のとおりです。
/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
メソッドは、原始性をテストするための効率的なアルゴリズムではありません。
その他のリソース
.NET