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