当违反测试超时时,NUnit会在内部做什么?

NUnit遇到超时时究竟做了什么? 我曾经认为它会通过抛出TimeoutException来中止测试,但是这个测试certificate不是这样:

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

不幸的是,nunit控制台只报告违反超时的情况,但不报告测试是如何被中止的。 是否有人知道这将如何工作? 为什么上面的测试没有引起我预期的TimeoutException? (尽管它是.NETexception类型,但我认为NUnit使用Exception来处理超时违规)。

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

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

并且这种测试方法成功了(“没人希望西class牙人的调查!”):

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

如果NUnit中的测试方法指定超时,那么它将在与其余测试不同的线程上运行。 如果测试超过它的超时,则创建的线程将通过Thread.Abort地中止。

关于中止的部分在文档中没有明确,但在深入研究NUnit代码库时很明显。 有关详细信息,请参阅TestThread.RunTest

编辑*

即使您捕获exception,测试在超时时失败的原因是因为测试在中止线程之前被标记为失败。 因此,它是否预期是没有意义的,因为它已被标记为失败。

NUnit永远不会导致exception从代码中神奇地出现。 NUnit测试运行器使用线程运行代码,如果花费的时间超过指定的超时,则中止该线程。

当运行代码的线程中止时,会生成ThreadAbortException 。 由于NUnit知道它本身导致了这个exception,因此添加ExpectedException(typeof(ThreadAbortException))不会导致测试通过。