このチュートリアルでは、単体テストの概念を学習するためのサンプル ソリューションを段階的に構築する対話型エクスペリエンスについて説明します。 事前に構築されたソリューションを使ってチュートリアルを進めたい場合は、開始する前にサンプルコードを表示またはダウンロードしてください。 ダウンロード手順については、サンプルとチュートリアルを参照してください。
この記事では、.NET Core プロジェクトのテストについて説明します。 もし ASP.NET Core プロジェクトをテストする場合は、ASP.NET Core の統合テストを参照してください。
[前提条件]
- 最新の .NET SDK
- Visual Studio Code エディター
- C# DevKit
ソース プロジェクトの作成
シェル ウィンドウを開きます。 ソリューションを保持するために 、unit-testing-using-nunit という名前のディレクトリを作成します。 この新しいディレクトリ内で、次のコマンドを実行して、クラス ライブラリとテスト プロジェクト用の新しいソリューション ファイルを作成します。
dotnet new sln
次に、 PrimeService ディレクトリを作成します。 次のアウトラインは、これまでのディレクトリとファイルの構造を示しています。
/unit-testing-using-nunit
unit-testing-using-nunit.sln
/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-nunit ディレクトリに戻します。 次のコマンドを実行して、クラス ライブラリ プロジェクトをソリューションに追加します。
dotnet sln add PrimeService/PrimeService.csproj
テスト プロジェクトの作成
次に、 PrimeService.Tests ディレクトリを作成します。 次のアウトラインは、ディレクトリ構造を示しています。
/unit-testing-using-nunit
unit-testing-using-nunit.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
ディレクトリを PrimeService.Tests ディレクトリに変更し、次のコマンドを使用して新しいプロジェクトを作成します。
dotnet new nunit
dotnet new コマンドは、テスト ライブラリとして NUnit を使用するテスト プロジェクトを作成します。 生成されたテンプレートは、 PrimeService.Tests.csproj ファイルでテスト ランナーを構成します。
<ItemGroup>
<PackageReference Include="nunit" Version="4.4.0" />
<PackageReference Include="NUnit3TestAdapter" Version="5.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
<PackageReference Include="NUnit.Analyzers" Version="4.11.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
注
.NET 9 より前では、生成されたコードが古いバージョンの NUnit テスト フレームワークを参照している可能性があります。 dotnet CLI を使用してパッケージを更新できます。 または、 PrimeService.Tests.csproj ファイルを開き、パッケージ参照項目グループの内容を前に示したコードに置き換えます。
テスト プロジェクトでは、単体テストを作成して実行するために他のパッケージが必要です。 前の手順の dotnet new コマンドは、Microsoft テスト SDK、NUnit テスト フレームワーク、および NUnit テスト アダプターを追加しました。 次に、 PrimeService クラス ライブラリを別の依存関係としてプロジェクトに追加します。
dotnet add reference コマンドを使用します。
dotnet add reference ../PrimeService/PrimeService.csproj
注
.NET 10 SDK 以降を使用している場合は、"名詞第 1" 形式 ( dotnet reference add ../PrimeService/PrimeService.csproj) を使用できます。
ファイル全体は GitHub の サンプル リポジトリ で確認できます。
次のアウトラインは、最終的なソリューション レイアウトを示しています。
/unit-testing-using-nunit
unit-testing-using-nunit.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Test Source Files
PrimeService.Tests.csproj
unit-testing-using-nunit ディレクトリで次のコマンドを実行します。
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
最初のテストの作成
失敗したテストを 1 つ記述し、合格させ、プロセスを繰り返します。 PrimeService.Tests ディレクトリで、UnitTest1.cs ファイルの名前をPrimeService_IsPrimeShould.csに変更し、その内容全体を次のコードに置き換えます。
using NUnit.Framework;
using Prime.Services;
namespace Prime.UnitTests.Services
{
[TestFixture]
public class PrimeService_IsPrimeShould
{
private PrimeService _primeService;
[SetUp]
public void SetUp()
{
_primeService = new PrimeService();
}
[Test]
public void IsPrime_InputIs1_ReturnFalse()
{
var result = _primeService.IsPrime(1);
Assert.That(result, Is.False, "1 shouldn't be prime");
}
}
}
[TestFixture]属性は、単体テストを含むクラスを表します。
[Test]属性は、メソッドがテスト メソッドであることを示します。
このファイルを保存し、 dotnet test コマンドを実行してテストとクラス ライブラリをビルドし、テストを実行します。 NUnit テスト ランナーには、テストを実行するためのプログラム エントリ ポイントが含まれています。
dotnet test は、作成した単体テスト プロジェクトを使用してテスト ランナーを開始します。
テストが失敗します。 実装はまだ作成していません。 動作する PrimeService クラスで最も単純なコードを記述して、テストを成功させる。
public bool IsPrime(int candidate)
{
if (candidate == 1)
{
return false;
}
throw new NotImplementedException("Please create a test first.");
}
unit-testing-using-nunit ディレクトリで、dotnet testをもう一度実行します。
dotnet test コマンドは、PrimeService プロジェクトのビルドを実行してから、PrimeService.Tests プロジェクトに対してビルドを実行します。 両方のプロジェクトをビルドすると、この 1 つのテストが実行されます。 成功します。
その他の機能の追加
これで 1 つのテスト パスを作成しました。次は、さらに記述します。 素数には、他にも 0、-1 という単純なケースがいくつかあります。
[Test]属性を使用して新しいテストを追加することもできますが、すぐに面倒になります。 同様のテストのスイートを記述できる他の NUnit 属性があります。
[TestCase]属性は、同じコードを実行するが、入力引数が異なる一連のテストを作成するために使用されます。
[TestCase]属性を使用して、これらの入力の値を指定できます。
新しいテストを作成する代わりに、この属性を適用して 1 つのデータ ドリブン テストを作成します。 データ ドリブン テストは、2 未満の複数の値をテストするメソッドです。これは最も小さい素数です。
[TestCase(-1)]
[TestCase(0)]
[TestCase(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
var result = _primeService?.IsPrime(value);
Assert.That(result, Is.False, $"{value} should not be prime");
}
dotnet test を実行すると、これらのテストのうち 2 つが失敗します。 すべてのテストに合格させるためには、if ファイルにある IsPrime メソッドの冒頭の 句を変更します。
if (candidate < 2)
メイン ライブラリにテスト、理論、およびコードを追加して、反復を続けます。 テストの完了バージョンとライブラリの完全な実装があります。
小さなライブラリとそのライブラリの単体テストのセットを作成しました。 また、新しいパッケージとテストの追加が標準ワークフローの一部になるように、ソリューションを構成しました。 アプリケーションの目標を解決するために、ほとんどの時間と労力が集中しています。
.NET