2012-01-10 42 views
5

我有一个程序,可以将工作项目从阻塞队列中取出,并同时对它们进行处理。我意识到这是一个非常松散的描述,但任何人都可以提出一个单元测试策略/想要测试什么?Java - 并发/阻塞队列单元测试策略

+1

你想要测试什么,BlockingQueue或并发处理对返回值的有效性? – 2012-01-10 23:11:02

+0

我已经测试了阻塞队列处理程序工作的实际工作的有效性,但我想测试围绕它的操作的代码。 – 2012-01-10 23:32:58

+0

对并发的测试非常棘手:您可以拥有一个非常糟糕的多线程程序,它可以在某些平台(例如单核CPU)上完美地通过所有测试,但在其他平台上失败。即使您的测试在多核CPU上成功,线程调度也会因不同的操作系统而有所不同,并且可能会在别处失败。 – toto2 2012-01-11 00:24:25

回答

2

在java.util.concurrent中使用工作队列机制并依赖它们来测试它们的代码。然后,测试你的工作人员,确保它做到了正确的事情。如果它独立于其他应该足够的线程。否则,您可能需要在符合您的生产环境的hardware/os/jvm配置上提出集成测试策略。

2

您需要设计它进行测试。

所以具体的建议:

  • 确保您可以将测试类或嘲笑到队列
  • 代码的一些早期的模拟,需要更长的时间,并确保他们是不是完成了第一批(演示并发性)
  • 确保您的结果集大小与所有测试相同。
  • 确保您的结果在分配给最长测试的时间后才完成。

嗯,这一切都源于能够将嘲笑/测试类注入到队列中。

+0

谢谢,这些都是好主意。 – 2012-01-10 23:34:04

2

这种类型取决于您的课程进行的处理类型,以及取消的项目。例如,假设他们将项目写入数据库。你可能想要这样的测试。

  • 单线程可以从队列中拉出一个项目并将其保存到数据库中。
  • 两个线程可以同时从队列中取出项目,并且如果第一个线程先尝试保存,则会保存数据。
  • 两个线程可以同时从队列中取出项目,并且如果第二个线程先尝试保存,则会保存数据。
  • 五十个线程(或任何限制适用于您的程序)可以同时从队列中拉出项目,并正确保存数据。

如果您正在使用某个JDK阻塞队列实现或来自第三方的实现,请确保您不要尝试测试阻塞队列类本身的行为。当然,如果你编写了自己的代码,那么你需要编写更多的测试。

希望这会有所帮助。

+0

谢谢,这些都很棒。 – 2012-01-10 23:35:15