与maven并行运行Spring测试

her*_*ung 8 spring multithreading integration-testing

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

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

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

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

mat*_*sev 5

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

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

为什么这样实现?

这意味着加载应用程序上下文的设置成本仅产生一次(每个测试套件),并且后续测试执行要快得多.

缓存如何工作?

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

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