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