此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
集成测试
能够执行一些集成测试非常重要,而无需部署到您的应用程序服务器或连接到其他企业基础设施。这样做可以让您测试以下内容:
-
Spring IoC 容器上下文的正确连接。
-
使用 JDBC 或 ORM 工具访问数据。这可以包括正确性SQL 语句、Hibernate 查询、JPA 实体映射等。
Spring Framework 为spring-test
模块。 实际 JAR 文件的名称可能包括发布版本并且也可能在 longorg.springframework.test
表单,具体取决于您从何处获取它(有关说明,请参阅依赖项管理部分)。该库包括org.springframework.test
包,其中包含用于与 Spring 容器集成测试的有价值的类。此测试不依赖于应用程序服务器或其他部署环境。此类测试是运行速度比单元测试慢,但比等效的 Selenium 测试快得多,或者依赖于部署到应用程序服务器的远程测试。
单元和集成测试支持以注释驱动的 Spring TestContext 框架的形式提供。TestContext 框架是与正在使用的实际测试框架无关,它允许检测测试在各种环境中,包括 JUnit、TestNG 等。
以下部分概述了 Spring 的集成支持的高级目标,本章的其余部分将重点介绍专门的主题:
集成测试的目标
Spring 的集成测试支持具有以下主要目标:
-
管理测试之间的 Spring IoC 容器缓存。
-
提供测试夹具实例的依赖注入。
-
提供适合集成测试的事务管理。
-
提供特定于 Spring 的基类来帮助开发人员编写集成测试。
接下来的几节介绍了每个目标,并提供了实现和配置详细信息的链接。
上下文管理和缓存
Spring TestContext 框架提供一致的 Spring 加载ApplicationContext
instances 和WebApplicationContext
实例以及缓存这些上下文。对加载上下文的缓存的支持很重要,因为启动时间可能会成为一个问题——不是因为 Spring 本身的开销,而是因为 Spring 容器实例化的对象需要时间来实例化。 为 例如,一个有 50 到 100 个 Hibernate 映射文件的项目可能需要 10 到 20 秒才能加载映射文件,并在每次测试中运行每个测试之前产生该成本fixture 会导致整体测试运行速度变慢,从而降低开发人员的工作效率。
测试类通常声明 XML 或 Groovy 的资源位置数组配置元数据(通常在类路径中)或组件类数组用于配置应用程序。这些位置或类与中指定的类似web.xml
或其他用于生产的配置文件 部署。
默认情况下,加载后,配置的ApplicationContext
在每次测试中重复使用。
因此,每个测试套件仅产生一次设置成本,随后的测试执行
要快得多。在这种情况下,术语“测试套件”是指所有测试都在同一个测试中运行
JVM — 例如,所有测试都从给定项目的 Ant、Maven 或 Gradle 构建运行
或模块。在极少数情况下,测试会损坏应用程序上下文并要求
重新加载(例如,通过修改 Bean 定义或应用程序的状态
对象),TestContext 框架可以配置为重新加载配置,并且
在执行下一个测试之前重新生成应用程序上下文。
测试夹具的依赖注入
当 TestContext 框架加载应用程序上下文时,它可以选择
使用依赖项注入配置测试类的实例。这提供了一个
使用预配置的 Bean 设置测试夹具的便捷机制
应用程序上下文。这里的一个强大好处是您可以重用应用程序上下文
跨各种测试场景(例如,用于配置 Spring 管理的对象
图、事务代理、DataSource
实例等),从而避免了
需要为单个测试用例复制复杂的测试夹具设置。
例如,考虑一个场景,我们有一个类 (HibernateTitleRepository
)
实现数据访问逻辑的Title
域实体。我们想写
测试以下领域的集成测试:
-
Spring 配置:基本上,是与
HibernateTitleRepository
豆正确且存在? -
Hibernate 映射文件配置:是否所有内容都正确映射,并且是 正确延迟加载设置?
-
的逻辑
HibernateTitleRepository
:该类的配置实例 按预期执行?
请参阅使用 TestContext 框架注入测试夹具的依赖项。
事务管理
在访问真实数据库的测试中,一个常见问题是它们对 持久性存储。即使使用开发数据库,对状态的更改也可能 影响未来的测试。此外,许多作(例如插入或修改持久性 数据 — 不能在交易之外执行(或验证)。
TestContext 框架解决了这个问题。默认情况下,框架会创建
回滚每个测试的事务。您可以编写可以假设存在的代码
交易的。如果您在测试中调用事务代理对象,它们的行为
正确地,根据他们配置的事务语义。此外,如果测试
方法在事务中运行时删除所选表的内容
托管,事务默认回滚,数据库返回到
执行测试之前的状态。事务支持由以下方式为测试提供
使用PlatformTransactionManager
在测试的应用程序上下文中定义的 bean。
如果您希望提交一个事务(不寻常,但当您想要
特定测试来填充或修改数据库),您可以告诉 TestContext
框架,使用@Commit
注解。
请参阅使用 TestContext 框架进行事务管理。
集成测试支持类
Spring TestContext 框架提供了几个abstract
支持类
简化集成测试的编写。这些基本测试类提供定义明确的
钩子到测试框架以及方便的实例变量和方法,
这使您可以访问:
-
这
ApplicationContext
,用于执行显式 bean 查找或测试整个上下文的状态。 -
一个
JdbcTemplate
,用于执行 SQL 语句来查询数据库。您可以使用这样的查询在执行与数据库相关的之前和之后确认数据库状态应用程序代码,并且 Spring 确保此类查询在与应用程序代码相同的范围内运行事务。与 ORM 工具结合使用时,请确保以避免误报。
此外,您可能希望使用 实例变量和特定于项目的方法。
请参阅 TestContext 框架的支持类。