NUnit中单个测试的超时限制

22

我知道NUnit有一个超时(Timeout)属性。我的问题是,单元测试实际上会生成一个新进程,如果该进程被冻结,NUnit无法杀死它。我该如何实现一个超时机制来摆脱这个“流氓进程”?

4个回答

18

您可以使用断言的超时时间,而不是整个测试方法的超时时间:

Assert.That(actual, Is.EqualTo(expected).After(5000, 50));

绝对棒极了。你可以在此之后清理线程。 - ashes999
就算这个很好,但在我的场景下我无法让它工作 - 生成另一个进程,弹出一个对话框,除非你点击按钮,否则 NUnit 永远不会停止它。 - Radoslav Hristov
1
好的,既然你不进行验收测试,我建议你使用以下工具之一: 1)White http://white.codeplex.com/Thread/View.aspx?ThreadId=85842&ANCHOR 2)NUnit Forms http://nunitforms.sourceforge.net/这两个工具都适用于创建窗口和按按钮。 - Sergey Berezovskiy
我同意,如果我想测试对话框是否弹出等,这将是一个不错的方法。以上仅是一个例子。 - Radoslav Hristov
1
嗯...你可以使用另一种方法 - 在[TearDown]方法中手动终止该进程。 - Sergey Berezovskiy
我已经给出了最佳答案,尽管我无法到达[TearDown]。它只停留在调用中,而NUnit完全不知道所有的超时情况。我会尝试写一个小例子来展示我的意思。 - Radoslav Hristov

5

编辑:被采纳的答案更好。

如果您的测试最终超时(尽管比您希望的晚),您可以始终使用MaxTime属性:http://www.nunit.org/index.php?p=maxtime&r=2.5.1并自己清理线程:

[Test, Maxtime(2000)]
public void TimedTest()
{
    ...
}

否则,您最好的选择可能是实现自己的定时机制。使用定时器(或繁忙的while循环),如果超时,则终止进程(如果它在测试中通用,则可以在ShutDown方法中执行)并发出失败信号。
NUnit超时没有任何事件可以让您在测试超时后运行代码。看起来您必须自己编写。

1
很可能我将不得不走第二条路。仅举一个例子 - 如果产生的进程在构建机器上弹出消息 - 没有人点击它 - NUnit超时将永远不会发生作用。因此,必须使用自己的定时机制。 - Radoslav Hristov

4
[Test, Timeout(2000)]
public void PotentiallyLongRunningTest()
{
    ...
}

http://www.nunit.org/index.php?p=timeout&r=2.5.1 :

TimeoutAttribute用于指定测试用例的超时时间(以毫秒为单位)。如果测试用例运行时间超过指定的时间,则立即取消并报告为失败,并显示超时消息。

该属性还可以在fixture或assembly上指定,这表示子测试用例的默认超时时间。


0

好的。在我尝试了所有内置的 NUnit 功能并未能达到我所需的目标后,我做了以下操作:我添加了一个计时器,在一个被标记为 [SetUp] 的函数中设置它,该函数在每个测试之前被调用。如果计时器在测试完成之前触发,我只需在计时器回调中进行清理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接