现在,随着Jacoco5.0的发布,我很难使用JUnit获取代码覆盖率数据。
我的项目是多模块的,我的问题是没有为每个模块创建exec文件。根项目中只有一个(看起来几乎是空的)。我还找不到关于这个的最新指南。
我尝试了这里描述的不同方法:Gradle Jacoco and JUnit5,但没有任何成功。
有没有人在使用JUnit5和Jacoco的多模块(非安卓) Gradle项目中有一个可用的设置?
或者是与JUnit5和Jacoco合作的Gradle Android项目?任何建议都是非常感谢的。在有一些官方文档可用之前,即使是丑陋的黑客也是受欢迎的。
我的代码的相关部分(其中运行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}")
}发布于 2017-09-15 22:11:35
我尝试了这里描述的不同方法:Gradle Jacoco and JUnit5,但都没有成功。
对于非Android项目,这些方法看起来不错。
有没有人在使用JUnit5和Jacoco的多模块(非安卓) Gradle项目中有可用的设置?
但不管怎样,下面是一个完整的非安卓项目的工作示例。
还是一个与JUnit5和Jacoco合作的Gradle Android项目?
请注意,与非安卓项目相比,安卓项目是完全不同的beasts,包括但不限于测试的配置/执行和覆盖率的计算。
特别地,缺省情况下,Java库( JaCoCo library,http://www.jacoco.org/jacoco/index.html)在使用Java的应用程序执行期间更改用于记录覆盖率的“即时”类。而这种模式正是默认的JaCoCo Gradle Plugin (https://docs.gradle.org/4.1/userguide/jacoco_plugin.html)所提供的。
Java agent不能在Android上使用,因此对于Android,在Android Gradle Plugin (https://developer.android.com/studio/releases/gradle-plugin.html)构建过程中会发生“离线”(http://www.jacoco.org/jacoco/trunk/doc/offline.html)的类变更。
org.junit.platform:junit-platform-gradle-plugin似乎也不适用于安卓项目--有关于https://github.com/aurae/android-junit5/issues/4覆盖面的https://github.com/aurae/android-junit5和暂时的公开讨论
作为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.exec和b/build/jacoco/test.exec以及如下所示的报告。
a/build/reports/jacoco/test/html/index.html

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

发布于 2017-09-19 18:59:22
多亏了Godins示例的指导,我能够获得一些*代码覆盖率(通过在您的集成开发环境中打开生成的.exec文件来验证,并检查覆盖率是否显示):
*来自在JUnit5下运行的JUnit4测试的一些含义覆盖
gradlew junitPlatformTestDebug--> $buildDir/jacoco/junitPlatformTestDebug.exec
settings.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 (a - main应用程序):
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
}
}https://stackoverflow.com/questions/46233314
复制相似问题