如何在所有测试类别中共享一种装置?

问题描述

我想在所有测试中共享DBfixture。这是为此目的创建的集合:

[CollectionDeFinition("db")]
public class TestColDeFinition : IClassFixture<DBfixture> {  }

我有一个基础类,我可以从中继承测试类:

public class TestBase
{
    protected readonly ITestOutputHelper testOutputHelper;
    protected DBfixture dbf;

    public TestBase(ITestOutputHelper testOutputHelper,DBfixture dbf)
    {
        this.testOutputHelper = testOutputHelper;
        this.dbf = dbf;
    }
}

[Collection("db")]
public class TestClass1 :  TestBase
{
    public TestClass1(ITestOutputHelper testOutputHelper,DBfixture dbf) : base(testOutputHelper,dbf) { }

    [Fact]
    public void fact(){}
}

[Collection("db")]
public class TestClass2 :  TestBase
{
    public TestClass2(ITestOutputHelper testOutputHelper,dbf) { }

    [Fact]
    public void fact(){}
}

但是当我运行测试时,会创建两个DBfixture对象(每个测试类一个)。没有收集,将创建四个对象。如何设置此对象,以便在所有测试类之间共享一个对象?

解决方法

您可以使用集合固定装置,并在该集合下添加每个测试,以实现上述目的。但是,如果您使用单个采集夹具,那么除非您在Xunitrunner配置中明确禁用它,否则整个测试将以串行方式运行。

Xunit Docs的要点之一: 测试集合还影响xUnit.net在并行运行测试时运行测试的方式。

有关更多详细信息,请阅读: https://xunit.net/docs/shared-context

替代方法是,使用静态类存储您可以在启动测试时分配的数据库上下文,并在整个测试生命周期中使用它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...