dotnet テストと xUnit を使用した .NET Core での単体テスト C#Unit testing C# in .NET Core using dotnet test and xUnit

このチュートリアルでは、単体テストの概念について学習するためにサンプル ソリューションを段階的に構築する対話型のエクスペリエンスを示します。This tutorial takes you through an interactive experience building a sample solution step-by-step to learn unit testing concepts. 構築済みのソリューションを使用してチュートリアルに従う場合は、開始する前にサンプル コードを参照またはダウンロードしてください。If you prefer to follow the tutorial using a pre-built solution, view or download the sample code before you begin. ダウンロード方法については、「サンプルおよびチュートリアル」を参照してください。For download instructions, see Samples and Tutorials.

ソース プロジェクトの作成Creating the source project

シェル ウィンドウを開きます。Open a shell window. ソリューションを保持するための unit-testing-using-dotnet-test というディレクトリを作成します。Create a directory called unit-testing-using-dotnet-test to hold the solution. この新しいディレクトリ内で dotnet new sln を実行して、ソリューションを新たに作成します。Inside this new directory, run dotnet new sln to create a new solution. ソリューションを用意すると、クラス ライブラリと単体テスト プロジェクトの両方を管理しやすくなります。Having a solution makes it easier to manage both the class library and the unit test project. ソリューションのディレクトリ内で、PrimeService ディレクトリを作成します。Inside the solution directory, create a PrimeService directory. 現時点のディレクトリとファイルの構造は次のようになっています。The directory and file structure thus far should be as follows:

/unit-testing-using-dotnet-test
    unit-testing-using-dotnet-test.sln
    /PrimeService

PrimeService を現在のディレクトリにし、dotnet new classlib を実行してソース プロジェクトを作成します。Make PrimeService the current directory and run dotnet new classlib to create the source project. Class1.cs の名前を PrimeService.cs に変更します。Rename Class1.cs to PrimeService.cs. 最初に、PrimeService クラスのエラーが発生する実装を作成します。You first create a failing implementation of the PrimeService class:

using System;

namespace Prime.Services
{
    public class PrimeService
    {
        public bool IsPrime(int candidate)
        {
            throw new NotImplementedException("Please create a test first");
        }
    }
}

unit-testing-using-dotnet-test ディレクトリに戻ります。Change the directory back to the unit-testing-using-dotnet-test directory.

dotnet sln コマンドを実行して、クラス ライブラリ プロジェクトをソリューションに追加します。Run the dotnet sln command to add the class library project to the solution:

dotnet sln add ./PrimeService/PrimeService.csproj

テスト プロジェクトの作成Creating the test project

次に、PrimeService.Tests ディレクトリを作成します。Next, create the PrimeService.Tests directory. 次の一覧はディレクトリ構造を示したものです。The following outline shows the directory structure:

/unit-testing-using-dotnet-test
    unit-testing-using-dotnet-test.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests

PrimeService.Tests ディレクトリを現在のディレクトリにし、dotnet new xunit を使用して新しいプロジェクトを作成します。Make the PrimeService.Tests directory the current directory and create a new project using dotnet new xunit. このコマンドによって、テスト ライブラリとして xUnit を使用するテスト プロジェクトが作成されます。This command creates a test project that uses xUnit as the test library. 生成されたテンプレートで、PrimeServiceTests.csproj ファイルのテスト ランナーが構成されます。次のようなコードです。The generated template configures the test runner in the PrimeServiceTests.csproj file similar to the following code:

<ItemGroup>
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
  <PackageReference Include="xunit" Version="2.2.0" />
  <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
</ItemGroup>

テスト プロジェクトには、単体テストを作成して実行するための、他のパッケージが必要です。The test project requires other packages to create and run unit tests. 前の手順の dotnet new によって、xUnit と xUnit ランナーが追加されています。dotnet new in the previous step added xUnit and the xUnit runner. ここで、プロジェクトに別の依存関係として PrimeService クラス ライブラリを追加します。Now, add the PrimeService class library as another dependency to the project. 次の dotnet add reference コマンドを使用します。Use the dotnet add reference command:

dotnet add reference ../PrimeService/PrimeService.csproj

全体のファイルは GitHub のサンプル リポジトリで確認できます。You can see the entire file in the samples repository on GitHub.

ソリューションの最終的なレイアウトは次のようになります。The following shows the final solution layout:

/unit-testing-using-dotnet-test
    unit-testing-using-dotnet-test.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeServiceTests.csproj

テスト プロジェクトをソリューションに追加するには、unit-testing-using-dotnet-test ディレクトリで dotnet sln コマンドを実行します。To add the test project to the solution, run the dotnet sln command in the unit-testing-using-dotnet-test directory:

dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj

最初のテストの作成Creating the first test

失敗するテストを 1 つ作成してそれを合格させる、というプロセスを繰り返します。You write one failing test, make it pass, then repeat the process. PrimeService.Tests ディレクトリから UnitTest1.cs を削除し、PrimeService_IsPrimeShould.cs という名前の新しい C# ファイルを作成します。Remove UnitTest1.cs from the PrimeService.Tests directory and create a new C# file named PrimeService_IsPrimeShould.cs. 次のコードを追加します。Add the following code:

using Xunit;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    public class PrimeService_IsPrimeShould
    {
        private readonly PrimeService _primeService;

        public PrimeService_IsPrimeShould()
        {
            _primeService = new PrimeService();
        }

        [Fact]
        public void ReturnFalseGivenValueOf1()
        {
            var result = _primeService.IsPrime(1);

            Assert.False(result, "1 should not be prime");
        }
    }
}

[Fact] 属性は、テスト ランナーによって実行されるテスト メソッドを表します。The [Fact] attribute indicates a test method that is run by the test runner. PrimeService.Tests フォルダーから、dotnet test を実行してテストとクラス ライブラリをビルドし、それからテストを実行します。From the PrimeService.Tests folder, execute dotnet test to build the tests and the class library and then run the tests. xUnit テスト ランナーには、テストを実行するためのプログラムのエントリ ポイントが含まれています。The xUnit test runner contains the program entry point to run your tests. dotnet test を実行すると、作成した単体テスト プロジェクトを使用してテスト ランナーが開始されます。dotnet test starts the test runner using the unit test project you've created.

テストが失敗します。Your test fails. 実装はまだ作成していません。You haven't created the implementation yet. 最もシンプルな動作のコードを PrimeService クラスに記述して、このテストが成功するようにします。Make this test pass by writing the simplest code in the PrimeService class that works. 既存の IsPrime メソッド実装を次のコードに置き換えます。Replace the existing IsPrime method implementation with the following code:

public bool IsPrime(int candidate)
{
    if (candidate == 1)
    {
        return false;
    }
    throw new NotImplementedException("Please create a test first");
}

PrimeService.Tests ディレクトリで、dotnet test をもう一度実行します。In the PrimeService.Tests directory, run dotnet test again. dotnet test コマンドは PrimeService プロジェクトのビルドを実行してから、PrimeService.Tests プロジェクトのビルドを実行します。The dotnet test command runs a build for the PrimeService project and then for the PrimeService.Tests project. 両方のプロジェクトをビルドすると、この単一テストが実行されます。After building both projects, it runs this single test. 成功します。It passes.

他の機能の追加Adding more features

テストが成功したので、他のテストも記述してみましょう。Now that you've made one test pass, it's time to write more. 素数に関する、いくつかの単純なケースが他にもあります(0、-1)。There are a few other simple cases for prime numbers: 0, -1. [Fact] 属性を使用すると、これらの例を新しいテストとして追加できますが、すぐに煩雑になります。You could add those cases as new tests with the [Fact] attribute, but that quickly becomes tedious. 一連の類似のテストを記述できるようになる、他の xUnit 属性があります。There are other xUnit attributes that enable you to write a suite of similar tests:

  • [Theory] は同じコードを実行するものの、異なる入力引数が含まれる一連のテストを表します。[Theory] represents a suite of tests that execute the same code but have different input arguments.

  • [InlineData] 属性は、これらの入力の値を指定します。[InlineData] attribute specifies values for those inputs.

新しいテストを作成するのではなく、この 2 つの属性、[Theory][InlineData] を適用することで PrimeService_IsPrimeShould.cs ファイルに 1 つの理論を作成できます。Instead of creating new tests, apply these two attributes, [Theory] and [InlineData], to create a single theory in the PrimeService_IsPrimeShould.cs file. その理論とは、複数の 2 未満の値を調べて、もっとも小さい素数を特定するという手法です。The theory is a method that tests several values less than two, which is the lowest prime number:

[Theory]
[InlineData(-1)]
[InlineData(0)]
[InlineData(1)]
public void ReturnFalseGivenValuesLessThan2(int value)
{
    var result = _primeService.IsPrime(value);
    
    Assert.False(result, $"{value} should not be prime");
}

dotnet test をもう一度実行します。これらのテストのうち、2 つが失敗するはずです。Run dotnet test again, and two of these tests should fail. すべてのテストを成功させるために、PrimeService.cs ファイルで IsPrime メソッドの先頭にある if 句を変更します。To make all of the tests pass, change the if clause at the beginning of the IsPrime method in the PrimeService.cs file:

if (candidate < 2)

他のテスト、理論、コードをメイン ライブラリに追加して、反復を続けます。Continue to iterate by adding more tests, more theories, and more code in the main library. テストの最終版ができ、ライブラリの完全な実装が完了しました。You have the finished version of the tests and the complete implementation of the library.

その他の技術情報Additional resources