私は同じ答えを探していましたが、現時点では、クラスフィクスチャとコレクションフィクスチャを実装する方法に関して、xUnitのドキュメントが非常に役立ちます。これにより、開発者はクラスまたはクラスのグループレベルで幅広いセットアップ/ティアダウン機能を利用できます。これはGeir Sagbergからの回答と一致しており、それがどのように見えるかを説明するための優れたスケルトン実装を提供します。
https://xunit.github.io/docs/shared-context.html
コレクションフィクスチャ使用するタイミング:単一のテストコンテキストを作成し、それを複数のテストクラスのテスト間で共有し、テストクラスのすべてのテストが終了した後にクリーンアップする場合。
複数のテストクラス間でフィクスチャオブジェクトを共有したい場合があります。クラスフィクスチャに使用されるデータベースの例は素晴らしい例です。データベースを一連のテストデータで初期化し、そのテストデータをそのままにして、複数のテストクラスで使用できます。xUnit.netのコレクションフィクスチャ機能を使用して、複数のテストクラスのテスト間で単一のオブジェクトインスタンスを共有できます。
コレクションフィクスチャを使用するには、次の手順を実行する必要があります。
フィクスチャクラスを作成し、スタートアップコードをフィクスチャクラスコンストラクターに配置します。フィクスチャクラスがクリーンアップを実行する必要がある場合は、IDisposableをフィクスチャクラスに実装し、クリーンアップコードをDispose()メソッドに配置します。コレクション定義クラスを作成し、[CollectionDefinition]属性で装飾して、テストコレクションを識別する一意の名前を付けます。ICollectionFixture <>をコレクション定義クラスに追加します。テストコレクション定義クラスの[CollectionDefinition]属性に指定した一意の名前を使用して、コレクションの一部となるすべてのテストクラスに[Collection]属性を追加します。テストクラスがフィクスチャインスタンスにアクセスする必要がある場合は、それをコンストラクタ引数として追加すると、自動的に提供されます。以下に簡単な例を示します。
public class DatabaseFixture : IDisposable
{
public DatabaseFixture()
{
Db = new SqlConnection("MyConnectionString");
// ... initialize data in the test database ...
}
public void Dispose()
{
// ... clean up test data from the database ...
}
public SqlConnection Db { get; private set; }
}
[CollectionDefinition("Database collection")]
public class DatabaseCollection : ICollectionFixture<DatabaseFixture>
{
// This class has no code, and is never created. Its purpose is simply
// to be the place to apply [CollectionDefinition] and all the
// ICollectionFixture<> interfaces.
}
[Collection("Database collection")]
public class DatabaseTestClass1
{
DatabaseFixture fixture;
public DatabaseTestClass1(DatabaseFixture fixture)
{
this.fixture = fixture;
}
}
[Collection("Database collection")]
public class DatabaseTestClass2
{
// ...
}
xUnit.netは、コレクションフィクスチャをクラスフィクスチャとほぼ同じ方法で処理しますが、コレクションフィクスチャオブジェクトの存続期間は長くなります。これは、コレクション内のテストクラスでテストが実行される前に作成され、クリーニングされません。コレクション内のすべてのテストクラスの実行が完了するまで。
テストコレクションはIClassFixture <>で装飾することもできます。xUnit.netは、これを、テストコレクションの個々のテストクラスがクラスフィクスチャで装飾されているかのように扱います。
テストコレクションは、xUnit.netがテストを並行して実行する場合の実行方法にも影響します。詳細については、「テストの並列実行」を参照してください。
重要な注意:フィクスチャーは、それを使用するテストと同じアセンブリにある必要があります。