【NUnit】 各テストケースで独自のSetUp処理、TearDown処理を呼び出したい話

NUnitとは、C#で単体テストを実行するためのフレームワークです。
JavaだとJUnit, PHPだとPHPUnitがあるので名前から何となく想像つく人もいるのかもしれません。
今回は、テストケースごとにSetUp処理、TearDown処理を呼び出す方法について書いていこうと思います。

SetUp処理、TearDown処理とは

まず各処理の説明を簡単にまとめていこうと思います。

using NUnit.Framework;
using System;

[TestFixture]
class SampleTestFixture
{
    [SetUp]
    public void SetUp()
    {
        Console.WriteLine("ファイルの作成処理");
    }

    [TearDown]
    public void TearDown()
    {
        Console.WriteLine("ファイルの削除処理");
    }

    [Test]
    public void ReadFileTest1()
    {
        Console.WriteLine("ファイルの読込みテスト1");
    }

    [Test]
    public void ReadFileTest2()
    {
        Console.WriteLine("ファイルの読込みテスト2");
    }
}

SetUp属性が付与された処理は、各テストケースが呼び出される直前に呼び出されます。
この処理を実装することで、各テストケース共通の事前条件・事前準備といった処理を書くことができます。
※ 上記の場合ではSetUp処理で、ファイルの作成処理を呼び出す例です。

TearDown属性が付与された処理ですが、各テストケースが呼び出された直後に呼び出されます。
この処理を実装することで、各テストケース共通の後始末処理を書くことができます。
※ 上記の場合では TearDown処理 でテスト後のファイルを削除する例です。

詳しく説明しませんでしたが、詳しく知りたい人は以下ページに記載されているのでご覧ください。
SetUp and TearDown

テストケースごとのSetUp処理、TearDown処理

簡単にSetUp処理、TearDown処理について説明しましたが、テストケースごとに処理を分岐させたいこともあるかもしれません。(ReadFileTest1メソッドではファイルAを読み込むが、ReadFileTest2メソッドではファイルBを読み込むなど)
結論から言えば、以下のように内部クラスを使えば問題を解決することができます。

[TestFixture]
class SampleTestFixture
{
    [TestFixture]
    class ReadFileACondition
    {
        [SetUp]
        public void SetUp()
        {
            Console.WriteLine("ファイルAの作成処理");
        }

        [Test]
        public static void ReadFileTest1()
        {
            Console.WriteLine("ファイルAの読み込みテスト");
        }

        [TearDown]
        public void TearDown()
        {
            Console.WriteLine("ファイルAの削除処理");
        }
    }

    [TestFixture]
    class ReadFileBCondition
    {
        [SetUp]
        public void SetUp()
        {
            Console.WriteLine("ファイルBの作成処理");
        }

        [Test]
        public static void ReadFileTest2()
        {
            Console.WriteLine("ファイルAの読み込みテスト");
        }

        [TearDown]
        public void TearDown()
        {
            Console.WriteLine("ファイルBの削除処理");
        }
    }

    [SetUp]
    public void SetUp()
    {
        Console.WriteLine("SetUp処理1");
    }

    [TearDown]
    public void TearDown()
    {
        Console.WriteLine("TearDown処理1");
    }
}

ただ一つ問題点があり、内部クラスのテストケース実行時には、対応する外部クラスのSetUp処理、TearDown処理を呼び出すことができません。
※ 上記の例ではファイルAの読み込みテストの前後にSetUp処理1とTearDown処理1が動きません‼

以上。