次の方法で共有


MSTest と .NET を使用した C# の単体テスト

このチュートリアルでは、単体テストの概念を学習するためのサンプル ソリューションを段階的に構築する対話型エクスペリエンスについて説明します。 事前に構築されたソリューションを使ってチュートリアルを進めたい場合は、開始する前にサンプルコードを表示またはダウンロードしてください。 ダウンロード手順については、サンプルとチュートリアルを参照してください。

この記事では、.NET Core プロジェクトのテストについて説明します。 もし ASP.NET Core プロジェクトをテストする場合は、ASP.NET Core の統合テストを参照してください。

[前提条件]

ソース プロジェクトを作成する

シェル ウィンドウを開きます。 ソリューションを保持するための unit-testing-using-mstest という名前のディレクトリを作成します。 この新しいディレクトリ内で、 dotnet new sln を実行して、クラス ライブラリとテスト プロジェクト用の新しいソリューション ファイルを作成します。 PrimeService ディレクトリを作成します。 次のアウトラインは、これまでのディレクトリとファイルの構造を示しています。

/unit-testing-using-mstest
    unit-testing-using-mstest.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-mstest ディレクトリに戻します。 dotnet sln addを実行して、クラス ライブラリ プロジェクトをソリューションに追加します。

dotnet sln add PrimeService/PrimeService.csproj

テスト プロジェクトを作成する

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="3.2.0" />
  <PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" Version="17.10.1" />
</ItemGroup>

テスト プロジェクトでは、単体テストを作成して実行するために他のパッケージが必要です。 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 should not be prime");
        }
    }
}

TestClass 属性は、単体テストを含むクラスを表します。 TestMethod 属性は、メソッドがテスト メソッドであることを示します。

このファイルを保存し、 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)
{
    var result = _primeService.IsPrime(value);

    Assert.IsFalse(result, $"{value} should not be prime");
}

dotnet test を実行すると、これらのテストのうち 2 つが失敗します。 すべてのテストに合格させるためには、if ファイルにある IsPrime メソッドの冒頭の 句を変更します。

if (candidate < 2)

メイン ライブラリにテストを追加し、理論を増やし、さらに多くのコードを追加して、反復を続けます。 テストの完了バージョンライブラリの完全な実装があります。

あなたは、小さなライブラリとそのライブラリの単体テストのセットを構築しました。 新しいパッケージとテストの追加が通常のワークフローの一部になるように、ソリューションを構築しました。 アプリケーションの目標を解決するために、ほとんどの時間と労力が集中しています。

こちらも参照ください