超时属性被忽略

时间:2019-06-06 08:22:36

标签: c# .net xunit.net

我使用控制台运行程序(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被忽略了吗?

2 个答案:

答案 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运行程序...