xUnit.net: グローバルセットアップ + ティアダウン? 質問する

xUnit.net: グローバルセットアップ + ティアダウン? 質問する

この質問はユニットテストフレームワークに関するものです翻訳元

テストを実行する前にいくつかのコードを実行する必要があり、また、すべてのテストが完了した後にもいくつかのコードを実行する必要があります。グローバル初期化コードと終了コードを示す何らかの属性またはマーカー インターフェイスがあるはずだと思いましたが、それらを見つけることができませんでした。

あるいは、プログラムで xUnit を呼び出すと、次のコードを使用して目的を達成することもできます。

static void Main()
{
    try
    {
        MyGlobalSetup();
        RunAllTests();  // What goes into this method?
    }
    finally
    {
        MyGlobalTeardown();
    }
}

グローバル セットアップ/ティアダウン コードを宣言的またはプログラム的に実行する方法についてヒントを教えていただけますか?

ベストアンサー1

私の知る限り、xUnit にはグローバルな初期化/ティアダウン拡張ポイントはありません。ただし、作成するのは簡単です。実装する基本テスト クラスを作成しIDisposable、コンストラクターで初期化を行い、メソッドでティアダウンを行うだけですIDisposable.Dispose。次のようになります。

public abstract class TestsBase : IDisposable
{
    protected TestsBase()
    {
        // Do "global" initialization here; Called before every test method.
    }

    public void Dispose()
    {
        // Do "global" teardown here; Called after every test method.
    }
}

public class DummyTests : TestsBase
{
    // Add test methods
}

ただし、呼び出しごとに基本クラスのセットアップとティアダウン コードが実行されます。これはあまり効率的ではないため、望ましくない可能性があります。より最適化されたバージョンでは、インターフェイスを使用して、IClassFixture<T>グローバル初期化/ティアダウン機能が 1 回だけ呼び出されるようにします。このバージョンでは、テスト クラスから基本クラスを拡張するのではなく、フィクスチャ クラスを参照するIClassFixture<T>インターフェイスを実装しますT

using Xunit;

public class TestsFixture : IDisposable
{
    public TestsFixture ()
    {
        // Do "global" initialization here; Only called once.
    }

    public void Dispose()
    {
        // Do "global" teardown here; Only called once.
    }
}

public class DummyTests : IClassFixture<TestsFixture>
{
    public DummyTests(TestsFixture data)
    {
    }
}

これ意思その結果、コンストラクターはTestsFixtureテスト対象のクラスごとに 1 回だけ実行されます。したがって、2 つの方法のどちらを選択するかは、正確に何を望んでいるかによって異なります。

おすすめ記事