我使用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
被忽略了吗?
3条答案
按热度按时间llmtgqce1#
看起来xUnit代码有一些内部SynchronizationContext用法,这导致在测试中执行同步等待时阻塞所有线程-例如Thread.Sleep()。请参见源代码
但是,如果测试代码完全是
async
,Timeout
就可以正常工作:所以我认为你有两个选择:创建一个关于同步代码阻塞破坏
Timeout
行为的xUnit错误,或者如果代码库允许,将代码重写为async
。nqwrtyyt2#
如果你的方法不是异步的,你可以尝试 Package 它。
动作动作=()=〉_类.方法();等待任务运行(动作);
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 ...