非确定性多线程测试

本文关键字:测试 多线程 确定性 非确定 | 更新日期: 2023-09-27 18:08:24

我有一个扩展方法。

public static void BeginInvokeWithAutoEnd(this EventHandler handler, object sender, EventArgs eventArgs)
{
    var buffer = handler;
    buffer.BeginInvoke(sender, eventArgs, buffer.EndInvoke, null);
}
要测试它,有以下方法:
[TestMethod]
public void BeginInvokeWithAutoEnd_SubscribedMethodThrowsException_ExceptionCanBeCaught()
{
    var multiThreadTest = new MultiThreadTest(2);//Class that helps to test asynchronous stuff 
    var thrown = false;
    var ex = new Exception("OOoooOOo!");
    EventHandler onHandler = (s, a) => { throw ex; };
    UnhandledExceptionEventHandler currentDomainOnUnhandledException = (s, args) =>
    {
        thrown = args.ExceptionObject.Equals(ex);
        multiThreadTest.Notify();
    };
    AppDomain.CurrentDomain.UnhandledException += currentDomainOnUnhandledException;
    //Invokes Action from the parameter and waits for multiThreadTest.Notify(); method to be called, otherwise 2 seconds
    multiThreadTest.Act(() => onHandler.BeginInvokeWithAutoEnd(this, EventArgs.Empty));
    AppDomain.CurrentDomain.UnhandledException -= currentDomainOnUnhandledException;
    Assert.IsTrue(thrown);
}

测试本身工作得很好,但它随机破坏了我的其他测试之一。当我看到破碎的测试时,它被写为:The agent process was stopped while the test was running.。这意味着在运行中断的测试时,另一个线程中存在未处理的异常。

我不知道怎么会发生这种事。

非确定性多线程测试

尝试检查事件查看器(事件查看器-> Windows日志->应用程序)中的事件。Net Runtime"作为源。如果有一些未处理的异常,它们应该记录在那里。

我真笨。

测试流程:
-测试已经开始
-在另一个线程中抛出异常(我们称之为"线程X")
- AppDomain.CurrentDomain.UnhandledException升高
-测试结束,而"线程X"仍然运行,还没有完成抛出异常
"线程X"抛出异常,而另一个测试已经开始

由于一些未知的原因,我认为订阅AppDomain.CurrentDomain.UnhandledException将防止异常被抛出。我真是太傻了