超时属性被忽略
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
。
我使用控制台运行器 (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
。