首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gradle、安卓、Jacoco和JUnit5

Gradle、安卓、Jacoco和JUnit5
EN

Stack Overflow用户
提问于 2017-09-15 14:44:50
回答 2查看 2K关注 0票数 2

现在,随着Jacoco5.0的发布,我很难使用JUnit获取代码覆盖率数据。

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

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

有没有人在使用JUnit5和Jacoco的多模块(非安卓) Gradle项目中有一个可用的设置?

或者是与JUnit5和Jacoco合作的Gradle Android项目?任何建议都是非常感谢的。在有一些官方文档可用之前,即使是丑陋的黑客也是受欢迎的。

我的代码的相关部分(其中运行JUnit5在命令行和集成开发环境中都有效):

代码语言:javascript
复制
<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}")
}
EN

回答 2

Stack Overflow用户

发布于 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

代码语言:javascript
复制
include 'a'
include 'b'

build.gradle

代码语言:javascript
复制
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

代码语言:javascript
复制
public class A {
}

a/src/test/java/ATest.java

代码语言:javascript
复制
public class ATest {
  @org.junit.jupiter.api.Test
  public void test() {
    new A();
  }
}

b/src/main/java/B.java

代码语言:javascript
复制
public class B {
}

b/src/test/java/BTest.java

代码语言:javascript
复制
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

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

票数 1
EN

Stack Overflow用户

发布于 2017-09-19 18:59:22

多亏了Godins示例的指导,我能够获得一些*代码覆盖率(通过在您的集成开发环境中打开生成的.exec文件来验证,并检查覆盖率是否显示):

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

代码语言:javascript
复制
gradlew junitPlatformTestDebug

--> $buildDir/jacoco/junitPlatformTestDebug.exec

settings.gradle:

代码语言:javascript
复制
include 'a'
include 'b'

build.gradle (父级):

代码语言:javascript
复制
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应用程序):

代码语言:javascript
复制
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库模块):

代码语言:javascript
复制
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
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46233314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档