我们只是将单元测试移植到JUnit5。意识到这仍然是早期采用,对Google几乎没有任何提示。

最具挑战性的是获取我们在 Jenkins 上使用的Junit5测试的jacoco代码覆盖率。由于这花了我几乎一天的时间,所以我想与大家分享。不过,如果您知道更好的解决方案,我将很想知道!

buildscript {

    dependencies {
       // dependency needed to run junit 5 tests
       classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2'
   }
}

// include the jacoco plugin
plugins {
    id 'jacoco'
}

dependencies {
    testCompile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2"
    runtime "org.junit.jupiter:junit-jupiter-engine:5.0.0-M2"
    runtime "org.junit.vintage:junit-vintage-engine:4.12.0-M2"
}

apply plugin: 'org.junit.platform.gradle.plugin'

那么问题似乎是也定义了org.junit.platform.gradle.plugin中定义的junitPlatformTest
在gradle生命周期阶段的后期,因此在解析脚本时未知。

为了能够仍然能够定义一个观察junitPlatformTest任务的jacoco任务,需要以下技巧。

tasks.whenTaskAdded { task ->
    if (task.name.equals('junitPlatformTest')) {
        System.out.println("ADDING TASK " + task.getName() + " to the project!")

    // configure jacoco to analyze the junitPlatformTest task
    jacoco {
        // this tool version is compatible with
        toolVersion = "0.7.6.201602180812"
        applyTo task
    }

    // create junit platform jacoco task
    project.task(type: JacocoReport, "junitPlatformJacocoReport",
            {
                sourceDirectories = files("./src/main")
                classDirectories = files("$buildDir/classes/main")
                executionData task
            })
    }
}

最后,有必要配置junitPlatform插件。以下代码允许命令行配置应运行的junit 5标签:
您可以通过运行以下命令来运行所有带有'unit'标签的测试:

gradle clean junitPlatformTest -PincludeTags=unit

您可以使用以下命令运行所有缺少unit和integ标签的测试

gradle clean junitPlatformTest -PexcludeTags=unit,integ

如果未提供标签,则将运行所有测试(默认)。

junitPlatform {

    engines {
        include 'junit-jupiter'
        include 'junit-vintage'
    }

    reportsDir = file("$buildDir/test-results")

    tags {
        if (project.hasProperty('includeTags')) {
            for (String t : includeTags.split(',')) {
                include t
            }
        }

        if (project.hasProperty('excludeTags')) {
            for (String t : excludeTags.split(',')) {
                exclude t
            }
        }
    }

    enableStandardTestTask false
}

最佳答案

谢谢,所以现在的黑客看起来像这样:

project.afterEvaluate {
    def junitPlatformTestTask = project.tasks.getByName('junitPlatformTest')

    // configure jacoco to analyze the junitPlatformTest task
    jacoco {
        // this tool version is compatible with
        toolVersion = "0.7.6.201602180812"
        applyTo junitPlatformTestTask
    }

    // create junit platform jacoco task
    project.task(type: JacocoReport, "junitPlatformJacocoReport",
            {
                sourceDirectories = files("./src/main")
                classDirectories = files("$buildDir/classes/main")
                executionData junitPlatformTestTask
            })
}

关于jenkins - Gradle Jacoco和JUnit5,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39362955/

10-09 03:37