相关文章推荐
爱笑的卡布奇诺  ·  Android ...·  1 年前    · 

使用gradle从jacoco测试覆盖中删除一些java文件

12 人关注

我想在Jacaco测试覆盖率报告中排除一些源文件,对于其他生成的代码我是这样做的。

classDirectories = fileTree(
            dir: "${project.buildDir}/intermediates/classes/debug/com",
            excludes: [
                    '**/R.class',
                    '**/R$*.class']

但是,当我试图这样做的时候,要排除Java文件。

   dir: "${project.buildDir}/intermediates/classes/debug/com",
            excludes: [
                 'src//java/com/example/application/Constants.java'] 

也试过这样的方法。 '**/application/Constants.class'.它不工作。我是否需要在这里包括路径。 dir: "${project.buildDir}/intermediates/classes/debug/com"

我使用的是Android studio 3.0(我认为在这里并不重要)。我正在尝试的全部代码。

task jacocoTestReport(type: JacocoReport) {
        group = "Reporting"
        description = "Generate Jacoco coverage reports"
        reports {
            xml.enabled = true
            html.enabled = true
 sourceDirectories = files(sourceSets)
 classDirectories = fileTree(
            dir: "${project.buildDir}/intermediates/classes/debug/com",
            excludes: [
                    'src//java/com/example/application/Constants.java',     //this is not working
                    '**/R.class',
                    '**/R$*.class',
                    '**/BuildConfig.*',
                    '**/Manifest*.*',
                    '**/*$ViewInjector*.*',
                    '**/*$ViewBinder*.*',
                    '**/*$Lambda$*.*', // Jacoco can not handle several "$" in class name.
                    '**/*Module.*', // Modules for Dagger.
                    '**/*Dagger*.*', // Dagger auto-generated code.
                    '**/*MembersInjector*.*', // Dagger auto-generated code.
                    '**/*_Provide*Factory*.*',
                    '**/*_Factory.*', //Dagger auto-generated code
                    '**/*$*$*.*', // Anonymous classes generated by kotlin
                    //add libraries
                    'android/**/*.*',
                    'com/**/*.*',
                    'uk/**/*.*',
                    'io/**/*.*',
                    //remove what we don't test
                    'androidTest/**/*.*',
                    'test/**/*.*',
                    '**/injector/**/*.*',
                    '**/model/**/*.*',
                    '**/mock/**/*.*',
                    '**/event/**/*.*',
                    '**/**_ViewBinding**',
                    '**/*EventType.*',
                    '**/**Mocked'
    executionData = fileTree(dir: 'build/jacoco', include: '**/*.exec')
    
2 个评论
你好,你尝试使用这样的类文件。 '**/application/Constant.class' ,但你的源文件名为 Constants.java 。那么,你是否也试过没有这个错别字呢? 例如: '**/Constants.class'
是的,我也试过不打字。
java
android
unit-testing
jacoco
test-coverage
Shubham
Shubham
发布于 2017-12-08
3 个回答
davis dai
davis dai
发布于 2021-02-12
已采纳
0 人赞同

In my project, config like this:

//exclude the folders we do not want to check
jacocoTestReport {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it, exclude: [
                    '**/enum/**',
                    '**/util/**',
    
我们可以添加多个classDirectories吗?我无法做到这一点!
@Shubham off cause you can, just add the package path to the list, like '**/enum/**' in the code.
如果你能给出一个例子就更好了。将class和java文件从中间目录和源代码目录中排除。
Godin
Godin
发布于 2021-02-12
0 人赞同

替换代码0】的任务类型 JacocoReport 约为 class 文件,而不是 java 源文件。而且我很确定,你的目录

 classDirectories = fileTree(
            dir: "${project.buildDir}/intermediates/classes/debug/com",

包含class文件,不包含java文件。另外,正如你所看到的,其他模式也是关于class的文件。

                '**/R.class',
                '**/R$*.class',

这就是为什么你被排除在外

           'src//java/com/example/application/Constants.java',     //this is not working

不起作用。因此,请将其改为与指定目录中现有的class文件相匹配。

还要注意的是,你可以通过简单地打印fileTree(...)的调用结果来轻松地进行调试。

tree.each {File file ->
    println file
    
谢谢你的回答,我甚至尝试使用这样的类文件。'**/application/Constant.class'。**指的是什么。根据我的理解,它指的是包内的任何东西。这似乎对我不起作用。
@Shubham 我已经解释了如何调试 fileTree 的结果,所以请调试它。而且,如果没有 最小化、完整化和可验证的例子 从你那 充分证明了 你的问题,没有什么可说的,尤其是类似的配置对其他人来说很好。
@Godin 既然有人可能将插件生成的代码添加到源集上,如何在源集上做到这一点?
Celt
Celt
发布于 2021-02-12
0 人赞同

对于gradle 6+,你可以像下面这样配置它。

jacocoTestCoverageVerification {
    violationRules {
        rule {
            includes = ['com/myapp/*']
            excludes = [
                    'com/myapp/folderToExclude1/*',
                    'com/myapp/folderToExclude2/*',
           limit {
                minimum = 0.85