集成测试

能够执行一些集成测试而无需部署到应用服务器或连接到其他企业基础设施是非常重要的。这样做可以让您测试以下内容:

  • Spring IoC容器上正确的装配。

  • 使用JDBC或ORM工具进行数据访问。这可能包括SQL语句的正确性、Hibernate查询、JPA实体映射等。

Spring框架在spring-test模块中提供了一流的集成测试支持。实际的JAR文件名称可能包含发布版本,并且可能采用长的org.springframework.test形式,具体取决于您从何处获取(请参阅有关依赖管理的部分以获取解释)。该库包括org.springframework.test包,其中包含用于与Spring容器进行集成测试的有价值的类。这种测试不依赖于应用服务器或其他部署环境。这些测试运行速度比单元测试慢,但比等效的Selenium测试或依赖于部署到应用服务器的远程测试要快得多。

单元测试和集成测试支持以基于注解的Spring TestContext Framework的形式提供。TestContext框架与实际使用的测试框架无关,这允许在各种环境中对测试进行仪器化,包括JUnit、TestNG等。

以下部分概述了Spring集成支持的高级目标,本章的其余部分将重点介绍专门的主题:

集成测试的目标

Spring的集成测试支持具有以下主要目标:

接下来的几节将描述每个目标并提供实现和配置细节的链接。

上下文管理和缓存

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

测试类通常声明XML或Groovy配置元数据的资源位置数组(通常在类路径中)或用于配置应用程序的组件类数组。这些位置或类与生产部署的web.xml或其他配置文件中指定的位置或类相同或类似。

默认情况下,一旦加载,配置的ApplicationContext将在每个测试中重复使用。因此,设置成本仅在每个测试套件中发生一次,随后的测试执行速度更快。在这种情况下,“测试套件”一词指的是在同一个JVM中运行的所有测试,例如从Ant、Maven或Gradle构建中运行的给定项目或模块的所有测试。在极少数情况下,如果一个测试破坏了应用程序上下文并需要重新加载(例如通过修改bean定义或应用程序对象的状态),则可以配置TestContext框架在执行下一个测试之前重新加载配置并重建应用程序上下文。

请参阅使用TestContext框架进行上下文管理上下文缓存

测试夹具的依赖注入

当TestContext框架加载您的应用程序上下文时,它可以选择使用依赖注入来配置您的测试类的实例。这提供了一种方便的机制,通过使用应用程序上下文中预配置的bean来设置测试夹具。这里的一个重要好处是,您可以在各种测试场景中重用应用程序上下文(例如,用于配置Spring管理的对象图、事务代理、DataSource实例等),从而避免为单个测试用例复制复杂的测试夹具设置的需要。

例如,考虑一个实现Title领域实体的数据访问逻辑的类(HibernateTitleRepository)。我们希望编写集成测试来测试以下方面:

  • Spring配置:基本上,与HibernateTitleRepository bean配置相关的一切是否正确且存在?

  • Hibernate映射文件配置:一切是否正确映射,是否设置了正确的延迟加载设置?

  • HibernateTitleRepository的逻辑:配置的此类实例是否按预期运行?

请参阅使用TestContext框架进行测试夹具的依赖注入TestContext框架

事务管理

在访问真实数据库的测试中的一个常见问题是它们对持久性存储的状态的影响。即使使用开发数据库,状态的更改也可能影响未来的测试。此外,许多操作(例如插入或修改持久数据)无法在事务之外执行(或验证)。

TestContext框架解决了这个问题。默认情况下,框架为每个测试创建并回滚一个事务。您可以编写可以假定存在事务的代码。如果在测试中调用具有事务代理的对象,则它们将根据其配置的事务语义正确地行为。此外,如果测试方法在受管理的事务中运行时删除了选定表的内容,事务将默认回滚,并且数据库将返回到执行测试之前的状态。通过在测试的应用程序上下文中使用定义的PlatformTransactionManager bean,为测试提供了事务支持。

如果要使事务提交(不太常见,但偶尔在想要特定测试填充或修改数据库时有用),您可以告诉TestContext框架使用@Commit注解使事务提交而不是回滚。

请参阅使用TestContext框架进行事务管理

集成测试支持类

Spring TestContext框架提供了几个简化编写集成测试的abstract支持类。这些基础测试类为测试框架提供了明确定义的钩子,以及方便的实例变量和方法,让您可以访问:

  • ApplicationContext,用于执行显式的bean查找或测试上下文的整体状态。

  • JdbcTemplate,用于执行SQL语句以查询数据库。您可以使用这些查询来确认数据库状态在执行与数据库相关的应用程序代码之前和之后,Spring确保这些查询在与应用程序代码相同事务范围内运行。与ORM工具一起使用时,请确保避免误报

此外,您可能希望创建自己的自定义、应用程序范围的超类,具有特定于项目的实例变量和方法。

请参阅使用TestContext框架的支持类