【问题标题】:Gradle, Android, Jacoco and JUnit5Gradle、Android、Jacoco 和 JUnit5
【发布时间】:2018-02-24 06:38:29
【问题描述】:

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

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

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

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

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

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

<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}")
}

【问题讨论】:

    标签: gradle android-gradle-plugin jacoco junit5 android-junit


    【解决方案1】:

    感谢Godins 示例的指导,我能够得到一些*代码覆盖工作(通过在您的 IDE 中打开生成的 .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(一个 - 主应用程序):

    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
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

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

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

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

      【讨论】:

      猜你喜欢
      • 2017-01-14
      • 1970-01-01
      • 2018-01-09
      • 2015-01-16
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      相关资源
      最近更新 更多