このチュートリアルでは、単体テストの概念を学習するためのサンプル ソリューションを段階的に構築する対話型エクスペリエンスについて説明します。 事前に構築されたソリューションを使ってチュートリアルを進めたい場合は、開始する前にサンプルコードを表示またはダウンロードしてください。 ダウンロード手順については、サンプルとチュートリアルを参照してください。
この記事では、.NET Core プロジェクトのテストについて説明します。 もし ASP.NET Core プロジェクトをテストする場合は、ASP.NET Core の統合テストを参照してください。
[前提条件]
- 最新の .NET SDK
- Visual Studio Code エディター
- C# DevKit
ソース プロジェクトを作成する
シェル ウィンドウを開きます。 ソリューションを保持するための unit-testing-using-mstest という名前のディレクトリを作成します。 この新しいディレクトリ内で、 dotnet new sln を実行して、クラス ライブラリとテスト プロジェクト用の新しいソリューション ファイルを作成します。
PrimeService ディレクトリを作成します。 次のアウトラインは、これまでのディレクトリとファイルの構造を示しています。
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
PrimeService を現在のディレクトリにし、dotnet new classlib実行してソース プロジェクトを作成します。
ディレクトリを unit-testing-using-mstest ディレクトリに戻します。
dotnet sln addを実行して、クラス ライブラリ プロジェクトをソリューションに追加します。
dotnet sln add PrimeService/PrimeService.csproj
Class1.cs ディレクトリ内の PrimeService の名前を PrimeService.cs に変更します。 ファイル内のコードを次のコードに置き換えて、 PrimeService クラスの失敗した実装を作成します。
using System;
namespace Prime.Services
{
public class PrimeService
{
public bool IsPrime(int candidate)
{
throw new NotImplementedException("Please create a test first.");
}
}
}
テスト プロジェクトを作成する
PrimeService.Tests ディレクトリを作成します。 次のアウトラインは、ディレクトリ構造を示しています。
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
PrimeService.Tests ディレクトリを現在のディレクトリにし、dotnet new mstestを使用して新しいプロジェクトを作成します。 dotnet new コマンドは、MSTest をテスト ライブラリとして使用するテスト プロジェクトを作成します。 このテンプレートは、 PrimeServiceTests.csproj ファイルでテスト ランナーを構成します。
<ItemGroup>
<PackageReference Include="MSTest" Version="4.1.0" />
</ItemGroup>
Note
次に示すパッケージのバージョンは例です。
dotnet new mstest によって生成されるバージョンは、使用している .NET SDK に依存します。 テンプレートとダウンロードしたサンプルでは、最新の NuGet パッケージ バージョンが使用されない場合があります。
テストを作成して実行した後に更新プログラムを確認するには、テスト プロジェクト ディレクトリから dotnet package list --outdated を実行します。
dotnet package add <PACKAGE_NAME>を使用して、パッケージ参照を最新の互換性のある安定バージョンに更新します。 更新する前に、リリース ノートで破壊的変更を確認し、後でもう一度 dotnet test 実行してください。
.NET 9 SDK 以前を使用する場合は、代わりにdotnet list package --outdatedとdotnet add package <PACKAGE_NAME>を使用してください。
テスト プロジェクトでは、単体テストを作成して実行するために他のパッケージが必要です。
dotnet new 前の手順で、コード カバレッジ レポートに必要な MSTest パッケージとツールを追加しました。
PrimeService クラス ライブラリを別の依存関係としてプロジェクトに追加します。
dotnet reference add コマンドを使用します。
dotnet reference add ../PrimeService/PrimeService.csproj
ファイル全体は GitHub の サンプル リポジトリ で確認できます。
次のアウトラインは、最終的なソリューション レイアウトを示しています。
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Test Source Files
PrimeServiceTests.csproj
unit-testing-using-mstest ディレクトリに変更し、dotnet sln add実行します。
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
最初のテストを作成する
失敗したテストを記述し、合格してから、プロセスを繰り返します。 PrimeService.Tests ディレクトリからUnitTest1.csを削除し、次の内容を含む PrimeService_IsPrimeShould.cs という名前の新しい C# ファイルを作成します。
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Prime.Services;
namespace Prime.UnitTests.Services
{
[TestClass]
public class PrimeService_IsPrimeShould
{
private readonly PrimeService _primeService;
public PrimeService_IsPrimeShould()
{
_primeService = new PrimeService();
}
[TestMethod]
public void IsPrime_InputIs1_ReturnFalse()
{
bool result = _primeService.IsPrime(1);
Assert.IsFalse(result, "1 shouldn't be prime");
}
}
}
TestClass 属性は、単体テストを含むクラスを表します。 TestMethod 属性は、メソッドがテスト メソッドであることを示します。
MSTest はテストごとにテスト クラスの新しいインスタンスを作成するため、コンストラクターはテストごとに個別の PrimeService を作成します。 コンストラクターには、このクラスのすべてのテストに必要なセットアップのみが含まれています。 テストで別のセットアップが必要な場合は、テスト メソッド内でオブジェクトを作成するか、それらのメソッド内からヘルパー メソッドを呼び出します。 ガイダンスについては、「 セットアップと破棄の代わりにヘルパー メソッドを使用する」を参照してください。
このファイルを保存し、 dotnet test を実行してテストとクラス ライブラリをビルドし、テストを実行します。 MSTest テスト ランナーには、テストを実行するためのプログラム エントリ ポイントが含まれています。
dotnet test は、作成した単体テスト プロジェクトを使用してテスト ランナーを開始します。
実装をまだ作成していないため、テストは失敗します。 動作する PrimeService クラスで最も単純なコードを記述して、このテストを成功させる。
public bool IsPrime(int candidate)
{
if (candidate == 1)
{
return false;
}
throw new NotImplementedException("Please create a test first.");
}
unit-testing-using-mstest ディレクトリで、dotnet testをもう一度実行します。
dotnet test コマンドは、PrimeService プロジェクトのビルドを実行してから、PrimeService.Tests プロジェクトに対してビルドを実行します。 両方のプロジェクトをビルドした後、この 1 つのテストを実行します。 成功します。
その他の機能を追加する
これで 1 つのテスト パスを作成しました。次は、さらに記述します。 素数には、他にも 0、-1 という単純なケースがいくつかあります。 TestMethod 属性を使用して新しいテストを追加することもできますが、すぐに面倒になります。 同様のテストのスイートを記述できる他の MSTest 属性があります。 テスト メソッドは同じコードを実行できますが、入力引数は異なります。 DataRow 属性を使用して、これらの入力の値を指定できます。
新しいテストを作成する代わりに、これら 2 つの属性を適用して、1 つのデータ ドリブン テストを作成します。 データ ドリブン テストは、2 未満の複数の値 (最小素数) をテストするメソッドです。 PrimeService_IsPrimeShould.csに新しいテスト メソッドを追加します。
[TestMethod]
[DataRow(-1)]
[DataRow(0)]
[DataRow(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
bool result = _primeService.IsPrime(value);
Assert.IsFalse(result, $"{value} should not be prime");
}
dotnet test を実行すると、これらのテストのうち 2 つが失敗します。 すべてのテストに合格させるためには、if ファイルにある IsPrime メソッドの冒頭の 句を変更します。
if (candidate < 2)
メイン ライブラリにテストを追加し、理論を増やし、さらに多くのコードを追加して、反復を続けます。 テストの完了バージョンとライブラリの完全な実装があります。
小さなライブラリとそのライブラリの単体テストのセットを作成しました。 新しいパッケージとテストの追加が通常のワークフローの一部になるように、ソリューションを構造化しました。 アプリケーションの目標を解決するために、ほとんどの時間と労力を集中しました。
Azure Pipelinesでテストを実行する
変更をプッシュするときにテストを自動的に実行するには、完成したソリューションを含むリポジトリにAzure Pipelines構成を追加します。 Azure DevOps プロジェクトと、Microsoft がホストするエージェントへのアクセスが必要です。 前提条件については、最初のパイプラインを作成するを参照してください。
リポジトリのルートで、次の内容を含む
azure-pipelines.ymlファイルを作成してください。 この例では、PrimeServiceディレクトリとPrimeService.Testsディレクトリがリポジトリ ルートにあり、両方のプロジェクトのターゲットが .NET 10 であることを前提としています。trigger: - main pool: vmImage: ubuntu-latest steps: - task: UseDotNet@2 displayName: Install .NET SDK inputs: packageType: sdk version: 10.0.x - task: DotNetCoreCLI@2 displayName: Run MSTest tests inputs: command: test projects: PrimeService.Tests/PrimeService.Tests.csproj arguments: --configuration Release publishTestResults: trueリポジトリに合わせて構成を調整してください。
- ブランチの名前が異なる場合は、
mainのtriggerをそのブランチ名に置き換えます。 - ソリューションがサブディレクトリ内にある場合は、
projectsを、リポジトリ ルートからの相対パスであるテスト プロジェクトのパスに更新します。 - プロジェクトの対象となる .NET のバージョンが異なる場合は、
UseDotNet@2タスク内のversionをそれに合わせて変更します。 たとえば、net8.0を対象とするプロジェクトには8.0.xを使用します。 リポジトリにglobal.jsonファイルが含まれている場合は、インストールされている SDK がバージョン要件を満たしていることを確認してください。
- ブランチの名前が異なる場合は、
ソリューションと
azure-pipelines.ymlファイルをコミットして Git リポジトリにプッシュします。Azure DevOps プロジェクトで、[パイプライン>新しいパイプライン] を選択します。最初のパイプラインの場合は [パイプラインの作成] を選択します。 リポジトリプロバイダーとリポジトリを選択してください。
パイプラインの構成 ページで、既存の Azure Pipelines YAML ファイル を選択し、ブランチと
/azure-pipelines.ymlを選択してから、続行 を選択します。 構成を確認してから、実行 を選択します。
UseDotNet@2 タスクは、.NET SDK をインストールします。
DotNetCoreCLI@2 タスクは、dotnet test を実行します。これにより、依存関係が復元され、テスト プロジェクトとその参照ライブラリがビルドされ、Release 構成でテストが実行されます。
publishTestResults: trueでは、テストが失敗した場合でも、タスクによって TRX 結果ファイルが生成され、結果が発行されます。 実行後、パイプライン実行のテストタブを開き、成功したテストと失敗したテストを確認します。 テストが失敗すると、テスト タスクとパイプラインも失敗します。
Note
この例では、.NET 10 SDK でdotnet new mstestの既定の VSTest 構成を使用します。 Microsoft.Testing.Platform (MTP) を有効にする場合は、必要なランナー構成については、継続的インテグレーションでの MTP テストの実行を参照してください。
こちらも参照ください
.NET