我正在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
你是如何执行测试的?