2010-10-12 77 views

回答

4

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

2

通常不这样做单元测试的多线程应用程序的单元测试是不可靠和可重复的并发性 - 因为并发的性质错误通常不可能编写一致的失败或成功的单元测试,因此并发代码的单元测试通常不会进行非常有用的单元测试。

取而代之,您可以像平常一样单元测试应用程序的每个单线程组件,并依靠负载测试会话来确定并发问题。

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

然而,目前CHESS仍然是实验性的(可能不适用于JVM) - 现在坚持负载测试来清除并发问题。

+0

这是链接到CHESS http://chesstool.codeplex.com/。看起来项目没有活动 – Amzath 2012-11-11 18:11:14

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);