【问题标题】:Unit-testing multithreaded applications单元测试多线程应用程序
【发布时间】:2010-10-12 12:47:06
【问题描述】:

有没有人对多线程应用程序的单元测试框架有任何建议或了解?

【问题讨论】:

    标签: multithreading unit-testing junit


    【解决方案1】:

    不要单元测试多线程应用程序。重构代码以消除在不同线程中完成的工作之间的耦合。然后单独测试。

    【讨论】:

      【解决方案2】:

      通常您不会对多线程应用程序的并发性进行单元测试,因为单元测试不可靠且不可重现 - 由于并发错误的性质,通常不可能编写始终失败或成功的单元测试,并且所以并发代码的单元测试通常不会成为非常有用的单元测试。

      相反,您可以像往常一样对应用程序的每个单线程组件进行单元测试,并依靠负载测试会话来识别并发问题。

      也就是说,有一些用于测试并发应用程序的实验性负载测试框架,例如Microsoft CHESS - CHESS 重复运行给定的单元测试并系统地探索并发测试的每个可能的交错。这使您的单元测试可靠且可重复。

      目前,CHESS 仍处于试验阶段(可能无法与 JVM 一起使用)——现在坚持使用负载测试来排除并发问题。

      【讨论】:

      【解决方案3】:
      【解决方案4】:

      测试多线程代码本身并没有错,特别是如果线程是您正在测试的代码的重点。测试线程/异步代码的一般方法是阻塞主测试线程,从其他线程捕获任何失败的断言,解除阻塞主测试线程并重新抛出任何失败。 ConcurrentUnit 为您处理大部分工作:

        final Waiter waiter = new Waiter();
      
        new Thread(() -> {
          doSomeWork();
          waiter.assertTrue(true);
          waiter.resume();
        }).start();
      
        // Wait for resume() to be called
        waiter.await(1000);
      

      【讨论】:

        猜你喜欢
        • 2010-09-11
        • 1970-01-01
        • 2010-09-30
        • 2019-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多