究竟会NUnit的内部时候做一个测试超时被违反?

究竟是什么做的NUnit当它遇到超时? 我曾经以为它会抛出一个TimeoutException中止测试,但这个测试证明并非如此:

[Test, Timeout(100), ExpectedException(typeof(TimeoutException))] public static void RaisingExpectedTimeoutException() { Thread.Sleep(500); }

可惜的nunit控制台只报告违反了超时的,但不是测试是如何被它中止。 有没有人在那里谁知道更多关于这将如何工作的? 为什么上面的测试并没有提高,我预计TimeoutException异常? (即使它是一个.NET异常类型,我想通NUnit的使用了异常超时违规)。

PS:这种测试方法也失败了:

[Test, Timeout(100), ExpectedException(typeof(ThreadAbortException))] public static void RaisingExpectedThreadAbortException() { Thread.Sleep(500); }

这种测试方法成功(“没有人希望西班牙宗教裁判所”!):

[Test, ExpectedException(typeof(ThreadAbortException))] public static void ThrowingExpectedThreadAbortException() { Thread.CurrentThread.Abort(); }

--------------解决方案-------------

如果在NUnit的一个测试方法指定超时那么它将从试验的其余一个单独的线程中运行。 如果测试超过它的超时创建的线程将通过被粗暴地中止Thread.Abort

关于中止部分不是文档中明确的,但在深入挖掘NUnit的代码库明显。 见TestThread.RunTest的详细信息。

编辑*

究其原因,当它超时,尽管你捕获该异常,是因为测试是为失败它将中止线程之前标记测试失败。 因此,不论它的预期是没有意义的,因为它已经标记为失败。

NUnit的永远不会导致异常神奇地从你的代码中出现。 NUnit的测试运行,从与线程中运行你的代码,如果超过规定的超时时间中止该线程。

当您运行代码的线程被中止一个ThreadAbortException产生。 由于NUnit的知道这一点导致此异常本身添加ExpectedException(typeof(ThreadAbortException))不会导致测试通过。

分类:C# 时间:2012-07-27 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.484 (s). 10 q(s)