使用 Gradle 进行集成测试

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

单元测试使用 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”, ……