integration-testing - xUnit IClassFixture 构造函数被多次调用
问题描述
我正在使用 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
}
我面临的问题是我注意到每个测试用例每次都会调用这个 DBFixture。我认为 iClassFixture 只调用一次。当测试用例并行运行时会带来问题,因为它试图清理数据库,而其他测试试图访问它,并且多个测试用例会尝试同时创建数据库,这会导致错误。https://xunit.net/docs/shared-context.html
谁能阐明为什么它不起作用?
解决方案
您需要改用 Collection Fixtures。
https://xunit.net/docs/shared-context#collection-fixture
何时使用:当你想创建一个单独的测试上下文并在多个测试类中的测试之间共享它,并在测试类中的所有测试完成后清理它。
推荐阅读
- node.js - 如何为项目目的更改 npm 模块?
- java - yyyy-MM-dd'T'HH:mm:ss.SSSZZ 和 yyyy-MM-dd'T'HH:mm:ss.SSSXXX 的区别?
- angular - 角度启用常春藤导致问题构建库
- apache-spark - 清除偏移量激发来自 kafka 的结构化流
- html - 浏览器打印设计
- java - 在 lambda 中使用 ResultSet java 时我缺少一个元素的奇怪场景
- tensorflow - ModuleNotFoundError:没有名为“tensorflow.examples.tutorials”的模块
- laravel - 如何将值从数据库返回到 LaravelCollective Dropdown?
- python-3.x - 在一行上打印 2 个列表
- jquery - 使用 ajax jquery 指定要发布到嵌套 JSON 对象属性的 URL