具有 android 测试和测试覆盖率的 sonarqube

Posted

技术标签:

【中文标题】具有 android 测试和测试覆盖率的 sonarqube【英文标题】:sonarqube with both androidTest and test covarage 【发布时间】: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 在仪表板上显示为单元测试。有没有办法让声纳插件同时查看两个目录或将结果合并在一起?

【问题讨论】:

【参考方案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 报告的路径

以上是关于具有 android 测试和测试覆盖率的 sonarqube的主要内容,如果未能解决你的问题,请参考以下文章

使用 Orchestrator 的 android 测试覆盖率

Android自动化测试工具实现简述

代码覆盖率VS测试覆盖率

Android应用测试篇

Gradle android插件和android测试?

如何使用 Android 获得 AWS Device Farm 测试的代码覆盖率?