2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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)
        {
            // テスト
        }
    }
}

参考

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?