4

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();
}
4

2 回答 2

5

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

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

编辑*

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

于 2012-02-25T22:08:20.457 回答
1

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

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

于 2012-02-25T22:06:38.100 回答