单元测试多线程应用程序

时间:2010-10-12 12:47:07

标签: multithreading unit-testing junit

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

答案 2 :(得分:2)

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

相反,您可以正常测试应用程序的每个单线程组件,并依赖负载测试会话来识别并发问题。

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

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

答案 3 :(得分:1)

测试多线程代码没有任何内在错误,特别是如果线程是您正在测试的代码的。测试线程/异步代码的一般方法是阻塞主测试线程,从其他线程捕获任何失败的断言,取消阻塞主测试线程并重新抛出任何失败。 ConcurrentUnit为您解决了大部分问题:

  final Waiter waiter = new Waiter();

  new Thread(() -> {
    doSomeWork();
    waiter.assertTrue(true);
    waiter.resume();
  }).start();

  // Wait for resume() to be called
  waiter.await(1000);