用Gradle对JUnit测试进行分组

用Gradle对JUnit测试进行分组,gradle,junit,Gradle,Junit,我创建了一个新的Groovy集成测试项目,希望能够将不同组件的测试分组在一起。例如,某些测试仅对docker映像有效,而其他测试则用于测试本地运行的webapp。我还希望获得测试结果的报告,并能够在需要时反复运行测试。在JUnit中对测试进行分组的第一步是创建一个接口来命名组。在您的测试类可以访问的包中创建这个 如果您的测试类如下所示: package com.example.test.api.get.cert class ByIssuedBeforeTest { //awesome te

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

在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
}
然后创建一个空接口,如下所示:

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
}
现在将测试类更改为如下所示:

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插件为您提供了测试任务。在测试任务中,我们添加了
输出
行,以防止测试任务被标记为“最新”,本质上迫使gradle在调用任务时始终运行任务,而不是缓存结果

报表块允许创建JUnit报表文件。它们将被放置在build/reports/tests目录中。如果运行非库存测试,它将是build/reports/tests/nonDockerTest/index.html

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

gradle test
运行所有测试

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

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


每个任务都将在
/build/reports/tests
目录中创建报告。

如果不同类别的测试具有不同的编译参数或依赖项,我认为此解决方案将很快变得复杂。在本例中,我将选择源集,它与创建JUnit类别具有相同的效果,其优点是为每个源集定义不同的构建。我以为这些只是源代码和测试文件夹。我不知道它可以用来进一步分离彼此的测试。