我正在做一个项目,该项目具有一些在Team City上执行时会随机失败的单元测试。而且没有人可以在本地计算机上重现相同的行为。由于几乎所有测试都会在TestDelegate
动作中执行被测试的方法,并在我相信的动作之外执行Asserts
和Verifies
,所以这可能是并发问题。
但是在我对测试代码进行任何更改之前,我想了解有关在[[.Net Framework 4.0中执行TestDelegate
操作的更多信息。
[TestFixture]
public class MyClassTest
{
private Mock<IAnyService> _anyService;
private MyClass _myClass;
[SetUp]
public void Setup()
{
_anyService = new Mock<IAnyService>();
_myClass.AnyService = new MyClass() { AnyService = _anyService.Object };
}
[Test]
public void MyClass_Should_Call_MockClassMethod()
{
TestDelegate action = () => _myClass.MyMethod();
Assert.DoesNotThrow(action);
_anyService.Verify(_ => _.MockClassMethod(), Times.Once);
}
}
我的课堂方法
public override void MyMethod() { ...DoALotOfStuff AnyService.MockClassMethod(); }
这是Team City的错误预期对模拟调用一次,但被调用0次:_ => _.MockClassMethod()未配置任何设置。
未执行任何调用。
它随机失败的原因是什么?
是否有可能仅在Team City上以单独的线程执行该动作?
编辑:
我能够使用此命令执行测试以随机失败。但是仍然不知道为什么。
nunit3-console (ls -r ./tests/**/bin/**/*.Tests.dll -exclude *.Product* | % FullName | sort-object -Unique) --teamcity --x86 --framework=v4.0
[Parallelizable]
的程序集级别可以有AssemlyInfo.cs
属性。如果测试并行运行,则可能在测试之间泄漏状态。 NUnit将测试治具的单个实例重新用于该治具(source)中的所有测试方法。由于您的模拟是固定的,因此在同时运行的两个测试的设置和断言逻辑之间可能存在竞争条件。
TestDelegate
本身与我无关。调用委托与调用任何其他方法没有什么不同,除了通过变量间接地进行。在您提供的示例代码中,_myClass.MyMethod()
仍将同步运行-除非您在其他地方引入了线程或并发。