gpt4 book ai didi

multithreading - NUnit 在单独的线程中断言

转载 作者:行者123 更新时间:2023-12-04 23:30:05 25 4
gpt4 key购买 nike

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

最佳答案

NUnit 测试运行器可执行文件被配置为忽略非测试线程上的异常。您可以通过 app.config 配置元素配置此行为:

legacyUnhandledExceptionPolicy

您可以配置非测试线程以导致未处理的异常,因此测试将失败。需要注意的是,当另一个测试正在运行时,可能会引发非测试线程异常,因此您可能无法准确了解哪个测试失败。此外,由于这将是一个未处理的异常,测试执行将在异常发生时停止,而不是继续这是正常行为。

在我看来,总比忽略好。

以下文章详细介绍了 ReSharper 测试运行器的主题,但原理是相同的。

ReSharper test runner – hidden thread exceptions

如果您确实有多线程方面,从断言的角度来看,我发现最好在非测试线程上设置标志等,等待非测试线程完成,然后在测试线程上断言状态.通过这种方式,在主线程上引发断言异常并按预期运行测试。

人为示例

    [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.");
}

关于multithreading - NUnit 在单独的线程中断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6424071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com