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

本文关键字:NUnit 在内部 什么 超时 测试 | 更新日期: 2023-09-27 18:25:44

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会在内部做什么

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

关于中止的部分在文档中并不明确,但在深入了解NUnit代码库时就很明显了。详见TestThread.RunTest

编辑*

测试在超时时失败的原因(即使您捕捉到异常)是因为测试在中止线程之前被标记为失败。因此,它是否被期望是没有意义的,因为它已经被标记为失败。

NUnit从不导致异常从代码内部神奇地出现。NUnit测试运行程序使用一个线程从运行代码,如果超过指定的超时时间,就会中止该线程。

当运行代码的线程中止时,将生成ThreadAbortException。由于NUnit知道它自己导致了这个异常,所以添加ExpectedException(typeof(ThreadAbortException))不会导致测试通过