फिल्टर जैकोको कवरेज रिपोर्ट ग्रैडल के साथ


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 और ग्रेड - फ़िल्टरिंग विकल्प (कोई जवाब नहीं)

Sonarrunner और Gradle का उपयोग करके जैकोको रिपोर्ट से पैकेजों को छोड़ दें (उपयोग न करें)

जैकोको - जेएसपी को रिपोर्ट से बाहर कर दें (यह काम करने लगता है, मै इस्तेमाल कर रहा हूँ )

मावेन जैकोको कॉन्फ़िगरेशन - रिपोर्ट से वर्गों / पैकेजों को न हटाएं (यह काम करने के लिए लगता है), मै इस्तेमाल कर रहा हूँ )

JaCoCo gradle plugin को बाहर करें (यह काम करने के लिए नहीं मिल सकता है)

ग्रैडल जैकोको - कवरेज रिपोर्टों में कॉन्फ़िगरेशन में शामिल कक्षाएं शामिल हैं (बहुत करीब लगता है, इसका इस्तेमाल किया 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 is Found of): यदि आप Codecov को रिपोर्ट अपलोड करते हैं तो आप उत्पाद के फीचर सेक्शन में तथ्य के बाद अपनी पसंद की किसी भी फाइल को अनदेखा कर सकते हैं । धन्यवाद।
स्टीव पीक

@StevePeak तो आप packagesऑनलाइन का उपयोग करके फ़िल्टर कर सकते हैं Codecov? इसके अलावा, मैंने देखा Github, Androidसमर्थन के बारे में क्या , मैंने देखा Java। मुझे अब भी आपको सभी रिपोर्ट भेजनी चाहिए, फिर पहले फ़िल्टर करने के बाद फ़िल्टर करना होगा।
जारेड बुरो

आप जिस भी फाइल को शामिल नहीं करना चाहते हैं, उसके रीजेक्स विधि के आधार पर फ़िल्टर कर सकते हैं। सभी जावा जैकोको रिपोर्ट के माध्यम से समर्थित है। Codecov पर तथ्य के बाद बस छानने का काम करता है। यह आपके फ़िल्टर को याद रखेगा और भविष्य की सभी रिपोर्टों पर लागू करेगा। धन्यवाद!
स्टीव पीक

6
मैं उत्सुक हूँ; क्या करता है excludesआधिकारिक दस्तावेज से वास्तव में ऐसा है तो? क्या यह बहुत बेकार है?
विवि पालीथ

यह excludesकवरेज कार्य पर नहीं है, बल्कि परीक्षण कार्य पर है। यह JaCoCo द्वारा इंस्ट्रूमेंट की जा रही फाइलों को शामिल नहीं करता है और इस प्रकार कवरेज को रिकॉर्ड किया जा रहा है। आप इसका उपयोग कर सकते हैं यदि आप कुछ वर्गों के लिए कवरेज रिकॉर्ड नहीं करना चाहते हैं, यदि आप किसी अन्य इंस्ट्रूमेंटिंग एजेंट के साथ कुछ संघर्ष के कारण नहीं कर सकते हैं, या क्योंकि आप पूर्व-इंस्ट्रूमेंटेड कक्षाएं हैं। यह रिपोर्ट से एक वर्ग को बाहर नहीं करेगा, विशेष रूप से उल्लेखित अंतिम मामले में, यह एक भयानक विचार होगा।
पिशाच

जवाबों:


115

इसके लिए धन्यवाद Yannick Welsch:

Google पर खोज करने के बाद, ग्रैडल डॉक्स पढ़ना और पुराने StackOverflow पोस्ट के माध्यम से जाना, मुझे आधिकारिक पर यह उत्तर मिला मंचों!

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

स्रोत: https://issues.gradle.org/browse/GRADLE-2955

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/n.lele

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 कोई समस्या नहीं! सही उत्तर खोजने में मुझे थोड़ा समय लगा। यह सिर्फ इतना "हैकिश" लगता है। मुझे आशा है कि वे अच्छे तरीके से आएंगे।
जारेड बुरो

तो, क्या सही तरीका है अगर मैं सिर्फ एक वर्ग को पैकेज से बाहर करना चाहता हूं?
पेड्रो हेनरिक

2
कुछ इस तरह:exclude: ['**/*Test*.*'])
जेरेड बुरो

1
jacocoTestReportकेवल दोनों jacocoऔर javaप्लगइन्स के साथ काम करता है । यह Android के लिए नहीं है। कृपया मेरे रेपो को 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(...)। ग्रैडल 6.0 के साथ संगत समाधान दिखाना बहुत अच्छा होगा।
20

61

ग्रैडल संस्करण 5.x के लिए, classDirectories = files(...)एक डेप्रिसिएशन चेतावनी देता है और ग्रैडल 6.0 से शुरू होने पर बिल्कुल भी काम नहीं करता है। यह कक्षाओं को बाहर करने का तरीका है:

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

2
या बस classDirectories.from का उपयोग करें (ओवरराइडिंग सूची के बजाय सूची में संलग्न करने के लिए)
मोहम्मद एल-बेल्टैगी

1
आप कई रास्तों को शामिल करने के []बाद जोड़ देंगे exclude:
पश्चिमीगंज

बहुत बढ़िया, मैं ०.२.१ का उपयोग करता हूं और यह समाधान मेरे लिए काम करता है।
डार्गन

14

मेरे लिए, यह ठीक काम कर रहा है

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

जैसा कि प्रलेखन में कहा गया है https://docs.gradle.org/current/userguide/jacoco_plugin.html##161662 और initally पूछा गया तो उत्तर है:

इसलिए यदि आप मुझसे पूछें: यह सवाल नहीं है

excludes = ["projecteuler/**"]

या

excludes += ["projecteuler/**"]

परंतु

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

एक पैकेज को बाहर करने के लिए *.projecteuler.*

और test {}परियोजना के स्तर पर, में निहित नहीं हैjacocoTestReport


1
ऐसा लगता है कि कक्षाओं को 0% कवरेज देने के बजाय उन्हें पूरी तरह से छोड़ देना चाहिए। मैं JaCoCi 0.8.5 और ग्रेडल 6.0
tschumann

जैकोको को कुछ वर्गों के साथ ध्यान न देने का यह सही तरीका है, अन्य दृष्टिकोण केवल रिपोर्टिंग हिस्से को प्रभावित करते हैं।
ब्रज

9

ग्रेड 6 के लिए नीचे की तरह कुछ का उपयोग करें, क्योंकि उन्होंने बनाया 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कार्य के तहत निम्नलिखित जोड़कर वर्गीकृत करने के लिए अनुकूलित किया जा सकता है । हालांकि यह वास्तव में जैकोको द्वारा प्रलेखित नहीं है, यह अब के लिए परीक्षा परिणामों को फ़िल्टर करने का एकमात्र तरीका लगता है।

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

ठीक है, यह पुष्टि करने के लिए धन्यवाद कि मेरे निष्कर्ष सही हैं! मुझे आशा है कि वे भविष्य में फ़िल्टर करना आसान बना देंगे या केवल दस्तावेज़ का उपयोग कर सकते हैं कि ग्रेडल का उपयोग करके कैसे फ़िल्टर किया जाए।
जारेड बुरो

क्या जैकोको रिपोर्ट में शामिल किए जाने से निर्धारित स्रोत को बाहर करने का कोई तरीका है? मैं उन सभी स्रोत फ़ाइलों को बाहर करना चाहता हूं जो generated/java/इसके बजाय स्थित हैं main/java
अमीर पास्ज़ादेह

4

यह कुछ समय के लिए बाहर रहा है, लेकिन मैं अभी इस पार भाग गया। मैं जरूरत के सभी बहसों से जूझ रहा था। मैंने पाया कि यह मेरे लिए कुछ अधिक सरल था। यदि आप मावेन प्रोजेक्ट लेआउट शैली / src / main / java और / src / test / java का अनुसरण करते हैं, तो आपको अपनी classDirectories कॉन्फिगरेशन में buildDir / classes / main को इस तरह कॉन्फ़िगर करना होगा:

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

नीचे दिया गया कोड कवरेज सत्यापन से कक्षाओं को भी शामिल करता है:

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

जैकोको रिपोर्ट में फ़िल्टर करने के लिए, बहिष्करण को दो कार्य में 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.