集成测试

能够在不需要的情况下执行一些集成测试非常重要 部署到您的应用程序服务器或连接到其他企业基础设施。 这样做可以让你测试以下内容:spring-doc.cn

  • Spring IoC 容器上下文的正确连接。spring-doc.cn

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

Spring Framework 为模块中的集成测试提供了一流的支持。实际 JAR 文件的名称可能包括发行版本 也可能是长格式,具体取决于您获得的位置 it from (有关说明,请参阅 Dependency Management 部分)。此库包括 包含用于与 Spring 容器进行集成测试的有价值的类。此测试 不依赖于应用程序服务器或其他部署环境。此类测试是 运行速度比单元测试慢,但比等效的 Selenium 测试快得多,或者 依赖于部署到应用程序服务器的远程测试。spring-testorg.springframework.testorg.springframework.testspring-doc.cn

单元和集成测试支持以 Comments 驱动的 Spring TestContext Framework 的形式提供。TestContext 框架是 与使用的实际测试框架无关,允许对测试进行检测 在各种环境中,包括 JUnit、TestNG 等。spring-doc.cn

以下部分概述了 Spring 的 集成支持,本章的其余部分则重点介绍专门的主题:spring-doc.cn

集成测试的目标

Spring 的集成测试支持具有以下主要目标:spring-doc.cn

接下来的几节描述了每个目标,并提供了指向实现和 配置详细信息。spring-doc.cn

上下文管理和缓存

Spring TestContext 框架提供 Spring 实例和实例的一致加载以及缓存 的那些背景。支持缓存已加载的上下文非常重要,因为 启动时间可能会成为一个问题 — 不是因为 Spring 本身的开销,而是 因为 Spring 容器实例化的对象需要时间来实例化。为 例如,具有 50 到 100 个 Hibernate 映射文件的项目可能需要 10 到 20 秒才能完成 加载映射文件,并在每个测试中运行每个测试之前产生该成本 夹具会导致整体测试运行速度变慢,从而降低开发人员的工作效率。ApplicationContextWebApplicationContextspring-doc.cn

测试类通常声明 XML 或 Groovy 的资源位置数组 配置元数据(通常在 Classpath 中)或组件类数组 用于配置应用程序。这些位置或类与 或 类似于 或 生产环境的其他配置文件中指定的 部署。web.xmlspring-doc.cn

默认情况下,加载后,配置的将用于每个测试。 因此,每个测试套件和后续测试执行仅产生一次设置成本 要快得多。在这种情况下,术语“测试套件”是指所有测试都在同一环境中运行 JVM — 例如,所有测试都从给定项目的 Ant、Maven 或 Gradle 构建运行 或模块。在不太可能的情况下,测试会破坏应用程序上下文,并且需要 重新加载(例如,通过修改 Bean 定义或应用程序的状态 对象),TestContext 框架可以配置为重新加载配置,并且 在执行下一个测试之前重新构建应用程序上下文。ApplicationContextspring-doc.cn

请参阅上下文管理和上下文缓存 TestContext 框架。spring-doc.cn

测试夹具的依赖注入

当 TestContext 框架加载您的应用程序上下文时,它可以选择: 使用 Dependency Injection 配置测试类的实例。这提供了一个 通过使用 应用程序上下文。这里的一个很大好处是您可以重用应用程序上下文 在各种测试场景中(例如,用于配置 Spring 托管对象 图、事务代理、实例等),从而避免了 需要为单个测试用例复制复杂的测试夹具设置。DataSourcespring-doc.cn

例如,考虑一个场景,我们有一个类 () 实现域实体的数据访问逻辑。我们想写 测试以下领域的集成测试:HibernateTitleRepositoryTitlespring-doc.cn

  • Spring 配置:基本上,与 bean 的配置相关的一切都正确且存在吗?HibernateTitleRepositoryspring-doc.cn

  • Hibernate 映射文件配置:所有内容是否都正确映射,并且 正确的延迟加载设置是否正确?spring-doc.cn

  • 的逻辑 : 执行该类的已配置实例 按预期执行?HibernateTitleRepositoryspring-doc.cn

请参阅使用 TestContext 框架对测试 fixture 进行依赖注入。spring-doc.cn

事务管理

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

TestContext 框架解决了这个问题。默认情况下,框架会创建 和 为每个测试回滚一个事务。您可以编写可以假定存在的代码 交易的如果您在测试中调用事务代理对象,则它们的行为 正确地,根据他们配置的事务语义。此外,如果测试 method 在事务中运行时删除所选表的内容 managed,则事务默认回滚,并且数据库返回到 它在执行测试之前的状态。事务性支持由 使用在测试的应用程序上下文中定义的 bean。PlatformTransactionManagerspring-doc.cn

如果您希望事务提交(不常见,但当您希望 particular test 来填充或修改数据库),你可以告诉 TestContext 框架,通过使用 @Commit 注解来使事务提交而不是回滚。spring-doc.cn

请参阅使用 TestContext 框架进行事务管理。spring-doc.cn

集成测试的支持类

Spring TestContext 框架提供了几个支持类,这些类 简化集成测试的编写。这些基本测试类提供了定义明确的 钩子以及方便的实例变量和方法, 这样,您就可以访问:abstractspring-doc.cn

  • 用于执行显式 bean 查找或测试 整个环境。ApplicationContextspring-doc.cn

  • A ,用于执行 SQL 语句来查询数据库。你可以使用这样的 查询以确认数据库相关 应用程序代码,并且 Spring 确保此类查询在相同的 transaction 作为应用程序代码。与 ORM 工具结合使用时,请确保 以避免误报JdbcTemplatespring-doc.cn

此外,您可能希望使用 特定于您的项目的实例变量和方法。spring-doc.cn

请参阅 TestContext 框架的支持类。spring-doc.cn