我使用控制台运行程序(xUnit 2.4.1)执行一组测试。如果某些测试需要太长时间才能完成,则某些测试应该会失败,但是Timeout
属性似乎被忽略了。
这是我应该失败的简单测试方法:
[Fact(Timeout = 1000)]
public void ShouldTimeout()
{
Thread.Sleep(15000);
}
为了避免使用undefined behaviour,我使用选项-parallel none
执行运行程序:
xunit.console.exe tests.dll -parallel none -method "Tests.TessClass.ShouldTimeout"
,我也将[assembly: CollectionBehavior(DisableTestParallelization = true)]
添加到了程序集配置中。
但是,测试仍然成功完成,并显示以下输出。
xUnit.net Console Runner v2.4.1 (64-bit Desktop .NET 4.5.2, runtime: 4.0.30319.42000)
Discovering: tests
Discovered: tests
Starting: tests
Finished: tests
=== TEST EXECUTION SUMMARY ===
tests Total: 1, Errors: 0, Failed: 0, Skipped: 0, Time: 15,151s
我错过了什么吗?仍然没有禁用并行化,因此Timeout
被忽略了吗?
答案 0 :(得分:3)
xUnit代码看起来有一些内部SynchronizationContext用法,当在测试内部执行同步等待时(即Thread.Sleep()),导致所有线程被阻塞。 See source code
但是,如果您的测试代码完全是Timeout
,则async
可以正常工作:
[Fact(Timeout = 1000)]
public async void ShouldTimeout()
{
await Task.Delay(3000);
}
因此,我在这里为您提供2个选择:或者为xUnit创建有关阻止中断Timeout
行为的同步代码的bug,或者在您的代码库允许的情况下将代码重写为async
。
答案 1 :(得分:0)
在xUnit v2中,不再支持[Timeout]
属性。
详细信息在这里:Migrating unit tests from v1 to v2
节选:
从xUnit.net v2中删除了对自动超时测试的支持,并且不能直接替换此功能。删除它的原因是v2从头开始设计为异步和并行的,因此在这种设计中准确地进行定时测试实际上是不可能的。
虽然我期望编译时出现错误,但我注意到您正在使用v2运行程序...