即使我使用CollectionFixture,我的Fixture也会多次初始化



我正在VS2022中使用xUnit 2.4.1.net6中编写一些测试类。

我有两个组件:

  • 第一个包含夹具
  • 第二个是测试+集合

我所期望的是,我只遇到Fixture类的构造函数一次。但发生的事情是在不同的时间遇到它。

这里是我所有的代码:

第一个组件,the Fixture类:

public class MyDbContextFixture 
{
private Guid x = Guid.Empty;
public MyDbContextFixture()
{
x = Guid.NewGuid();
System.Diagnostics.Debug.WriteLine($"Ctor Fixture. Guid {x}. ");
}
public void Cleanup()
{
System.Diagnostics.Debug.WriteLine($"Dispose Fixture. Guid {x}.");
}
}

第二个组件,the Collection类:

[CollectionDefinition("TestsCollectionsAdmin")]
public class AdminTestsCollection : ICollectionFixture<MyDbContextFixture>
{
}

第二个组件,the First Tests类:

[Collection("TestsCollectionsAdmin")]
public class TestsA : IDisposable
{
private MyDbContextFixture _context { get; }
public TestsA(MyDbContextFixture context)
{
_context = context;
System.Diagnostics.Debug.WriteLine("Ctor Test class A");
}
[Fact]
public void Test1()
{
System.Diagnostics.Debug.WriteLine("Test class A -> Test 1");
}
[Fact]
public void Test2()
{
System.Diagnostics.Debug.WriteLine("Test class A -> Test 2");
}
public void Dispose()
{
System.Diagnostics.Debug.WriteLine("Dispose Test class A");
_context.Cleanup();
}
}

第二个组件,the Second Tests类:

[Collection("TestsCollectionsAdmin")]
public class TestsB : IDisposable
{
private MyDbContextFixture _context { get; }
public TestsA(MyDbContextFixture context)
{
_context = context;
System.Diagnostics.Debug.WriteLine("Ctor Test class B");
}
[Fact]
public void Test1()
{
System.Diagnostics.Debug.WriteLine("Test class B -> Test 1");
}
[Fact]
public void Test2()
{
System.Diagnostics.Debug.WriteLine("Test class B -> Test 2");
}
[Fact]
public void Test3()
{
System.Diagnostics.Debug.WriteLine("Test class B -> Test 3");
}
public void Dispose()
{
System.Diagnostics.Debug.WriteLine("Dispose Test class B");
_context.Cleanup();
}
}

结果是:

> Ctor Fixture. Guid 2049ef03-3104-4ba1-835f-25e288041385. 
> Ctor Fixture. Guid e400b28f-50ac-4da5-a007-40bb0f608bd9. 
> Ctor Fixture. Guid e11651c5-ac58-4371-b743-3663c072b157. 
> Ctor Fixture. Guid 29e63556-fcba-444f-b20f-ef66eff87925. 
> Ctor Test class A
> Ctor Test class B
> Ctor Test class B
> Ctor Test class B
> Test class B -> Test 2
> Test class B -> Test 1
> Test class A -> Test 1
> Test class B -> Test 3
> Dispose Test class B
> Dispose Test class A
> Dispose Fixture. Guid 2049ef03-3104-4ba1-835f-25e288041385.
> Dispose Fixture. Guid e400b28f-50ac-4da5-a007-40bb0f608bd9.
> Dispose Test class B
> Dispose Test class B
> Dispose Fixture. Guid e11651c5-ac58-4371-b743-3663c072b157.
> Ctor Test class A
> Dispose Fixture. Guid 29e63556-fcba-444f-b20f-ef66eff87925.
> Test class A -> Test 2
> Dispose Test class A
> Dispose Fixture. Guid e400b28f-50ac-4da5-a007-40bb0f608bd9.

我发现奇怪的是,我进了4次夹具构造函数!不是1。不是我测试的5个!它是清楚的,它是正确的,我去清理了5次。因为dispose是在每次测试之后调用的。但我不明白为什么我会进入夹具的构造函数4次。

您还可以看到,我两次处理了一个fixture实例。id为e400b28f-50ac-4da5-a007-40bb0f608bd9的。

所以它似乎只起过一次作用。。。

我做错了什么?

谢谢

免责声明:我必须"滥用;这个答案是因为发表评论的时间太长了。

我已经根据您的规范创建了一个小样本项目,这是我使用Console.WriteLine()和Rider:时的测试输出

Ctor Fixture. Guid 40d3a0d2-cc56-48e2-93d8-fa11ed9bf647. 
Ctor Test class A
Test class A -> Test 2
Dispose Test class A
Dispose Fixture. Guid 40d3a0d2-cc56-48e2-93d8-fa11ed9bf647.
Ctor Test class A
Test class A -> Test 1
Dispose Test class A
Dispose Fixture. Guid 40d3a0d2-cc56-48e2-93d8-fa11ed9bf647.
Ctor Test class B
Test class B -> Test 2
Dispose Test class B
Dispose Fixture. Guid 40d3a0d2-cc56-48e2-93d8-fa11ed9bf647.
Ctor Test class B
Test class B -> Test 1
Dispose Test class B
Dispose Fixture. Guid 40d3a0d2-cc56-48e2-93d8-fa11ed9bf647.
Ctor Test class B
Test class B -> Test 3
Dispose Test class B
Dispose Fixture. Guid 40d3a0d2-cc56-48e2-93d8-fa11ed9bf647.

这是使用IMessageSink时的输出(参见此处(:

14:03:32.420 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Ctor Fixture. Guid 18cf2abd-fedd-405d-a5d1-92d76cd6aa37.  
14:03:32.455 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Ctor Test class A 
14:03:32.460 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Test class A -> Test 2 
14:03:32.463 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Dispose Test class A 
14:03:32.463 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Dispose Fixture. Guid 18cf2abd-fedd-405d-a5d1-92d76cd6aa37. 
14:03:32.464 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Ctor Test class A 
14:03:32.464 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Test class A -> Test 1 
14:03:32.464 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Dispose Fixture. Guid 18cf2abd-fedd-405d-a5d1-92d76cd6aa37. 
14:03:32.464 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Dispose Test class A 
14:03:32.475 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Test class B -> Test 2 
14:03:32.475 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Ctor Test class B 
14:03:32.475 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Dispose Test class B 
14:03:32.475 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Ctor Test class B 
14:03:32.475 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Dispose Fixture. Guid 18cf2abd-fedd-405d-a5d1-92d76cd6aa37. 
14:03:32.476 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Dispose Test class B 
14:03:32.476 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Dispose Fixture. Guid 18cf2abd-fedd-405d-a5d1-92d76cd6aa37. 
14:03:32.476 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Test class B -> Test 1 
14:03:32.476 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Ctor Test class B 
14:03:32.476 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Dispose Test class B 
14:03:32.476 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Test class B -> Test 3 
14:03:32.476 |V| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Dispose Fixture. Guid 18cf2abd-fedd-405d-a5d1-92d76cd6aa37. 
14:03:32.476 |I| TestRunner: JetBrains.ReSharper.TestRunner.Adapters.XUnit.XUnitRunner Execution completed 

你是如何执行测试的?

最新更新