为什么NUnit超时属性不起作用?

时间:2015-12-15 21:59:02

标签: c# nunit

我正在尝试在Visual Studio中的测试中使用NUnit Timeout属性,但它似乎不起作用。我希望这个测试失败,但它会运行20秒然后通过。

为什么不失败?

namespace Tests
{
    using System.Threading;
    using NUnit.Framework;

    [TestFixture]
    public class timeout_tests
    {
        [Test, Timeout(1)]
        public void timeout_test()
        {
            Thread.Sleep(20000);
        }
    }
}

我尝试使用NUnit.framework.dll版本3.0.0以及最新版本3.0.1。两个版本的测试在20秒后通过。

2 个答案:

答案 0 :(得分:1)

事实证明,使用较旧的NUnit测试适配器(例如版本2.0.0.0),测试在20秒后通过,这不是预期的结果。

删除旧适配器并安装NUnit3测试适配器后,现在测试立即失败,这是预期的结果。

答案 1 :(得分:-1)

这似乎已在latest version of the NUnit adapter,2.1.1。

中修复 但是,我个人被愚弄了,因为我发送了大量的输出到Console(在输出窗口中捕获,我相信适配器)很快。这在输出中创建了一种“后退日志”,.NET希望在测试退出之前完成发送它收到的输出。您可以使用以下测试模拟此行为:

[Test, Timeout(10000)] // Time out in 10 seconds
public void Test_MyFunction_DoesNotRunForever()
{
    DateTime start = DateTime.Now;
    while (true)
    {
        TimeSpan runTime = DateTime.Now - start;
        System.Diagnostics.Debug.WriteLine("Doing stuff for " + runTime.TotalSeconds + " seconds." + (runTime.TotalSeconds > 10 ? " Buggy! :(" : ""));
    }
}

如果你看着它运行,你会注意到即使在几分钟过后,它仍然像Doing stuff for 2.043 seconds.那样打印输出。

如果你不想减少输出,你应该使用Thread.Sleep之类的人工减速来减慢输出速度,最好不要改变代码。即使Thread.Sleep(1)足以防止这样的积压。想到的一些选项:

  • 如果你有嘲笑,你可以在你的一个模拟回叫中暂停一下
  • 重新组织您的代码以接受输出接收器作为参数,因此您可以提供一个添加短暂暂停然后传递输出的存根。