【问题标题】:Gradle and JaCoCo: instrument classes from a separate subprojectGradle 和 JaCoCo:来自单独子项目的仪器类
【发布时间】:2013-12-17 15:26:27
【问题描述】:

我有一个遗留应用程序,它有一个独立于应用程序模块的单元测试模块。我正在将项目转换为使用 Gradle,结构如下所示:

/root
  /module1
  /module2
  ...
  /moduleN
  /test

测试模块在哪里执行模块1到模块N的测试(并依赖于它们)。我知道这不是一个很好的做法,因为它有点违背了单元测试的目的,但众所周知,遗留代码总是让人头疼。

所以在我开始重构代码以便每个模块都有自己的单元测试之前(这意味着以合理的方式分解测试模块,即大量工作)我想找到一个临时解决方案来获得正确的代码覆盖率,即让 JaCoCo 检测 module1、...、moduleN 中的所有类,而不仅仅是模块测试。

有没有办法告诉 JaCoCo 从其他模块检测类?

【问题讨论】:

    标签: java unit-testing gradle code-coverage jacoco


    【解决方案1】:

    要在“test”项目中包含子项目“module*”的覆盖结果,您可能想在测试项目的 build.gradle 中尝试类似的操作:

    // [EDIT] - 'afterEvaluate' NOK, use 'gradle.projectsEvaluated' instead (see comments)
    // afterEvaluate {
    gradle.projectsEvaluated {
        // include src from all dependent projects (compile dependency) in JaCoCo test report
        jacocoTestReport {
            // get all projects we have a (compile) dependency on
            def projs = configurations.compile.getAllDependencies().withType(ProjectDependency).collect{it.getDependencyProject()}
            projs.each {
                additionalSourceDirs files(it.sourceSets.main.java.srcDirs)
                additionalClassDirs files(it.sourceSets.main.output)
            }
        }
    }
    

    【讨论】:

    • 感谢您的回复。我试过了,但构建失败并出现以下错误:Could not find property 'sourceSets' on project 'modulex'
    • 请注意,'modulex' 确实是一个 java 项目,所以应该定义 sourceSets。
    • here's the answer 回答那个问题。
    • 所以如果我用gradle.projectsEvaluated替换afterEvaluate,上面的sn-p就可以工作了。
    • 感谢更仔细的调查/反馈/链接,我不知道“gradle.projectsEvaluated”。相应地更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    相关资源
    最近更新 更多