xUnit IClassFixture 构造函数被多次调用

Yil*_* Li 8 dbunit integration-testing xunit

我正在使用 xUnit 进行集成测试。为此,我使用 localdb 实例。话虽这么说,我想使用一些预定义的数据启动一次数据库实例,当然我希望所有测试用例都保持这一点。我可以单独编写每个测试用例,这样它们就不会相互冲突,但我只想创建一次数据库实例。

在每次测试之前都遵循 xunit 构造函数的运行,代码如下所示

//similar to base class
public class DatabaseFixture : IDisposable
{
    public SqlConnection Db { get; private set; }
    public DatabaseFixture()
    {
        InitialDB();
    }
    public InitialDB()
    {
        CreateDBInstance();
        CreateDBSchemas();
        InitDBMetaData();
    }

    public void Dispose()
    {
        // clean up test data from the database
        CleanUpDB();
    }
}

//Class where you want to use shared class instance
public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
    DatabaseFixture dbFixture;
    public MyDatabaseTests(DatabaseFixture fixture)
    {
        this.dbFixture = fixture;
    }

// write tests, using dbFixture.Db to get access to the SQL Server
}
Run Code Online (Sandbox Code Playgroud)

我面临的问题是我注意到每个测试用例每次都会调用这个 DBFixture。我认为使用 iClassFixture 它只被调用一次。当测试用例并行运行时,这会带来问题,因为它试图清理数据库,而其他测试尝试访问它,并且多个测试用例会尝试同时创建数据库,这会导致错误。https://xunit.net/docs/shared-context.html

任何人都可以阐明为什么它不起作用吗?

小智 1

您需要使用 Collection Fixtures 来代替。

https://xunit.net/docs/shared-context#collection-fixture

何时使用:当您想要创建单个测试上下文并在多个测试类中的测试之间共享它,并在测试类中的所有测试完成后清理它时。