.net 已忽略超时属性

yizd12fk  于 2023-01-22  发布在  .NET
关注(0)|答案(3)|浏览(143)

我使用console runner(xUnit 2.4.1)来执行一组测试。有些测试可能会失败,因为它们需要很长时间才能完成,但似乎Timeout属性被忽略了。
这是我应该失败的简单测试方法:

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

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

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

llmtgqce

llmtgqce1#

看起来xUnit代码有一些内部SynchronizationContext用法,这导致在测试中执行同步等待时阻塞所有线程-例如Thread.Sleep()。请参见源代码
但是,如果测试代码完全是asyncTimeout就可以正常工作:

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

所以我认为你有两个选择:创建一个关于同步代码阻塞破坏Timeout行为的xUnit错误,或者如果代码库允许,将代码重写为async

nqwrtyyt

nqwrtyyt2#

如果你的方法不是异步的,你可以尝试 Package 它。
动作动作=()=〉_类.方法();等待任务运行(动作);

bq9c1y66

bq9c1y663#

在xUnit v2中,不再支持[Timeout]属性。
详情如下:Migrating unit tests from v1 to v2
摘录:
对自动超时测试的支持已经从www.example.com v2中删除,并且没有直接的替代功能,删除的原因是v2从一开始就被设计成异步和并行的,在这样的设计中精确地定时测试实际上是不可能的。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 runner ...

相关问题