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