web-dev-qa-db-ja.com

GradleでJaCoCoカバレッジレポートをフィルタリングする

問題:

jacoco のプロジェクトがあり、特定のクラスやパッケージをフィルタリングできるようにしたい。

関連ドキュメント:

次のドキュメントを読みました。

公式 jacoco site:http://www.eclemma.org/jacoco/index.html =

公式 jacocogradleのドキュメント https://gradle.org/ docs/current/userguide/jacoco_plugin.html

Official jacocoGithubの問題、カバレッジの改善:https://github.com/ jacoco/jacoco/wiki/FilteringOptionshttps://github.com/jacoco/jacoco/issues/14

関連するStackOverflowリンク:

JaCoCo&Gradle-フィルタリングオプション (回答なし)

SonarrunnerとGradleを使用してJacocoレポートからパッケージを除外するsonar を使用しない

JaCoCo-レポートからJSPを除外するmaven で機能するようです、私は gradle を使用しています)

Maven Jacoco構成-動作しないレポートからクラス/パッケージを除外するmaven で動作するようです、 gradle を使用しています)

JaCoCo gradle plugin exclude (これを機能させることができませんでした)

Gradle Jacoco-カバレッジレポートには構成で除外されたクラスが含まれます (非常に近いようです。doFirstを使用しましたが、機能しませんでした)

私が試した例:

apply plugin: 'Java'
apply plugin: 'jacoco'

buildscript {
    repositories {
        mavenCentral()
        jcenter()
    }
}

repositories {
    jcenter()
}

jacocoTestReport {
    reports {
        xml {
            enabled true // coveralls plugin depends on xml format report
        }

        html {
            enabled true
        }
    }

    test {
        jacoco {
            destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
            classDumpFile = file("$buildDir/jacoco/classpathdumps")
            excludes = ["projecteuler/**"] // <-- does not work
            // excludes = ["projecteuler"]
        }
    }
}

質問:

jacoco カバレッジレポートを生成するときに特定のパッケージとクラスを除外するにはどうすればよいですか?

80
Jared Burrows

おかげで、Yannick Welsch

Googleを検索し、Gradleのドキュメントを読んで古いStackOverflowの投稿を調べた後、公式の gradle フォーラムでこの回答を見つけました!

jacocoTestReport {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it, exclude: 'com/blah/**')
        })
    }
}

出典:https://issues.gradle.org/browse/GRADLE-2955

Java/Groovyプロジェクト用のbuild.gradleのソリューション:

apply plugin: 'Java'
apply plugin: 'jacoco'

jacocoTestReport {
    reports {
        xml {
            enabled true // coveralls plugin depends on xml format report
        }

        html {
            enabled true
        }
    }

    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it,
                    exclude: ['codeeval/**',
                              'crackingthecode/part3knowledgebased/**',
                              '**/Chapter7ObjectOrientedDesign**',
                              '**/Chapter11Testing**',
                              '**/Chapter12SystemDesignAndMemoryLimits**',
                              'projecteuler/**'])
        })
    }
}

ご覧のとおり、いくつかのパッケージをフィルタリングするために、exclude:にさらに追加できました。

出典:https://github.com/jaredsburrows/CS-Interview-Questions/blob/master/build.gradle

Androidなどの他のプロジェクトのカスタムタスク:

apply plugin: 'jacoco'

task jacocoReport(type: JacocoReport) {
    reports {
        xml {
            enabled true // coveralls plugin depends on xml format report
        }

        html {
            enabled true
        }
    }

    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it,
                    exclude: ['codeeval/**',
                              'crackingthecode/part3knowledgebased/**',
                              '**/Chapter7ObjectOrientedDesign**',
                              '**/Chapter11Testing**',
                              '**/Chapter12SystemDesignAndMemoryLimits**',
                              'projecteuler/**'])
        })
    }
}

出典:https://github.com/jaredsburrows/Android-gradle-Java-app-template/blob/master/gradle/ quality.gradle#L59

86
Jared Burrows

Gradleバージョン5.0以降では、classDirectories = files(...)は非推奨の警告を出します。これは、クラスを除外する非推奨の方法です。

jacocoTestReport {
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: 'com/exclude/**')
        }))
    }
}
12
uwe

私にとっては、それはうまく働いています

test {
  jacoco {
    excludes += ['codeeval/**',
                 'crackingthecode/part3knowledgebased/**',
                 '**/Chapter7ObjectOrientedDesign**',
                 '**/Chapter11Testing**',
                 '**/Chapter12SystemDesignAndMemoryLimits**',
                 'projecteuler/**']
  }
}

ドキュメントに記載されているように https://docs.gradle.org/current/userguide/jacoco_plugin.html#N16E62 そして最初に尋ねられたので、答えは:

だからあなたが私に尋ねた場合:それはの質問ではありません

excludes = ["projecteuler/**"]

または

excludes += ["projecteuler/**"]

しかし

excludes = ["**/projecteuler/**"]

パッケージを除外するには*.projecteuler.*

およびtest {}プロジェクトレベルで、jacocoTestReportにネストされていません

10
childno͡.de

ここ は、ANTのこの問題の解決策です。 jacocoTestReportタスクの下に以下を追加することで、これをgradleに適合させることができます。これは実際にはjacocoによって文書化されていませんが、現時点ではテスト結果をフィルタリングする唯一の方法のようです。

afterEvaluate {
    classDirectories = files(classDirectories.files.collect {
        fileTree(dir: it, exclude: 'excluded/files/**')
    })
}
6
Andre Compagno

これはしばらくの間出てきましたが、私はこれに出くわしました。必要なすべての除外に苦労していました。それは私にとってはるかに単純なものであることがわかりました。 Mavenプロジェクトのレイアウトスタイル/ src/main/Javaおよび/ src/test/Javaに従う場合は、単にbuildDir/classes /mainあなたのclassDirectoriesのように設定:

afterEvaluate {
    jacocoTestReport {
        def coverageSourceDirs = ['src/main/Java']
        reports {
            xml.enabled false
            csv.enabled false
            html.destination "${buildDir}/reports/jacocoHtml"
        }
        sourceDirectories = files(coverageSourceDirs)
        classDirectories = fileTree(
                dir: "${project.buildDir}/classes/main",
                excludes: [
                      //whatever here like JavaConfig etc. in /src/main/Java
                     ]
        )
    }
}
4
Randy

以下のコードは、カバレッジ検証からクラスも除外します。

jacocoTestCoverageVerification {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: "${project.buildDir}/classes/main",
                    exclude: ['**/packagename/**'])
        })
    }
}
3
er-han