Java-并发/阻塞队列单元测试策略

Java-并发/阻塞队列单元测试策略,java,testing,concurrency,Java,Testing,Concurrency,我有一个程序,它可以从阻塞队列中提取工作项,并同时处理它们。我意识到这是一个非常松散的描述,但是有人能就测试什么提出一个单元测试策略/想法吗?使用java.util.concurrent中的工作队列机制,并依靠它们来测试代码。然后,只需测试你的工人,以确保它做正确的事情。如果它独立于其他线程,那就足够了。否则,您可能需要在与您的生产环境相匹配的硬件/os/jvm配置上提出一个集成测试策略。您需要设计它以进行测试 因此,具体建议如下: 确保可以将测试类或模拟放入队列中 对一些早期模拟进行编码,使

我有一个程序,它可以从阻塞队列中提取工作项,并同时处理它们。我意识到这是一个非常松散的描述,但是有人能就测试什么提出一个单元测试策略/想法吗?

使用java.util.concurrent中的工作队列机制,并依靠它们来测试代码。然后,只需测试你的工人,以确保它做正确的事情。如果它独立于其他线程,那就足够了。否则,您可能需要在与您的生产环境相匹配的硬件/os/jvm配置上提出一个集成测试策略。

您需要设计它以进行测试

因此,具体建议如下:

  • 确保可以将测试类或模拟放入队列中
  • 对一些早期模拟进行编码,使其花费更长的时间,并确保它们不是第一个完成的模拟(演示并发性)
  • 确保结果集合的大小与所有测试的大小相同
  • 确保在分配给最长测试的时间之前,您的结果不会完整

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

这取决于您的类对提取的项目执行何种处理。例如,假设他们将项目写入数据库。您可能需要这样的测试

  • 单个线程可以从队列中提取项目并将其保存到数据库中
  • 两个线程可以同时从队列中提取项目,如果第一个线程尝试先保存数据,则会保存数据
  • 两个线程可以同时从队列中提取项目,如果第二个线程尝试先保存数据,则会保存数据
  • 五十个线程(或任何适合您的程序的限制)可以同时从队列中提取项目,并正确保存数据
如果您使用的是JDK阻塞队列实现之一,或者来自第三方的实现,那么请确保不要尝试测试阻塞队列类本身的行为。当然,如果您已经编写了自己的测试,那么您就需要编写更多的测试


希望这能有所帮助。

您想测试什么,阻塞队列或对返回值的并发处理的有效性?我已经测试了阻塞队列处理程序实际工作的有效性,但我想测试一下它的操作代码。并发性测试很棘手:你可能有一个糟糕的多线程程序,它可以在某些平台(例如单核CPU)上完美地通过所有测试,但在其他平台上会失败。即使您的测试在多核CPU上成功,不同操作系统的线程调度也会有所不同,并且可能在其他地方失败。