このチュートリアルでは、単体テストの概念を学習するためのサンプル ソリューションを段階的に構築する対話型エクスペリエンスについて説明します。 事前に構築されたソリューションを使ってチュートリアルを進めたい場合は、開始する前にサンプルコードを表示またはダウンロードしてください。 ダウンロード手順については、サンプルとチュートリアルを参照してください。
この記事では、.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.3.2" />
<PackageReference Include="NUnit3TestAdapter" Version="5.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="NUnit.Analyzers" Version="4.9.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
注
.NET 9 より前のバージョンの NUnit テスト フレームワークでは、生成されたコードが古いバージョンの NUnit テスト フレームワークを参照している可能性があります。 dotnet CLI を使用してパッケージを更新できます。 または、 PrimeService.Tests.csproj ファイルを開き、パッケージ参照項目グループの内容を上記のコードに置き換えます。
テスト プロジェクトでは、単体テストを作成して実行するために他のパッケージが必要です。 前の手順の dotnet new
コマンドは、Microsoft テスト SDK、NUnit テスト フレームワーク、および NUnit テスト アダプターを追加しました。 次に、 PrimeService
クラス ライブラリを別の依存関係としてプロジェクトに追加します。
dotnet reference add
コマンドを使用します。
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 should not 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
ファイルにある Main
メソッドの冒頭の 句を変更します。
if (candidate < 2)
メイン ライブラリにテスト、理論、およびコードを追加して、反復を続けます。 テストの完了バージョンとライブラリの完全な実装があります。
あなたは、小さなライブラリとそのライブラリの単体テストのセットを構築しました。 また、新しいパッケージとテストの追加が標準ワークフローの一部になるように、ソリューションを構成しました。 アプリケーションの目標を解決するために、ほとんどの時間と労力が集中しています。
.NET