-1

我有一个基本的测试设置,TestA依赖于ConfigATestB依赖于ConfigB.


@Configuration
public class ConfigA {

    // define A beans

}

@Configuration
public class ConfigB {

    // define B beans

}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { ConfigA.class })
public class TestA {

    @Test
    public void testA() {
        // test with A beans
    }

}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { ConfigB.class })
public class TestB {

    @Test
    public void testB() {
        // test with B beans
    }

}

我想同时运行TestATestB使用测试套件AllTests

@RunWith(Suite.class)
@SuiteClasses({ TestA.class, TestB.class })
public class AllTests {

}

就目前而言,运行AllTests将强制 Spring 在运行时同时ConfigA加载ConfigB

ConfigA将性能整合并ConfigB纳入ConfigC并使用这两个测试会更好ConfigC吗?

@Configuration
public class ConfigC {

    // define A and B beans

}
4

1 回答 1

1

它应该或多或少相同,性能方面 - Spring 测试以任何一种方式缓存上下文,因此如果您的任何其他测试使用 ContextA 或 ContextB ,它们将从缓存中重用,而不是为每个测试重新创建。与合并的上下文相比,使用两个单独的上下文(A 和 B)会产生更多的开销,但它不应该那么明显。

这是官方文档中的一段话:

Spring TestContext 框架提供了 Spring ApplicationContexts 和 WebApplicationContexts 的一致加载以及这些上下文的缓存。支持加载上下文的缓存很重要,因为启动时间可能会成为一个问题——不是因为 Spring 本身的开销,而是因为 Spring 容器实例化的对象需要时间来实例化。例如,具有 50 到 100 个 Hibernate 映射文件的项目可能需要 10 到 20 秒来加载映射文件,并且在每个测试夹具中运行每个测试之前产生该成本会导致整体测试运行速度变慢,从而降低开发人员的工作效率。

默认情况下,一旦加载,配置的 ApplicationContext 将被重复用于每个测试。因此,每个测试套件只产生一次设置成本,随后的测试执行速度要快得多。在这种情况下,术语测试套件意味着所有测试都在同一个 JVM 中运行——例如,所有测试都从给定项目或模块的 Ant、Maven 或 Gradle 构建中运行。

以下是官方文档中有关上下文缓存的一些更值得注意的引述:

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

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

从 Spring Framework 4.3 开始,上下文缓存的大小以默认的最大大小 32 为界。每当达到最大大小时,都会使用最近最少使用 (LRU) 驱逐策略来驱逐和关闭陈旧的上下文。可以从命令行或构建脚本通过设置名为 的 JVM 系统属性来配置最大大小spring.test.context.cache.maxSize。作为替代方案,可以通过 SpringProperties API 以编程方式设置相同的属性。

于 2016-08-10T08:42:19.217 回答