NUnit断言在单独的线程中

6

nunit在多线程环境中适用吗?我当然不想使用nunit来测试我的多线程应用程序,但想要使用nunit的断言。

这是一个简单的例子 - 这个测试是"绿色"的。我做错了什么吗?

[Test]
public void Test()
{
  Action action = Async;
  action.BeginInvoke(action.EndInvoke, null).AsyncWaitHandle.WaitOne();
}

private void Async()
{
  Assert.IsTrue(false);
  Assert.DoesNotThrow( () =>
                       {
                         Console.WriteLine("Async");
                         throw new InvalidOperationException();
                       });
}
2个回答

9
NUnit测试运行程序可配置为忽略非测试线程上的异常。您可以通过app.config配置元素来配置此行为: legacyUnhandledExceptionPolicy 您可以配置非测试线程引发未处理的异常,从而导致测试失败。但是需要注意的是,在另一个测试正在运行时,可能会引发非测试线程异常,因此您可能无法准确了解哪个测试失败了。此外,由于这将是未处理的异常,测试执行将在异常发生的点停止,而不是继续,这是正常行为。
但我认为比忽略要好。
以下文章详细介绍了ReSharper测试运行程序的主题,但原则相同。 ReSharper测试运行程序 - 隐藏的线程异常 如果您涉及多线程方面,在断言方面,我认为最好在非测试线程上设置标志等待非测试线程完成,然后在测试线程上断言状态。这样可以在主线程上引发断言异常,并按预期运行测试。
    [Test]
    public void Test()
    {
        Exception ex = null;

        Action test = () =>
        {
            Console.WriteLine("Async");

            ex = new InvalidOperationException();
        };

        test.BeginInvoke(test.EndInvoke, null).AsyncWaitHandle.WaitOne();

        Assert.That(ex, Is.Null, "Exception did not happen.");
    }

1
Assert.IsTrue(false);

在DoesNotThrow调用之前会抛出异常。但是NUnit不支持多线程。跨线程更多的是集成测试而不是单元测试。一般来说,我建议避免从外部公开线程/任务,并使其成为所使用对象的内部行为-这样您就可以为测试目的模拟此行为。


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