非确定性多线程测试
本文关键字:测试 多线程 确定性 非确定 | 更新日期: 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
将防止异常被抛出。我真是太傻了