【问题标题】:sonarqube with both androidTest and test covarage具有 android 测试和测试覆盖率的 sonarqube
【发布时间】:2016-09-13 19:11:22
【问题描述】:

我正在尝试在我的 Android 项目中设置 sonarqube 报告。我目前无法在声纳 UI 中显示所有测试类,覆盖率以百分比显示,目前只有来自 app/src/test/ 的单元测试显示为单元测试。

我的项目有一个测试文件夹app/src/test/,其中包含单元测试,我有一个androidTest 文件夹app/src/androidTest/,其中包含android 单元、集成和UI 测试。当我通过 gradle 运行所有测试时,android-gradle 插件会生成 build/jacoco/testDebugUnitTest.execbuild/test-results/debug/TEST-*Test.xml,其中包含测试文件夹中单元测试的 jacoco 结果和覆盖率报告。 android-gradle 插件还会生成 build/outputs/code-coverage/connected/coverage.ecbuild/outputs/androidTest-results/connected/TEST-*Test.xml 包含来自 androidTest 文件夹的结果和覆盖率报告

在我的 build.gradle 中,我可以指定声纳插件的属性。

 sonarqube {
        properties {
            property "sonar.sources", "src/main/java,src/main/res"
            property "sonar.tests", "src/test/java,src/androidTest/java"

            property "sonar.java.coveragePlugin", "jacoco"
            property "sonar.jacoco.reportPath", "${project.buildDir}/jacoco/testDebugUnitTest.exec"
            property 'sonar.jacoco.itReportPath', "${project.buildDir}/outputs/code-coverage/connected/coverage.ec"

            property "sonar.junit.reportsPath", "${project.buildDir}/test-results/debug" // path to junit reports
        }
    }

使用sonar.junit.reportsPath,我可以指定将哪个 xml 报告发送到 sonarqube 服务器。当我将其更改为build/outputs/androidTest-results/connected 时,我得到的 androidTest 在仪表板上显示为单元测试。有没有办法让声纳插件同时查看两个目录或将结果合并在一起?

【问题讨论】:

    标签: android unit-testing gradle sonarqube jacoco


    【解决方案1】:

    在修复https://jira.sonarsource.com/browse/SONAR-4101 之前,您唯一的选择是编写一个任务,将您的测试结果文件复制到一个地方并将其配置为sonar.junit.reportsPath,如下所示:

    task combineTestResultsForSonarqube {
        group = "Reporting"
        def modules = ["app", "and", "other", "modules"];
        doLast {
            modules.each { module ->
                File combined = file("${module}/build/combined-test-results")
                if (combined.exists()) {
                    combined.deleteDir()
                }
                combined.mkdirs();
    
                def testDirs = [file("${module}/build/test-results/debug/"),
                                file("${module}/build/outputs/androidTest-results/connected/")];
                testDirs.each { testDir ->
                    if (!testDir.exists()) {
                        logging.captureStandardOutput LogLevel.WARN
                        println "WARNING: ignoring non-existant ${testDir.path}"
                        return;
                    }
                    files(testDir.listFiles()).each { file ->
                        new File(combined, file.getName()) << file.text
                    }
                }
            }
        }
    }
    

    当您的构建中有不同的风格时,当然必须调整路径。

    【讨论】:

    • 虽然这可能会在 SonarQube 测试列表中添加 UI 测试,但它不会增加您的覆盖率或表明方法已被覆盖。有什么解决办法吗?
    • @Elias 如果您使用 Jacoco 进行检测和代码覆盖,那么您已经准备好了,因为较新版本的 Sonarqube 合并了来自单元和检测测试的 Jacoco 覆盖数据。然而,我不知道这对于其他覆盖插件是可能的。
    • 我们使用的是 SonarQube v6,我想这是最新的?我传递了这些属性: property "sonar.java.coveragePlugin", "jacoco" property "sonar.jacoco.reportPath", "build/jacoco/testProductionMinSdk19DebugUnitTest.exec" //junit 覆盖报告属性 "sonar.junit.reportsPath", " build/test-results/productionMinSdk19Debug/" // junit 报告的路径属性 "sonar.android.lint.report", "/build/outputs/lint-results-productionMinSdk19Debug.xml" // lint 报告的路径
    猜你喜欢
    • 2018-10-18
    • 2021-07-09
    • 2022-07-01
    • 2015-03-13
    • 2014-05-04
    • 2015-10-26
    • 2020-11-14
    • 2021-03-03
    • 2020-09-22
    相关资源
    最近更新 更多