随机失败的C#单元测试
我正在做一个项目,它有一些单元测试,在TeamCity上执行时会随机失败。没有人能在本地机器上重现同样的行为。 由于几乎所有测试都在随机失败的C#单元测试,c#,.net,unit-testing,nunit,teamcity,C#,.net,Unit Testing,Nunit,Teamcity,我正在做一个项目,它有一些单元测试,在TeamCity上执行时会随机失败。没有人能在本地机器上重现同样的行为。 由于几乎所有测试都在TestDelegate操作内执行测试方法,并在操作外执行断言和验证,我相信这可能是并发问题 但是在对测试代码进行任何更改之前,我想了解更多关于.NETFramework4.0中执行TestDelegate操作的信息 这是一个随机失败的单元测试示例 [TestFixture] public class MyClassTest { private Moc
TestDelegate
操作内执行测试方法,并在操作外执行断言
和验证
,我相信这可能是并发问题
但是在对测试代码进行任何更改之前,我想了解更多关于.NETFramework4.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);
}
}
这是城市队的错误
应在模拟上调用一次,但调用次数为0次:=>\u0.MockClassMethod()
未配置任何设置
没有执行任何调用
它随机失效的原因可能是什么
该操作是否可能仅在Team City的单独线程中执行
编辑:
我可以使用这个命令来执行测试,但随机失败。但还是不知道为什么
nunit3-console (ls -r ./tests/**/bin/**/*.Tests.dll -exclude *.Product* | % FullName | sort-object -Unique) --teamcity --x86 --framework=v4.0
您在运行测试时是否启用了NUnit的任何并行化选项?我在您的示例代码中没有看到任何并行化的证据,但它可以在其他地方启用——例如,
AssemlyInfo.cs
中的汇编级别上可能有一个[Parallelizable]
属性
如果测试并行运行,则可能在测试之间泄漏状态。NUnit将测试夹具的单个实例重新用于该夹具中的所有测试方法()。由于您的模拟是fixture范围的,所以在同时运行的两个测试的设置和断言逻辑之间可能存在竞争条件
TestDelegate
本身看起来与我无关。调用委托与调用任何其他方法没有太大区别,只是通过变量间接地进行调用。在您提供的示例代码中,\u myClass.MyMethod()
仍将同步运行——除非您在其他地方引入了线程或并发
编辑:
问题作者在评论中提供的其他信息,应其要求添加在此处以供查看:
在查看文档[1]之后,我意识到nunit console有一个参数--agents,用于控制并行运行程序集,如果未指定,则所有代理进程都会同时运行测试,无论程序集的数量如何。当我在命令行上添加--agents=1时,所有测试都会成功运行
您是否在启用NUnit的任何并行化选项的情况下运行测试?我在示例代码中没有看到任何并行化的证据,但它可以在其他地方启用—例如,
AssemlyInfo.cs
中的汇编级别可能有一个[Parallelizable]
属性
如果测试并行运行,则可能是在测试之间泄漏状态。NUnit对该设备()中的所有测试方法重新使用测试设备的单个实例。由于您的模拟是设备范围的,因此在同时运行的两个测试的设置和断言逻辑之间可能存在竞争条件
TestDelegate
本身看起来与我无关。调用委托与调用任何其他方法没有太大区别,只是通过变量间接执行。在您提供的示例代码中\u myClass.MyMethod()
仍将同步运行——除非您在其他地方引入了线程或并发
编辑:
问题作者在评论中提供的其他信息,应其要求添加在此处以供查看:
在查看文档[1]之后,我意识到nunit console有一个参数--agents,用于控制并行运行程序集,如果未指定,则所有代理进程都会同时运行测试,无论程序集的数量如何。当我在命令行上添加--agents=1时,所有测试都会成功运行
我研究了我的解决方案,没有明确的关于并行运行测试的内容。但是这是有意义的。也许单元测试的默认配置是并行运行测试。我会搜索一些关于它的信息,然后我会带着一些新闻回来。在查看文档之后[我意识到nunit控制台有一个参数--agents,用于控制并行运行程序集,如果未指定,则所有代理进程都会同时运行测试,无论程序集的数量如何。当我在命令行上添加--agents=1时,所有测试都会成功运行。您能在回答中添加此信息吗?可能是这样的lp其他用户。感谢您的指导。我研究了我的解决方案,没有关于并行运行测试的明确说明。但这是有意义的。也许单元测试的默认配置是并行运行测试。我会搜索一些关于它的信息,然后我会带着一些消息回来。查看文档后N[我意识到nunit控制台有一个参数--agents,用于控制并行运行程序集,如果未指定,则所有代理进程都会同时运行测试,无论程序集的数量如何。当我在命令行上添加--agents=1时,所有测试都会成功运行。您能在回答中添加此信息吗?可能是这样的lp未来的其他用户。感谢您的指导。
nunit3-console (ls -r ./tests/**/bin/**/*.Tests.dll -exclude *.Product* | % FullName | sort-object -Unique) --teamcity --x86 --framework=v4.0