非确定性多线程测试

Posted

技术标签:

【中文标题】非确定性多线程测试【英文标题】:Non-deterministic multithread test 【发布时间】:2014-06-13 11:02:52 【问题描述】:

我有一个扩展方法。这里是:

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.。这意味着在另一个线程中存在未处理的异常,而损坏的测试正在运行。

我不知道这怎么会发生。在这里将不胜感激。

【问题讨论】:

因为您正在线程池上开始工作,而不是等待它完成。 @usr 你能解释得更准确一点吗?我确实在等待multiThreadTest.Notify();。如果这就是你的意思。 BeginInvokeWithAutoEnd 从不等待并立即返回。这意味着调用Act 的行也立即返回。这就是你想要的吗? @usr 方法multiThreadTest.Act(...) 调用它作为参数接收的Action,然后等待multiThreadTest.Notify(); 这是有道理的。发布更多代码,尤其是 Act。当您使用调试器单步执行代码时会发生什么? 【参考方案1】:

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

【讨论】:

【参考方案2】:

我真是太傻了。

测试工作流程: -测试开始 - 在另一个线程中抛出异常(我们称之为“线程 X”) -AppDomain.CurrentDomain.UnhandledException 被提出 - 测试完成,而“线程 X”仍在运行并且尚未完成抛出异常 -“线程 X”抛出异常,而另一个测试已经开始

出于某种未知原因,我认为订阅AppDomain.CurrentDomain.UnhandledException 会阻止抛出异常。我真是太傻了。

【讨论】:

以上是关于非确定性多线程测试的主要内容,如果未能解决你的问题,请参考以下文章

用于测试多线程 Java 应用程序的确定性记录/重放框架

多线程线程安全

app 自动化测试 - 多设备并发 -appium+pytest+ 多线程

Java多线程线程安全和非线程安全

idea多线程debug技巧

多线程demo