[.NET Core] xUnit のテスト実施前の初期処理

xUnit で各テストを実施する際の初期処理についての覚書

# コンストラクタ
- それぞれのテストケースは、コンストラクタが呼び出された後にテスト実行される。
    - UnitTest.UnitTest() → UnitTest.Test1()
    - UnitTest.UnitTest() → UnitTest.Test2(value=1)
    - UnitTest.UnitTest() → UnitTest.Test2(value=2)
    - UnitTest.UnitTest() → UnitTest.Test2(value=3)
- 各テストの前に必ず実行したい初期処理があればコンストラクタに記述する。

``` UnitTest.cs
    public class UnitTest
    {
        public UnitTest()
        {
            // 初期処理
        }

        [Fact]
        public void Test1()
        {
            // テスト
        }

        [Theory]
        [InlineData(1)]
        [InlineData(2)]
        [InlineData(3)]
        public void Test2(int value)
        {
            // テスト
        }
    }
```

# IClassFixture
- それぞれのテストケースの実施前ではなく、クラス単位で初期処理が 1 回のみ実行される。その後、各テストが実行される。
    - IClassFixture.UnitTestFixture()
        - UnitTest.Test1()
        - UnitTest.Test2(value=1)
        - UnitTest.Test2(value=2)
        - UnitTest.Test2(value=3)
- 事前に 1 回だけ実行すればよい処理（ex：テスト用初期データ投入）の場合は `IClassFixture` を利用する。
    - テスト実行はパラレルに行われるため、相互に影響しないようにテストを作成する必要あり。

``` UnitTest.cs
    public class UnitTestFixture
    {
        public UnitTestFixture()
        {
            // 初期処理
        }
    }

    public class UnitTest : IClassFixture<UnitTestFixture>
    {
        [Fact]
        public void Test1()
        {
            // テスト
        }

        [Theory]
        [InlineData(1)]
        [InlineData(2)]
        [InlineData(3)]
        public void Test2(int value)
        {
            // テスト
        }
    }
```

# IAssemblyFixture
- クラスが異なるが、テスト全体で 1 回だけ初期化したいような場合は `IAssemblyFixture` を利用する。
    - UnitTestAssemblyFixture.UnitTestAssemblyFixture()
        - UnitTest1.Test1()
        - UnitTest1.Test2(value=1)
        - UnitTest1.Test2(value=2)
        - UnitTest1.Test2(value=3)
        - UnitTest2.Test3()
        - UnitTest2.Test4(value=1)
        - UnitTest2.Test4(value=2)
        - UnitTest2.Test4(value=3)
- nuget パッケージ管理から `Xunit.Extensions.AssemblyFixture` を追加して利用する。

``` UnitTestAssemblyFixture.cs
using Xunit;
using Xunit.Extensions.AssemblyFixture;

[assembly: TestFramework(AssemblyFixtureFramework.TypeName, AssemblyFixtureFramework.AssemblyName)]

namespace TestProject
{
    public class UnitTestAssemblyFixture
    {
        public UnitTestAssemblyFixture()
        {
            // 初期処理
        }
    }
}
```
``` UnitTest1.cs
using Xunit;
using Xunit.Extensions.AssemblyFixture;

namespace TestProject
{
    public class UnitTest1 : IAssemblyFixture<UnitTestAssemblyFixture>
    {
        [Fact]
        public void Test1()
        {
            // テスト
        }

        [Theory]
        [InlineData(1)]
        [InlineData(2)]
        [InlineData(3)]
        public void Test2(int value)
        {
            // テスト
        }
    }
}
```
``` UnitTest2.cs
using Xunit;
using Xunit.Extensions.AssemblyFixture;

namespace TestProject
{
    public class UnitTest2 : IAssemblyFixture<UnitTestAssemblyFixture>
    {
        [Fact]
        public void Test3()
        {
            // テスト
        }

        [Theory]
        [InlineData(1)]
        [InlineData(2)]
        [InlineData(3)]
        public void Test4(int value)
        {
            // テスト
        }
    }
}
```

## 参考
https://github.com/JDCain/Xunit.Extensions.AssemblyFixture