2

现在随着 JUnit 5.0 的发布,我正在努力使用 jacoco 获取代码覆盖率数据。

我的项目是多模块的,我的问题是没有为每个模块创建 exec 文件。根项目中只有一个(看起来几乎是空的)。我一直无法为此找到最新的指南。

我尝试了此处描述的不同方法:Gradle Jacoco 和 JUnit5,但没有任何成功。

是否有人在 JUnit5 和 Jacoco 的多模块(非 Android)Gradle 项目中进行了工作设置?

还是带有 JUnit5 和 Jacoco 的 Gradle Android 项目?任何意见是极大的赞赏。在有一些官方文档可用之前,即使是丑陋的黑客也是受欢迎的。

我的代码的相关部分(至少在命令行和 IDE 中运行 JUnit5 的地方):

<Root> build.gradle:

buildscript {
    dependencies {
        ...
        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0'
        classpath "de.mannodermaus.gradle.plugins:android-junit5:1.0.0"
    }
}

...

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

ext.junitVintageVersion = '4.12.0'
ext.junitPlatformVersion = '1.0.0'
ext.junitJupiterVersion = '5.0.0'

subprojects {

    apply plugin: "jacoco"
    jacoco {
        toolVersion = "0.7.6.201602180812"
    }

    ...

  junitPlatform {
        filters {
            engines {
                include 'junit-jupiter', 'junit-vintage'
            }
            tags {
                exclude 'slow'
            }
            includeClassNamePatterns '.*Test', '.*Tests'
        }
    }
}
...
dependencies {
    // org.junit.platform.commons.util.PreconditionViolationException:
    // Cannot create Launcher without at least one TestEngine; consider adding an engine implementation JAR to the classpath
    testCompile("org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}")
}
4

2 回答 2

1

我尝试了此处描述的不同方法:Gradle Jacoco 和 JUnit5,但没有任何成功。

对于非 Android 项目,这些方法看起来不错。

是否有人在 JUnit5 和 Jacoco 的多模块(非 Android)Gradle 项目中进行了工作设置?

但无论如何,下面是非 Android项目的完整工作示例。

还是带有 JUnit5 和 Jacoco 的 Gradle Android 项目?

请注意,与非 Android 项目相比, Android 项目是完全不同的野兽,包括但不限于测试的配置/执行和覆盖率的计算。

特别是 - 默认情况下,JaCoCo 库 ( http://www.jacoco.org/jacoco/index.html ) 在使用 Java 代理执行应用程序期间更改用于“即时”记录覆盖率的类。而这种模式正是默认 JaCoCo Gradle 插件 ( https://docs.gradle.org/4.1/userguide/jacoco_plugin.html ) 提供的。

Java 代理不能在 Android 上使用,因此在 Android Gradle 插件构建期间, Android 的类更改发生“离线”( http://www.jacoco.org/jacoco/trunk/doc/offline.html ) (https://developer.android.com/studio/releases/gradle-plugin.html)。

似乎org.junit.platform:junit-platform-gradle-plugin也不适用于 Android 项目 - 有https://github.com/aurae/android-junit5并且暂时在https://github.com/aurae/android-junit5/issues公开讨论覆盖范围/4

作为 Android 项目的日常开发者,我无法提供更多信息。


settings.gradle

include 'a'
include 'b'

build.gradle

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0'
  }
}

ext.junitJupiterVersion = '5.0.0'

subprojects {
  repositories {
    mavenCentral()
  }

  apply plugin: 'java'

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

  apply plugin: 'jacoco'
  jacoco {
    toolVersion = '0.7.9'
    applyTo junitPlatformTest
  }
  junitPlatformTest {
    jacoco {
      destinationFile = file("$buildDir/jacoco/test.exec")
    }
  }

  dependencies {
    testCompile("org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}")
    testRuntime("org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}")
  }
}

task wrapper(type: Wrapper) {
  gradleVersion = '4.1'
}

a/src/main/java/A.java

public class A {
}

a/src/test/java/ATest.java

public class ATest {
  @org.junit.jupiter.api.Test
  public void test() {
    new A();
  }
}

b/src/main/java/B.java

public class B {
}

b/src/test/java/BTest.java

public class BTest {
  @org.junit.jupiter.api.Test
  public void test() {
    new B();
  }
}

执行gradle test jacocoTestReport文件a/build/jacoco/test.execb/build/jacoco/test.exec生成如下所示的报告。

a/build/reports/jacoco/test/html/index.html

a/build/reports/jacoco/test/html/index.html

b/build/reports/jacoco/test/html/index.html

b/build/reports/jacoco/test/html/index.html

于 2017-09-15T14:11:35.257 回答
0

感谢Godins示例的指导,我能够获得一些*代码覆盖工作(通过在 IDE 中打开生成的 .exec 文件并检查覆盖是否显示来验证):

* 在 JUnit5 下运行的 JUnit4 测试的一些含义覆盖

gradlew junitPlatformTestDebug

--> $buildDir/jacoco/junitPlatformTestDebug.exec

设置.gradle:

include 'a'
include 'b'

build.gradle(父级):

buildscript {
  dependencies {
    classpath 'com.android.tools.build:gradle:2.3.3'
    classpath 'de.mannodermaus.gradle.plugins:android-junit5:1.0.0'
  }
}

subprojects {

  apply plugin: 'jacoco'
  jacoco {
    toolVersion = '0.7.9'
  }

}

build.gradle(一个 - 主应用程序):

apply plugin: 'com.android.application'
apply plugin: 'de.mannodermaus.android-junit5'

android {
    testOptions {
        unitTests.all {
            jacoco {
                includeNoLocationClasses = true
            }
        }
    }
    junitPlatform {
        jupiterVersion '5.0.0'
        vintageVersion '4.12.0'
    }
}
dependencies {
    testCompile junit5()
}
project.afterEvaluate {
    // Workaround: https://stackoverflow.com/questions/39362955/gradle-jacoco-and-junit5/39386661#39386661
    apply plugin: "jacoco"
    jacoco {
        applyTo junitPlatformTestDebug
    }
}

build.gradle (b - Android 库模块):

apply plugin: 'com.android.library'
apply plugin: 'de.mannodermaus.android-junit5'

android {
    testOptions {
        unitTests.all {
            jacoco {
                includeNoLocationClasses = true
            }
        }

    junitPlatform {
        jupiterVersion '5.0.0'
        vintageVersion '4.12.0'
    }
}
dependencies {
    testCompile junit5()
}
project.afterEvaluate {
    // Workaround: https://stackoverflow.com/questions/39362955/gradle-jacoco-and-junit5/39386661#39386661
    apply plugin: "jacoco"
    jacoco {
        applyTo junitPlatformTestDebug
    }
}
于 2017-09-19T10:59:21.853 回答