使用 Gradle 进行集成测试

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

单元测试使用 Gradle 自动工作,但如果你想有一组单独的集成测试,你需要做一个小练习。实际上,它们根本不必是集成测试。本指南向您展示如何配置 Gradle 以使用任何类型的测试并独立于其他测试运行它们。我将在这里使用 Scala 语言,但同样适用于任何 JVM 语言。

目标

我们即将定义一个名为 itest 的新 Gradle 任务,它将仅运行在特定文件夹“src/itest/scala”中实现的测试。标准的内置任务测试无需任何更改即可运行,仅在“src/test/scala”目录中运行测试。

标准 Java/Scala 项目

我们将从标准的 Gradle Java 或 Scala 项目开始。编程语言在这里无关紧要。通常目录结构如下所示:


 <project root>
  + src
    + main
      + scala
    + test
      + scala
  - build.gradle

主要源代码(正在测试)位于“src/main/scala”,所有单元测试都在“src/test/scala”。

在哪里放置集成测试类以及如何命名它们

我们已经知道我们的单元测试在哪里。一个好习惯是使用它们测试的类来命名它们,然后加上“Test”或“Spec”后缀。例如,如果被测试的类被命名为“Miracle”,那么它的单元测试应该转到一个名为“MiracleSpec”的类(如果你愿意,也可以是 MiracleTest)。这只是一个约定,仅此而已。

我们将使用相同的原则进行集成测试,但我们会将它们放在 “src/itest/scala”目录 中并使用 “ITest”或“ISpec”后缀 。这也是一个约定,但它允许我们将它们与单元测试分开运行。

为什么要有一个特殊的目录和一个特殊的名称后缀

我建议将集成测试物理地放在不同的目录中,并使用不同的命名模式,以便在许多其他情况下可以将测试与其余代码区分开来。

例如,如果您将整个应用程序打包到一个大 JAR 中,并且只想运行集成测试。你会怎么做?一些测试运行器仅支持按类/文件名过滤。您可以使用“*ISpec”正则表达式来实现它。

再比如,在你喜欢的 IDE(例如 IntelliJ IDEA)中右键单击一个目录并在该目录中运行所有测试是非常方便的。 IDEA 还允许您通过提供类名模式来运行测试,这就是为什么我喜欢使用不同的后缀进行集成和单元测试的原因。

示例项目结构

想象一个 Scala 项目,它有一个名为 Fujara(一种很棒的斯洛伐克乐器)的实现类。它的单元测试在 FujaraSpec 类中,集成测试在 FujaraISpec 中。通常我们需要一些不同于主应用程序日志配置的数据用于集成测试(itest-data.xml)或日志记录配置(logback-test.xml)。


 <project root>
  + src
    + main
      + scala
    + test
      + scala
  - build.gradle

构建.gradle

我正在使用 Gradle 2.4,但此解决方案也适用于旧版本。我不会提供完整的构建脚本,而只会提供与该主题相关的部分。


 <project root>
  + src
    + main
      + scala
    + test
      + scala
  - build.gradle

运行集成测试

现在我们应该能够通过运行 “gradle itest” 任务来运行集成测试。在我们的示例中,它应该只运行 FujaraISpec。要在 FujaraSpec 中运行单元测试,请执行“gradle test”。

定义其他测试类型

如果您想对功能测试、性能测试、验收测试或任何测试使用相同的原理,只需复制并粘贴上面的代码并将“itest”替换为“ftest”、“ptest”、“atest”、“xtest”, ……

相关文章