ফিল্টার জ্যাকোকো গ্র্যাডেলের সাথে কভারেজ রিপোর্ট করে


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

সম্পর্কিত স্ট্যাক ওভারফ্লো লিঙ্ক:

জ্যাকো এবং গ্রেডল - ফিল্টারিং বিকল্পগুলি (কোনও উত্তর নেই)

সোনারুননার এবং গ্রেডল (ব্যবহার না করে) জ্যাকো রিপোর্ট থেকে প্যাকেজগুলি বাদ দিন)

জ্যাকোকো - জেএসপিকে প্রতিবেদন থেকে বাদ দিন (এটি মনে হচ্ছে এটি কার্যকরভাবে কাজ করে), আমি ব্যাবহার করছি )

মাভেন জ্যাকো কনফিগারেশন - ক্লাস / প্যাকেজগুলি প্রতিবেদনটি কাজ না করে বাদ দিন (এটি মনে হয় এটি কার্যকর হয়), আমি ব্যাবহার করছি )

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

প্রশ্ন:

উত্পন্ন করার সময় আমি কীভাবে নির্দিষ্ট প্যাকেজ এবং ক্লাস বাদ দিতে পারি কভারেজ রিপোর্ট?


তৃতীয় পক্ষের বিকল্প (এফডি আমি এর প্রতিষ্ঠাতা): আপনি কোডেকভের প্রতিবেদনগুলি আপলোড করলে আপনি পণ্যটির বৈশিষ্ট্য বিভাগে সত্যতা পাওয়ার পরে আপনার পছন্দ মতো যে কোনও ফাইল উপেক্ষা করতে পারবেন । ধন্যবাদ।
স্টিভ পিক

@ স্টিভপিক আপনি কীভাবে packagesঅনলাইন ব্যবহার করে ফিল্টার করতে পারবেন Codecov? এছাড়াও, আমি দেখেছি Github, Androidসমর্থন সম্পর্কে কি , আমি দেখেছি Java। আমাকে এখনও সমস্ত প্রতিবেদন পাঠাতে হবে তারপরে বনাম ফিল্টারিংয়ের পরে ফিল্টার করুন।
জ্যারেড বুরোজ 6'15

আপনি অন্তর্ভুক্ত করতে চান না এমন কোনও দায়ের করা রেজিএক্সপ পদ্ধতির ভিত্তিতে আপনি ফিল্টার করতে পারবেন। সমস্ত জাভা জ্যাকো প্রতিবেদনের মাধ্যমে সমর্থিত। কোডেকভের বাস্তবতার পরে কেবল ফিল্টারিং কাজ করে। এটি আপনার ফিল্টারগুলি মনে রাখবে এবং ভবিষ্যতের সমস্ত প্রতিবেদনে এটি প্রয়োগ করবে। ধন্যবাদ!
স্টিভ পিক

6
আমি কৌতুহলী; কি excludesসরকারি নথিপত্র থেকে আসলে কি তাহলে? এটা কি অনেকটা বেহুদা?
ভিভিন পালিথ

যে excludesকভারেজ কাজের উপর নয়, কিন্তু পরীক্ষা কাজের উপর। এটি JaCoCo দ্বারা চালিত হওয়া থেকে ফাইলগুলি বাদ দেয় এবং এইভাবে কভারেজ রেকর্ড করা হচ্ছে। আপনি যদি কিছু শ্রেণীর জন্য কভারেজ রেকর্ড করতে না চান, আপনি যদি অন্য ইনস্ট্রুমেন্টিং এজেন্টের সাথে কিছু বিরোধের কারণে বা আপনি প্রাক-চালিত ক্লাসগুলির কারণে না করতে পারেন তবে আপনি এটি ব্যবহার করতে পারেন। এটি প্রতিবেদন থেকে কোনও শ্রেণিকে বাদ দেবে না, বিশেষত বর্ণিত শেষ মামলায় এটি একটি ভয়াবহ ধারণা হবে।
ভ্যাম্পায়ার

উত্তর:


115

ধন্যবাদ Yannick Welsch,:

গুগল অনুসন্ধান করার পরে, গ্রেডল ডক্স পড়ে এবং পুরানো স্ট্যাকওভারফ্লো পোস্টগুলি সন্ধান করার পরে, আমি এই উত্তরটি অফিসিয়ালটিতে পেয়েছি ফোরাম!

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/build.gradle

অন্যান্য প্রকল্পের জন্য কাস্টম টাস্ক যেমন অ্যান্ড্রয়েড:

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
@ ব্র্যাডপিচার সমস্যা নেই! সঠিক উত্তরটি পেতে আমার কিছুটা সময় লেগেছে। এটি ঠিক "হ্যাকিশ" বলে মনে হচ্ছে। আমি আশা করি তারা আরও সুন্দর উপায় নিয়ে আসবে।
জ্যারেড বুরোজ

সুতরাং, আমি যদি প্যাকেজ থেকে কেবল একটি শ্রেণিকে বাদ দিতে চাই তবে সঠিক পন্থাটি কী?
পেড্রো হেনরিক 18

2
এর মতো কিছু:exclude: ['**/*Test*.*'])
জ্যারেড বুরোজ 20'15

1
jacocoTestReportশুধুমাত্র উভয় jacocoএবং javaপ্লাগইনগুলির সাথে কাজ করে । এটি অ্যান্ড্রয়েডের জন্য নয়। অ্যান্ড্রয়েডের জন্য দয়া করে আমার রেপোটি
জারেড বুড়ো

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 এর সাথে সামঞ্জস্যপূর্ণ কোনও সমাধান দেখানো দুর্দান্ত হবে।
থান্ডারফোরজ

60

গ্রেডল সংস্করণ classDirectories = files(...)৫.০ এর জন্য, এইটি হ্রাসের সতর্কতা দেয় এবং গ্রেডল .0.০ থেকে শুরু করে কোনওভাবেই কাজ করে না এটি ক্লাসগুলি বাদ দেবার ননড্রিপ্রেসিটেড পদ্ধতি:

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

2
অথবা কেবল ক্লাসডাইরেক্টরিজ.ফর্ম (ওভাররাইডিং তালিকার পরিবর্তে তালিকায় যোগ করার জন্য) ব্যবহার করুন
মোহাম্মদ এল-বেল্টগি

1
আপনি কয়েকটি পাথ অন্তর্ভুক্ত করার []পরে যুক্ত exclude: করবেন।
ওয়েস্টার্নগান

দুর্দান্ত, আমি গ্রেড 6.0.1 ব্যবহার করি এবং এই সমাধানটি আমার পক্ষে কাজ করে।
ডারজেন

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% কভারেজ দেয় বলে মনে হয়। আমি জ্যাকোসি 0.8.5 এবং গ্রেডেল 6.0
tschmann

জ্যাকোকে কিছু শ্রেণীর সাথে হস্তক্ষেপ না করতে বলার এই সঠিক উপায়, অন্যান্য পদ্ধতিগুলি কেবল প্রতিবেদনের অংশকে প্রভাবিত করে।
ব্রাইস

9

গ্রেডল For এর জন্য নীচের মতো কিছু ব্যবহার করুন, কারণ তারা তৈরি করেছে 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

এটি কিছুক্ষণের জন্য বাইরে চলে গেছে তবে আমি কেবল এটি পেরিয়েছি। প্রয়োজনীয় সমস্ত ব্যতিক্রম নিয়ে আমি লড়াই করে যাচ্ছিলাম। আমি এটি আমার জন্য আরও সহজ কিছু পেয়েছি। আপনি যদি মাভেন প্রকল্পের লেআউট শৈলী / এসসিআর / মেইন / জাভা এবং / এসআরসি / পরীক্ষা / জাভা অনুসরণ করেন তবে আপনাকে কেবল নিজের ক্লাসের ডিরেক্টরি কনফিগারেশনে বিল্ডডির / ক্লাস / প্রধান স্থাপন করা দরকার :

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

গ্রেড.প্রোপার্টি ফাইলগুলিতে কনফিগারেশন নীচে যুক্ত করুন

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


coverageExcludeClassesজ্যাকো / গ্রেডলে কোনও জিনিস হিসাবে উপস্থিত হবে না
গুস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.