为什么 NUnit 超时属性不起作用?
Why doesn't NUnit timeout attribute work?
我试图在 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 秒后通过。
事实证明,使用较旧的 NUnit 测试适配器(例如版本 2.0.0.0),测试会在 20 秒后通过,这不是预期的结果。
移除旧适配器并安装 NUnit3 测试适配器后,现在测试立即失败,这是预期的结果。
这似乎已在 latest version of the NUnit adapter、2.1.1.
中修复
不过,我个人被愚弄了,因为我正在向 Console
发送大量输出(我相信适配器在输出 window 中捕获了这些输出)很快。这在输出中创建了一种 "back log",并且 .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)
也足以防止这种积压。想到的一些选项:
- 如果您有模拟,您可以在其中一个模拟的回调中暂停一下
- 重新组织您的代码以接受输出接收器作为参数,这样您就可以提供一个存根来添加一个短暂的停顿,然后继续传递输出。
我试图在 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 秒后通过。
事实证明,使用较旧的 NUnit 测试适配器(例如版本 2.0.0.0),测试会在 20 秒后通过,这不是预期的结果。
移除旧适配器并安装 NUnit3 测试适配器后,现在测试立即失败,这是预期的结果。
这似乎已在 latest version of the NUnit adapter、2.1.1.
中修复不过,我个人被愚弄了,因为我正在向 Console
发送大量输出(我相信适配器在输出 window 中捕获了这些输出)很快。这在输出中创建了一种 "back log",并且 .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)
也足以防止这种积压。想到的一些选项:
- 如果您有模拟,您可以在其中一个模拟的回调中暂停一下
- 重新组织您的代码以接受输出接收器作为参数,这样您就可以提供一个存根来添加一个短暂的停顿,然后继续传递输出。