当前位置: 首页 > 知识库问答 >
问题:

Jacoco代码承保范围文件为空,导致虚假承保范围报告

汪才
2023-03-14

一个Github回购与用于这个问题的代码可以在这里找到:https://github.com/thenewmr/UnitTestCoverageExample

我们在试图通过Jacoco正确生成代码覆盖率报告时遇到了严重问题。

我们遵循了互联网上的各种指南,包括Patrick McLaren在回答这个问题时链接到的这本指南。

我们还研究了有关堆栈溢出的各种问题,但到目前为止还没有发现任何问题。

以下是我们到目前为止的情况(以要点形式,以免使这个问题太长而无法阅读):

>

  • 向调试闭包添加testCoverageEn的=true创建了一个名为createDebugCoverageReport的任务
  • 运行此任务:

    • 为我们的Android测试产生报告:应用程序/构建/输出/报告/android测试/连接/index.html与测试通过和失败等准确的报告
    • 但是一个不准确的覆盖率报告(0%覆盖率)在:应用/构建/输出/报告/覆盖率/调试/index.html
    • 它还会在以下位置生成看似空的覆盖数据:app/构建/输出/code-覆盖/连接/coverage.ec

    现在,如果我们添加以下内容:

    apply plugin: 'jacoco'
    
    //specify which directories should be examined by jacoco
    def coverageSourceDirs = [
            'src/main/java'
    ]
    
    task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
        group = "Reporting"
    
        description = "Generate Jacoco coverage reports"
    
        classDirectories = fileTree(
                dir: 'build/intermediates/classes/debug',
                excludes: ['**/R.class',
                           '**/R$*.class',
                           '**/*$ViewInjector*.*',
                           '**/BuildConfig.*',
                           '**/Manifest*.*']
        )
    
        additionalSourceDirs = files(coverageSourceDirs)
        sourceDirectories = files(coverageSourceDirs)
        executionData = files('build/jacoco/testDebug.exec')
    
        reports {
            xml.enabled = true
            html.enabled = true
        }
    }
    

    去建造。应用程序的gradle文件(有或没有上面的位)并运行jacocoTestReport,我们得到:

    • 普通单元测试的测试报告位于:app/build/reports/tests/debug/index。html
    • app/build/reports/jacoco/jacoctestreport/html/index上的准确代码覆盖率报告。html

    所以,我们为普通的单元测试得到了正确的东西,但没有为Android单元测试得到正确的东西。

    上面提到的博文谈到了如何将两个报告结合起来。但是如果我们不能首先得到Android测试覆盖报告,这似乎是毫无意义的。

    问题似乎是由于覆盖范围空。如前所述的ec文件。

    这个答案说这曾经是一个bug:https://stackoverflow.com/a/28080713/487812

    这个bug报告说这个问题已经解决了:https://code.google.com/p/android/issues/detail?id=78556

    但也许它已经被重新引入作为一种回归?我们错过了什么明显的东西吗?

  • 共有2个答案

    龙逸清
    2023-03-14

    现在(2015年10月)你可以使用它,因为android团队已经修复了这个bug。

    android {
        ...
        buildTypes {
            debug {
                testCoverageEnabled true
            }
        }
        ...
        dependencies{
            androidTestCompile 'com.android.support.test:runner:0.4.1'
            // Set this dependency to use JUnit 4 rules
            androidTestCompile 'com.android.support.test:rules:0.4.1'
            // Set this dependency to build and run Espresso tests
            androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
            // Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
            androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.1'
        }
    }
    

    然后使用/gradlew CreateDebuggerPort。在app/build/reports/coverage/debug/index中查找报告。html

    程鸿畅
    2023-03-14

    虽然纽斯的回答是正确的,但下面的信息是我们特定问题的解决方案。

    事实证明,出于某种奇怪的原因,在三星设备上运行测试会产生空的覆盖率文件。在仿真器或非三星手机上运行相同的测试可以产生预期的结果。

    将此信息包括在此处,以便人们了解这一点。

     类似资料:
    • 问题内容: 在父控制器作用域中,我已定义将其设置为“ x”。然后在子范围中,我使用ngModel 进行了定义: 加载页面后,会按预期正确设置为“ x”。当我选择“ y”时,在CtrlB中$ scope会按预期给出“ y”。 但是,当我检查的范围(使用AngularJS的batarang),它给“X”。 jsFiddle:http : //jsfiddle.net/sudhh/GGKjp/2/ 预览

    • 问题内容: 我是Angular的新手,所以我想按照教程学习,只是不懂而已。令我困惑的是点符号: 在任何输入框中键入一个值将更新所有其他输入框。因此,我认为这是控制器外部的第一个声明将输入元素值绑定到根作用域中的data.message模型。我不明白里面的绑定是如何从中读取值的。根作用域,为什么插入作用域内的值将显示在该作用域外的输入框中? 另外如果被删除 那个行为不见了,怎么会这样? 问题答案:

    • 对于我的Java类,我正在编写一个小程序,首先选择一个介于1和100之间的数字。然后,它会提示用户开始猜测正确的。如果用户对的猜测过高或过低,程序会打印出一个新范围,供他们在该范围内进行猜测。如果用户输入或,程序只需重新要求用户输入,但不会以任何方式更改范围。 示例输出(当机密号为20时)如下所示: 该项目似乎已经基本完成,但只有一个例外。其中一个要求是,当用户键入的超出我们给定的1和100范围时

    • 我正在从事一个基于Selenium/testng/java/gradle的项目,该项目采用了针对webdriver和extenttest对象的ThreadLocal方法。每当我的测试用例失败时,我都会使用RetryListener再次运行失败的测试用例1次。若它是第二次通过,我的结果仍然在扩展报告中显示为“失败”(注意,所有迭代都记录在html报告中的单个测试节点中)。stackoverflow对

    • 问题内容: 我正在尝试将一个数字范围转换为另一个数字范围,并保持比率。数学不是我的强项。 我有一个图像文件,其中点值的范围可能在-16000.00到16000.00之间,尽管典型范围可能会小得多。我想做的是将这些值压缩到0-100的整数范围内,其中0是最小点的值,而100是最大点的值。即使丢失了一些精度,它们之间的所有点也应保持相对比率,我想在python中做到这一点,但即使是通用算法也足够。我更

    • 问题内容: 我为SCJP做准备,我也知道受保护成员的作用域在包中以及在其他包中(在某些情况下,例如只有继承才可能)。 例如:我有三个类作为Parentclass Childclass Friendclass 这背后的原因是什么,在Friendclass中,成员x将不接受为其分配值,而对于Childclass而言,它充当私有成员。 问题答案: 您甚至无法访问,因为具有默认可见性(不受保护)。参见ht