xUnit.net のすべてのテストの前後にコードを 1 回ずつ実行する 質問する

xUnit.net のすべてのテストの前後にコードを 1 回ずつ実行する 質問する

TL;DR - 私は、MSTest と同等の xUnit の機能AssemblyInitialize(つまり、私が気に入っている 1 つの機能) を探しています。

特に、他の依存関係なしで実行できるようにしたい Selenium スモーク テストがいくつかあるため、これを探しています。IisExpress を起動し、破棄時に強制終了する Fixture があります。ただし、すべてのテストの前にこれを実行すると、実行時間が大幅に膨れ上がります。

テストの開始時にこのコードを 1 回トリガーし、終了時に破棄 (プロセスをシャットダウン) したいと思います。どうすればよいでしょうか?

「現在実行されているテストの数」のようなものにプログラムでアクセスできる場合でも、何かを把握できます。

ベストアンサー1

2015年11月現在、xUnit 2がリリースされており、テスト間で機能を共有する標準的な方法があります。ここ

基本的には、フィクスチャを実行するクラスを作成する必要があります。

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。このクラスにより、Xunit はテスト コレクションを作成できるようになり、コレクションのすべてのテスト クラスに対して指定されたフィクスチャが使用されます。

[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;
    }
}

各テスト クラスでどのテスト コレクションに属するかを宣言する必要があるため、 MsTests よりも少し冗長ですAssemblyInitializeが、よりモジュール化されています (MsTests では、クラスに TestClass を配置する必要があります)。

注:サンプルはドキュメンテーション

おすすめ記事