超时属性被忽略

Timeout attribute ignored

我使用控制台运行器 (xUnit 2.4.1) 来执行一组测试。有些测试应该会失败,以防它们需要太长时间才能完成,但似乎 Timeout 属性被忽略了。

这是我应该失败的简单测试方法:

[Fact(Timeout = 1000)]
public void ShouldTimeout()
{
    Thread.Sleep(15000);
}

我使用选项 -parallel none 执行 runner 以避免 undefined behaviour:

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 被忽略?

在 xUnit v2 中,不再支持 [Timeout] 属性。

详情在这里:Migrating unit tests from v1 to v2

摘录:

The support for tests that automatically time out has been removed from xUnit.net v2, and there is no direct replacement for this feature. The reason it was removed was that v2 is designed from the ground up to be async and parallel, and accurately timing tests in such a design is effectively impossible.

虽然我预计会出现编译时错误,但我注意到您使用的是 v2 运行程序...

看起来 xUnit 代码有一些内部 SynchronizationContext 用法,这导致在测试中执行同步等待时所有线程都被阻塞 - 即 Thread.Sleep()。 See source code

但是,如果您的测试代码完全 async:

Timeout 工作正常
[Fact(Timeout = 1000)]
public async void ShouldTimeout()
{
    await Task.Delay(3000);
}

所以我在这里为您看到 2 个选项:为 xUnit 创建一个关于同步代码阻塞破坏 Timeout 行为的错误,或者如果您的代码库允许,则将您的代码重写为 async