【发布时间】:2020-05-05 00:00:48
【问题描述】:
我正在使用 xUnit 进行集成测试。为此,我使用了一个 localdb 实例。话虽如此,我想用一些预定义的数据启动数据库实例一次,当然我会在所有测试用例中保持不变。我可以单独编写每个测试用例,这样它们就不会相互碰撞,但是我只想创建一次数据库实例。
我关注了xunit constructor runs before each test,代码看起来像
//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
}
我面临的问题是我注意到每次测试用例都会调用这个 DBFixture。我认为 iClassFixture 只调用一次。当测试用例并行运行时会带来问题,因为它试图清理数据库,而其他测试试图访问它,并且多个测试用例会尝试同时创建数据库,这会导致错误。 https://xunit.net/docs/shared-context.html
谁能解释为什么它不起作用?
【问题讨论】:
-
顺便说一句,我试图在夹具类的 dispose 方法中设置断点。我有 4 个测试,当其中两个变成绿色时,它会触发处理。当然,剩下的两个会失败
标签: integration-testing xunit dbunit