このチュートリアルでは、単体テストの概念を学習するためのサンプル ソリューションを段階的に構築する対話型エクスペリエンスについて説明します。
この記事では、.NET Core プロジェクトのテストについて説明します。 もし ASP.NET Core プロジェクトをテストする場合は、ASP.NET Core の統合テストを参照してください。
Prerequisites
- .NET 10 SDK またはそれ以降のバージョン。
- 任意のテキスト エディターまたはコード エディター。
TUnit は完全にMicrosoft.Testing.Platform (MTP) 上に構築されており、VSTest はサポートしていません。 このチュートリアルでは、dotnet testの MTP モードを使用します。これには、.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 モードを参照してください。
最初のテストの作成
失敗したテストを 1 つ記述し、合格させ、プロセスを繰り返します。 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 プロジェクトに対してビルドを実行します。 両方のプロジェクトをビルドした後、この 1 つのテストを実行します。 成功します。
その他の機能の追加
テストが1つ成功したので、さらに多くのテストケースを書きましょう。 素数には、他にも 0、-1 という単純なケースがいくつかあります。 これらのケースは、 <Test> 属性を持つ新しいテストとして追加できますが、それはすぐに面倒になります。 TUnit には、同じコードを実行するが異なる入力引数を持つ一連のテストを作成するための <Arguments> 属性が用意されています。
新しいテストを作成する代わりに、この属性を適用して 1 つのデータ ドリブン テストを作成します。
IsPrime_InputIs1_ReturnFalse 関数を、最小の素数である 2 より小さい値をいくつかテストする次のコードに置き換えます。
<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 を実行すると、これらのテストのうち 2 つが失敗します。 すべてのテストを成功させるために、PrimeService.vb ファイルで IsPrime メソッドの先頭にある If 句を変更します。
If candidate < 2 Then
メイン ライブラリにさらにテストとコードを追加して、改善を続けます。
あなたは、小さなライブラリとそのライブラリの単体テストのセットを構築しました。 新しいパッケージとテストの追加が通常のワークフローの一部になるように、ソリューションを構築しました。 アプリケーションの目標を解決するために、ほとんどの時間と労力が集中しています。
参照
- TUnit のドキュメント
- dotnet reference add コマンドを使用して参照を追加します。
- dotnet test
.NET