与maven并行运行Spring测试

时间:2013-05-07 09:07:04

标签: multithreading spring integration-testing

我有一组与SpringJUnit4ClassRunner一起运行的集成测试。我正在尝试使用maven surefire并行运行这些。但是,我注意到在CacheAwareContextLoaderDelegate.loadContext()中输入同步块之前代码是阻塞的。

有没有办法绕过这个缓存?我尝试这样做,但似乎有更多的共享状态而不仅仅是缓存本身,因为我的应用程序在Spring代码中死锁。或者可以通过以某种方式同步地图键而不是整个地图来使同步更精细?

我将测试并行化的动机是双重的:

  1. 在某些测试中,我用嘲笑取代豆子。由于模拟本质上是有状态的,我必须使用@DirtiesContext为每个测试方法构建一个新的ApplicationContext。
  2. 在其他测试中,我只想部署Jersey资源的子集。为此,我指定了Spring配置类的子集。由于Spring使用MergedContextConfiguration作为上下文缓存中的键,因此这些测试将无法共享ApplicationContexts。

2 个答案:

答案 0 :(得分:5)

如果您禁用并行测试执行,可能会为您的测试套件获得更好的周转时间。在Spring的参考文档的测试章节中,有一段关于Context caching

的段落
  

一旦TestContext框架为测试加载ApplicationContext(或WebApplicationContext),该上下文将被缓存并重用于在同一测试套件中声明相同唯一上下文配置的所有后续测试。

为什么这样实现?

  

这意味着加载应用程序上下文的设置成本只发生一次(每个测试套件),后续测试执行速度要快得多。

缓存如何工作?

  

Spring TestContext框架将应用程序上下文存储在静态缓存中。这意味着上下文实际上存储在静态变量中。换句话说,如果测试在单独的进程中执行,则静态高速缓存将在每次测试执行之间被清除,这将有效地禁用高速缓存机制。

     

要从缓存机制中受益,所有测试必须在同一进程或测试套件中运行。这可以通过在IDE中作为一个组执行所有测试来实现。类似地,当使用诸如Ant,Maven或Gradle之类的构建框架执行测试时,确保构建框架不在测试之间进行分配是很重要的。 例如,如果Maven Surefire插件的forkMode设置为always或pertest,则TestContext框架将无法在测试类之间缓存应用程序上下文,因此构建过程的运行速度会明显变慢。 /强>

答案 1 :(得分:0)

我能想到的一件容易的事就是使用@DirtiesContext