忽略超时属性

Mar*_*ein 3 .net c# xunit.net

我使用控制台运行程序 (xUnit 2.4.1) 来执行一组测试。如果某些测试需要很长时间才能完成,它们应该会失败,但似乎Timeout忽略了属性。

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

[Fact(Timeout = 1000)]
public void ShouldTimeout()
{
    Thread.Sleep(15000);
}
Run Code Online (Sandbox Code Playgroud)

我使用选项执行 runner-parallel none以避免未定义的行为

xunit.console.exe tests.dll -parallel none -method "Tests.TessClass.ShouldTimeout"
Run Code Online (Sandbox Code Playgroud)

我还添加[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
Run Code Online (Sandbox Code Playgroud)

我错过了什么?并行化是否仍然没有被禁用,因此Timeout被忽略?

Yur*_*ura 5

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

但是,Timeout如果您的测试代码完整,则工作正常async

[Fact(Timeout = 1000)]
public async void ShouldTimeout()
{
    await Task.Delay(3000);
}
Run Code Online (Sandbox Code Playgroud)

所以我在这里看到了 2 个选项:要么为 xUnit 创建一个关于同步代码阻塞破坏Timeout行为的错误,要么重写你的代码,async如果你的代码库允许的话。