このチュートリアルでは、単体テストの概念を学習するためのサンプル ソリューションを段階的に構築する対話型エクスペリエンスについて説明します。
この記事では、.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-using-tunit という名前のディレクトリを作成します。 この新しいディレクトリ内で、次のコマンドを実行して、クラス ライブラリとテスト プロジェクト用の新しいソリューション ファイルを作成します。
dotnet new sln
次に、 PrimeService ディレクトリを作成します。 次のアウトラインは、これまでのディレクトリとファイルの構造を示しています。
/unit-testing-using-tunit
unit-testing-using-tunit.slnx
/PrimeService
PrimeService を現在のディレクトリにし、次のコマンドを実行してソース プロジェクトを作成します。
dotnet new classlib
Class1.cs の名前を PrimeService.cs に変更します。
PrimeService クラスの失敗した実装を作成します。
using System;
namespace Prime.Services
{
public class PrimeService
{
public bool IsPrime(int candidate)
{
throw new NotImplementedException("Please create a test first.");
}
}
}
unit-testing-using-tunit ディレクトリに再び戻ります。 次のコマンドを実行して、クラス ライブラリ プロジェクトをソリューションに追加します。
dotnet sln add PrimeService/PrimeService.csproj
テスト プロジェクトの作成
次に、 PrimeService.Tests ディレクトリを作成します。 次のアウトラインは、ディレクトリ構造を示しています。
/unit-testing-using-tunit
unit-testing-using-tunit.slnx
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
TUnit プロジェクト テンプレートは、.NET SDK には含まれません。 次のコマンドを使用してインストールします。
dotnet new install TUnit.Templates
ディレクトリを PrimeService.Tests ディレクトリに変更し、次のコマンドを使用して新しいプロジェクトを作成します。
dotnet new TUnit
Note
テンプレートの短縮名では大文字と小文字は区別されます。
TUnit ではなく、tunit を使用してください。
dotnet new コマンドは、TUnit をテスト ライブラリとして使用するテスト プロジェクトを作成します。 生成された PrimeService.Tests.csproj ファイルは、 TUnit パッケージを参照する実行可能プロジェクトです (バージョン番号が異なる場合があります):
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="TUnit" Version="1.*" />
</ItemGroup>
TUnit パッケージにはテスト フレームワーク、アサーション ライブラリ、MTP テスト ランナーが含まれているため、プロジェクトには他のテスト パッケージは必要ありません。 このテンプレートでは、サンプル テストも追加されます。 このチュートリアルでは独自のテストに置き換えられるため、すべての .cs ファイルと Data ディレクトリを PrimeService.Tests ディレクトリから削除します。
次に、 PrimeService クラス ライブラリを別の依存関係としてプロジェクトに追加します。
dotnet reference add コマンドを使用する。
dotnet reference add ../PrimeService/PrimeService.csproj
次のアウトラインは、最終的なソリューション レイアウトを示しています。
/unit-testing-using-tunit
unit-testing-using-tunit.slnx
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Test Source Files
PrimeService.Tests.csproj
unit-testing-using-tunit ディレクトリで次のコマンドを実行します。
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
dotnet test の MTP モードの構成方法
TUnit は VSTest をサポートしていないため、dotnet test は MTP モードで実行される必要があります。
unit-testing-using-tunit ディレクトリで、次の内容を含む global.json ファイルを作成します。
{
"test": {
"runner": "Microsoft.Testing.Platform"
}
}
詳細については、dotnet test の MTP モードを参照してください。
最初のテストの作成
失敗したテストを 1 つ記述し、合格させ、プロセスを繰り返します。 PrimeService.Tests ディレクトリで、次のコードを含む PrimeService_IsPrimeShould.cs ファイルを作成します。
namespace Prime.UnitTests.Services
{
using Prime.Services;
public class PrimeService_IsPrimeShould
{
private readonly PrimeService _primeService = new();
[Test]
public async Task IsPrime_InputIs1_ReturnFalse()
{
var result = _primeService.IsPrime(1);
await Assert.That(result).IsFalse();
}
}
}
[Test]属性は、メソッドがテスト メソッドであることを示します。 TUnit では、クラスに属性は必要ありません。 TUnit アサーションは非同期であるため、テスト メソッドは Task を返し、 Assert.Thatを待機します。
TUnit パッケージは、その名前空間にグローバル using ディレクティブを追加するので、そのファイルではそれらのディレクティブは不要です。
Note
using Prime.Services; ディレクティブは、意図的に名前空間内にあります。 MTP は、テスト アプリケーションのエントリ ポイントをプロジェクトのルート名前空間に生成します。PrimeService.Tests その名前空間では、ファイルの先頭にあるPrimeService ディレクティブからusing クラスが非表示になりますが、名前空間内のディレクティブからは非表示になりません。
このファイルを保存し、 dotnet test コマンドを実行してテストとクラス ライブラリをビルドし、テストを実行します。 TUnit テスト プロジェクトには、テストを実行するためのプログラム エントリ ポイントが含まれています。
dotnet test は、作成した単体テスト プロジェクトを使用してテスト アプリケーションを起動します。
テストが失敗します。 実装はまだ作成していません。 動作する PrimeService クラスで最も単純なコードを記述して、テストを成功させる。
public bool IsPrime(int candidate)
{
if (candidate == 1)
{
return false;
}
throw new NotImplementedException("Please create a test first.");
}
unit-testing-using-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 Task IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
var result = _primeService.IsPrime(value);
await Assert.That(result).IsFalse();
}
dotnet test を実行すると、これらのテストのうち 2 つが失敗します。 すべてのテストに合格させるためには、if ファイルにある IsPrime メソッドの冒頭の 句を変更します。
if (candidate < 2)
メイン ライブラリにさらにテストとコードを追加して、反復を続けます。
小さなライブラリとそのライブラリの単体テストのセットを作成しました。 また、新しいパッケージとテストの追加が標準ワークフローの一部になるように、ソリューションを構成しました。 アプリケーションの目標を解決するために、ほとんどの時間と労力が集中しています。
参照
- TUnit のドキュメント
- 選択した単体テストを実行する
- 単体テストの順序を設定する
- dotnet reference add コマンドを使用して参照を追加します。
- dotnet test
.NET