在单元测试中使用多少个线程?

时间:2012-08-28 13:07:13

标签: java multithreading unit-testing

我正在测试一个线程安全类。我从不同的线程调用它的方法,以确保它们都收到相同的结果(简而言之)。这就是我决定使用多少线程的方法:

int threads = Runtime.getRuntime().availableProcessors() * 4;

这是一个好习惯吗?我应该使用多少?越多越好?

3 个答案:

答案 0 :(得分:6)

我通常会进行3组测试:

  • 在单线程环境中检查正确行为的一个线程
  • 处理器数量+ 1(或典型的应用程序设置)
  • 许多线程(比如1000)增加上下文切换和争用

对于多线程测试,我尝试通过将任务的开头与CountDownLatch同步来最大化交错,以便所有线程同时或多或少地开始执行任务。

我还试图避免在测试期间进行额外的同步(例如通过使用线程安全结构来存储一些结果),因为它可能会人为地“重新同步”测试代码 - 根据具体情况进行评估。

JCiP,第12章,是高效多线程测试的一个很好的灵感来源(即提供许多提示来引发并发错误)。

最后,正如@PeterLawrey所指出的,你不能保证你的代码在测试时是线程安全的,你只能尝试增加发现并发错误的机会。

答案 1 :(得分:0)

这取决于线程执行了多少IO。对于CPU密集型任务,每1个核心1个线程是好的,但如果您正在等待IO任务,如数据库读/写操作,文件操作 - 可以安全地将每个核心的数量增加到2个或更多个线程。只需衡量绩效,您就可以获得最佳的测试价值:)

答案 2 :(得分:0)

线程问题通常很少出现,所以想到的是,你越是强调它就会越多地引发竞争条件,争用问题等。

所以4 * #processors可能不会给你非常有意义的结果。事实上它甚至可能让你误解一切正常。

您应该估计生产中同时运行的线程数量,然后大幅超出该数量。