|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
集成测试
能够在无需部署到应用服务器或连接其他企业基础设施的情况下进行集成测试,这一点很重要。 这样,您可以测试以下内容:
-
Spring IoC容器上下文的正确装配。
-
使用JDBC或ORM工具进行数据访问。这包括诸如SQL语句的正确性、Hibernate查询、JPA实体映射等内容。
Spring框架在spring-test模块中为集成测试提供了一流的支持。实际JAR文件的名称可能包含发行版本号,也可能采用长org.springframework.test名称形式,具体取决于获取来源(解释说明请参见依赖管理章节)。该库包含org.springframework.test包,其中提供了用于Spring容器集成测试的有价值的类。此类测试不依赖应用服务器或其他部署环境,其运行速度虽慢于单元测试,但远快于需要部署到应用服务器的等效Selenium测试或远程测试。
单元测试和集成测试支持以注解驱动的 Spring TestContext Framework形式提供。该测试上下文框架与实际使用的测试框架无关,允许在各种环境(包括JUnit、TestNG等)中进行测试工具化。
以下部分概述了Spring集成支持的高层目标,本章其余内容将聚焦于专门章节:
集成测试的目标
Spring的集成测试支持具有以下主要目标:
-
管理 Spring IoC容器缓存 在测试之间。
-
提供对测试夹具实例的依赖注入。
-
为集成测试提供事务管理功能。
-
提供Spring特定基类,旨在协助开发者编写集成测试。
接下来的几个章节将分别阐述每个目标, 并提供相关实现与配置详情的链接。
上下文管理与缓存
Spring测试上下文框架提供了Spring
ApplicationContext实例和WebApplicationContext实例的一致性加载功能,并支持这些上下文的缓存。对已加载上下文进行缓存的支持至关重要,因为启动时间可能成为问题——问题不在于Spring本身的开销,而是Spring容器实例化的对象需要时间进行初始化。例如,一个包含50至100个Hibernate映射文件的项目可能需要10到20秒来加载这些映射文件。若在每个测试套件的每个测试执行前都承担此开销,将导致整体测试运行速度变慢,从而降低开发人员生产力。
测试类通常声明用于XML或Groovy配置元数据的资源位置数组(通常在类路径中),或用于配置应用程序的组件类数组。这些位置或类与生产部署中web.xml或其他配置文件指定的位置或类相同或相似。
默认情况下,一旦加载完成,配置好的ApplicationContext将在每个测试中复用。
因此每个测试套件仅产生一次设置成本,后续测试执行速度会显著提升。此处的"测试套件"指在同一个JVM中运行的所有测试——例如通过Ant、Maven或Gradle为特定项目或模块运行的全部测试。若测试意外破坏应用程序上下文并需重新加载(如修改Bean定义或应用程序对象状态),可配置TestContext框架在执行下个测试前重新加载配置并重建应用程序上下文。
依赖注入测试夹具
当TestContext框架加载您的应用程序上下文时,它可以选择性地
通过依赖注入配置测试类的实例。这为使用
预配置的应用程序上下文中的Bean来设置测试固件提供了便捷机制。
一个显著优势在于您可以在不同测试场景中复用应用程序上下文
(例如用于配置Spring管理的对象图、
事务代理、DataSource实例等),从而避免
在单个测试用例中重复复杂的测试固件设置。
例如,考虑这样一个场景:我们有一个实现 Title 领域实体数据访问逻辑的类(HibernateTitleRepository)。我们希望编写集成测试来验证以下方面:
-
Spring配置:基本上,所有与
HibernateTitleRepositorybean相关的配置是否正确且完整存在? -
Hibernate映射文件配置:所有内容是否已正确映射,且延迟加载设置是否配置正确?
-
HibernateTitleRepository的逻辑:此类的配置实例行为是否如预期?
请参阅通过 TestContext框架 实现的测试固件依赖注入。
事务管理
在访问真实数据库的测试中,一个常见问题是它们对持久化存储状态的影响。即使使用开发数据库,状态变更也可能影响后续测试。此外,许多操作——例如插入或修改持久化数据——无法在事务之外执行(或验证)。
TestContext框架解决了这个问题。默认情况下,该框架会为每个测试创建并回滚事务。您可以编写假定事务存在的代码。如果在测试中调用事务代理对象,它们会根据配置的事务语义正确运行。此外,如果测试方法在测试管理的事务执行期间删除选定表的内容,事务将默认回滚,数据库会恢复到测试执行前的状态。事务支持通过测试应用上下文中定义的PlatformTransactionManager bean提供给测试。
如果您希望事务提交(这种情况较为罕见,但有时在需要特定测试填充或修改数据库时很有用),可以通过使用@Commit注解,指示TestContext框架将事务设置为提交而非回滚。
了解使用 TestContext框架 的事务管理。
集成测试的支持类
Spring TestContext 框架提供了若干 abstract 支持类,可简化集成测试的编写。这些基础测试类提供了定义完善的钩子(hooks)以及便捷的实例变量和方法,以便访问:
-
用于执行显式bean查找或测试整个上下文的状态的
ApplicationContext。 -
一个
JdbcTemplate,用于执行SQL语句查询数据库。您可以使用此类查询来确认执行数据库相关应用代码前后的数据库状态,Spring确保此类查询在与应用代码相同的事务范围内运行。与ORM工具结合使用时,请注意避免误报。
此外,您可能希望创建一个自定义的、整个应用程序范围内的超类,其中包含特定于您项目的实例变量和方法。
查看测试上下文框架的支持类。