使用Gradle对JUnit测试进行分组

时间:2017-02-17 18:56:16

标签: gradle junit

我创建了一个新的集成测试Groovy项目,并希望能够将测试组合在一起以用于不同的组件。例如,某些测试仅对docker镜像有效,而其他测试则用于测试本地运行的webapp。我还希望获得测试结果的报告,并且能够在需要时反复运行测试。

1 个答案:

答案 0 :(得分:3)

在JUnit中对测试进行分组的第一步是创建一个用于命名组的接口。在测试类可以访问的包中创建它。

如果您的测试类看起来像这样:

package com.example.test.api.get.cert

class ByIssuedBeforeTest {
  //awesome tests
}

然后创建一个这样的空接口:

package com.example.test

interface DockerTest {}

现在将您的测试类更改为:

package com.example.test.api.get.cert

import org.junit.experimental.categories.Category

@Category(DockerTest.class)
class ByIssuedBeforeTest {
  //awesome tests
}

您还可以注释单个测试而不是整个类。

现在在build.gradle文件中:

apply plugin: 'java'

sourceSets {
    main {
        java {
            srcDirs = ["src/main/java", "src/main/groovy"]
        }
    }
    test {
        java {
            srcDirs = ["src/test/java", "src/test/groovy"]
        }
    }
}

test {
    outputs.upToDateWhen { false }
    reports {
        junitXml.enabled=true
        html.enabled=true
    }
}

task nondockerTest(type: Test) {
    outputs.upToDateWhen { false }
    useJUnit {
        excludeCategories 'com.example.test.DockerTest'
    }
}

task dockerTest(type: Test) {
    outputs.upToDateWhen { false }
    useJUnit {
        includeCategories 'com.example.test.DockerTest'
    }
}

gradle的java插件为您提供测试任务。在测试任务中,我们添加outputs行,以防止测试任务被标记为" UP-TO-DATE",实质上强制gradle在我们调用时始终运行任务它不是缓存结果。

报告块允许创建JUnit报告文件。它们将放在build / reports / tests目录中。如果您运行nonDockerTest,它将是build / reports / tests / nondockerTest / index.html。

useJUnit块告诉Gradle使用JUnit运行测试以及要运行的测试类别(如果使用includeCategories)或类别不运行(如果使用excludeCategories)。

gradle test运行所有测试。

gradle nondockerTest运行未标记为DockerTest类别的测试。

gradle dockerTest只运行标有DockerTest类别的测试。

这些任务中的每一项都将在/build/reports/tests目录中创建报告。