Gradleを使用したJaCoCoカバレッジレポートのフィルタリング


113

問題:

私はプロジェクトを持っています また、特定のクラスやパッケージをフィルタリングできるようにしたいと考えています。

関連ドキュメント:

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

公式 サイト: http : //www.eclemma.org/jacoco/index.html

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

公式 Github問題、カバレッジの作業: https : //github.com/jacoco/jacoco/wiki/FilteringOptions https://github.com/jacoco/jacoco/issues/14

関連するStackOverflowリンク:

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

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

JaCoCo-JSPをレポートから除外する(それは動作するようです)、 使ってます

Maven Jacoco構成-機能しないレポートからクラス/パッケージを除外(それは動作するようです、 使ってます

JaCoCo Gradleプラグイン除外(これを機能させることができませんでした)

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

質問:

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


サードパーティのオプション(FD Iはの創設者です):あなたがレポートをアップロードする場合Codecovあなたができる任意のファイルを無視で事実の後のようなあなたの製品のセクションを備えています。ありがとう。
スティーブピーク

@StevePeakだから、あなたはpackagesオンラインでフィルタリングできますCodecovか?また、私はを見ました。サポートGithubについてはどうAndroidですかJava。それでも、すべてのレポートを送信してから、後でフィルタリングする前にフィルタリングする必要があります。
Jared Burrows

含めたくないファイルの正規表現メソッドに基づいてフィルタリングできます。すべてのJavaはJacocoレポートでサポートされています。Codecovの事実の後にフィルターをかけるだけで動作します。フィルターを記憶し、今後のすべてのレポートに適用します。ありがとう!
スティーブピーク

6
私は興味がある; excludes公式ドキュメントの実際に何をしているのですか?それはほとんど役に立たないのですか?
Vivin Paliath、2015年

それexcludesはカバレッジタスクではなく、テストタスクです。ファイルはJaCoCoによる計測から除外され、カバレッジが記録されます。一部のクラスのカバレッジを記録したくない場合、別のインストルメンテーションエージェントとの競合が原因で記録できない場合、またはクラスを事前にインスツルメントしたため、これを使用できます。これは、レポートからクラスを除外しません。特に、最後に述べたケースでは、これは恐ろしい考えです。
ヴァンパイア

回答:


115

おかげで、Yannick Welsch

Googleを検索し、Gradleのドキュメントを読んで、以前のStackOverflowの投稿を調べたところ、公式でこの回答が見つかりました フォーラム!

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

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

build.gradleJava / Groovyプロジェクトに対する私の解決策:

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


1
@BradPitcher問題ありません!正しい答えを見つけるのにしばらく時間がかかりました。それはまさに「ハック」のようです。彼らがもっと良い方法を考え出すことを願っています。
Jared Burrows、2015年

では、パッケージからクラスを1つだけ除外する場合の正しいアプローチは何ですか?
Pedro Henrique、

2
次のようなもの:exclude: ['**/*Test*.*'])
Jared Burrows

1
jacocoTestReportjacocojavaプラグインの両方でのみ機能します。これはAndroid用ではありません。アンドロイドのためここに私のレポを参照してください。github.com/jaredsburrows/android-gradle-java-template/blob/...
ジャレッド・バロウズ

9
classDirectories =この警告の結果。The JacocoReportBase.setClassDirectories(FileCollection) method has been deprecated. This is scheduled to be removed in Gradle 6.0. Use getClassDirectories().from(...)。Gradle 6.0と互換性のあるソリューションを示すことは素晴らしいことです。
Thunderforge

60

Gradleバージョン5.xの場合、classDirectories = files(...)は非推奨の警告を表示し、Gradle 6.0以降ではまったく機能しませんこれは、クラスを除外する非推奨の方法です。

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

2
または単にclassDirectories.fromを使用します(リストを上書きするのではなくリストに追加する)
Mohamed El-Beltagy

1
複数のパスを含めるために[]exclude: に追加します。
WesternGun、

素晴らしい、私はgradle 6.0.1を使用し、このソリューションは私のために働いた。
Dargenn

14

私にとっては、

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


1
これにより、クラスが完全に省略されるのではなく、クラスのカバレッジが0%になるようです。JaCoCi 0.8.5とGradle 6.0を使用しています
tschumann

これは、一部のクラスに干渉しないようにjacocoに指示する正しい方法です。他のアプローチはレポート部分にのみ影響します。
ブライス

9

Gradle6の場合以下のようなものを使用します、彼らが作ったのでclassDirectories as final、それを再割り当てすることはできませんが、classDirectories.setFrom利用できるセッターメソッドが存在します

    jacocoTestReport {
    reports {
        xml.enabled true
        html.enabled true
        html.destination file("$buildDir/reports/jacoco")
    }

    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it,
                    exclude: ['**/server/**',
                              '**/model/**',
                              '**/command/**'
                    ]
            )
        }))
    }
}

6

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

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

私の調査結果が正しいことを確認していただき、ありがとうございます。将来的にフィルタリングが簡単になったり、Gradleを使用してフィルタリングする方法を簡単に文書化したりできることを願っています。
Jared Burrows

ソースセットをジャココレポートの対象から除外する方法はありますか?のgenerated/java/代わりにあるすべてのソースファイルを除外しますmain/java
Amir Pashazadeh 2018年

4

これはしばらく出ていませんが、私はこれに遭遇しました。私は必要なすべての除外に苦労していました。それは私にとってははるかに単純なものであることがわかりました。あなたはMavenプロジェクトのレイアウトスタイル/ srcに/メイン/ジャワに従った場合、および/ SRC /テスト/ javaのは、単純に配置する必要がありbuildDirを/クラス/ メイン あなたの中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
                     ]
        )
    }
}

これをもう一度見ただけです。これは、動作している構成から直接取得されました。おそらく、あなたのGradleとJacocoのバージョンは私のバージョンとは異なっていました。ごめんなさい。
ランディ

4

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

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

2

一部のコメントは非推奨の警告に言及しています。ゲッターを使うだけで解決するには:

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

2

jacocoレポートでフィルタリングするには、2つのタスクjacocoTestReportとで除外を行う必要がありjacocoTestCoverageVerificationます。

サンプルコード

    def jacocoExclude = ['**/example/**', '**/*Module*.class']

    jacocoTestReport {
        afterEvaluate {
            getClassDirectories().setFrom(classDirectories.files.collect {
                fileTree(dir: it, exclude: jacocoExclude)
            })
        }
    }

    jacocoTestCoverageVerification {
        afterEvaluate {
            getClassDirectories().setFrom(classDirectories.files.collect {
                fileTree(dir: it, exclude: jacocoExclude)
            })
        }

        ...
    }



0

gradle.propertiesファイルに以下の設定を追加します

coverageExcludeClasses=["com.example.package.elasticsearch.*", "com.example.package2.*",]


coverageExcludeClassesJaCoCo / Gradleのモノではないようです
Gus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.