Multithreading 与maven并行运行Spring测试

Multithreading 与maven并行运行Spring测试,multithreading,spring,integration-testing,Multithreading,Spring,Integration Testing,我有一组使用SpringJUnit4ClassRunner运行的集成测试。我正在尝试使用maven surefire并行运行这些。但是,我注意到代码在进入CacheAwareContextLoaderDelegate.loadContext()中的同步块之前被阻塞 有没有办法绕过这个缓存?我尝试过这样做,但似乎共享状态比缓存本身更多,因为我的应用程序在Spring代码中死锁了。或者,通过某种方式在映射键上而不是在整个映射上进行同步,可以使同步变得更细粒度吗 我并行测试的动机有两个: 在一些测试中

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

有没有办法绕过这个缓存?我尝试过这样做,但似乎共享状态比缓存本身更多,因为我的应用程序在Spring代码中死锁了。或者,通过某种方式在映射键上而不是在整个映射上进行同步,可以使同步变得更细粒度吗

我并行测试的动机有两个:

  • 在一些测试中,我用mock替换bean。由于mock本质上是有状态的,因此我必须使用
    @DirtiesContext
    为每个测试方法构建一个新的应用程序上下文
  • 在其他测试中,我只想部署Jersey资源的一个子集。为此,我指定了Spring配置类的子集。由于Spring使用
    MergedContextConfiguration
    作为上下文缓存中的键,这些测试将无法共享ApplicationContexts

  • 我可以想到的一件简单的事情是使用@DirtiesContext

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

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

    为什么要这样实施

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

    缓存是如何工作的

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

    为了从缓存机制中获益,所有测试都必须在同一进程或测试套件中运行。这可以通过在IDE中作为一个组执行所有测试来实现。类似地,当使用构建框架(如Ant、Maven或Gradle)执行测试时,确保构建框架不会在测试之间分叉非常重要例如,如果Maven Surefire插件的forkMode设置为always或pertest,TestContext框架将无法在测试类之间缓存应用程序上下文,因此构建过程将运行得非常慢。


    谢谢你,我知道这个注释。它可以清除测试类或测试方法之间的上下文,但据我所知并不能避免全局锁定。确切地说,在我看来,使用@DirtiesContext应该被视为一种反模式。谢谢,我不认为我读过文档中的那一段。我更新了我的问题,以解释我并行化的动机。希望能很快得到修复。@hertzsprung我建议您创建一个单独的模拟应用程序上下文(或一个包含模拟的测试),该上下文可以被其他测试缓存和重用(如果您
    reset()
    被模拟对象的状态,例如在
    @Before
    @Before
    中,这是可能的。Read可以在my中找到更多信息).