2016-02-13 96 views
2

我有Sonar分析的Android项目。我看到所有的问题,但没有通过单元测试覆盖。我尝试了很多东西,但仍然无法正常工作。当我调用“gradlew createDebugCoverageReport”时,它会在build/reports/coverage/debug目录中创建包含很多文件的目录,如report.xml和index.html,其中包含测试覆盖率数据。但是在覆盖范围内的Sonar中,我收到类似'这个组件没有覆盖细节'的消息。我如何得到它的工作?Android将单元测试覆盖率添加到声纳中

命令序列:

gradlew clean assemble 
gradlew createDebugCoverageReport 
gradlew sonarRunner 

的build.gradle

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "cz.meteocar.unit" 
     minSdkVersion 16 
     targetSdkVersion 20 
     versionCode 3 
     versionName "1.0.2" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 

      } 
      debug { 
       debuggable true 
       testCoverageEnabled = true 
      } 


     } 
    } 


apply plugin: 'sonar-runner' 

sonarRunner { 
     sonarProperties { 
     property "sonar.host.url", "http://localhost:9000" // Address of Sonar   server 
     property "sonar.sources", "src/main/java" // Sources 
     property "sonar.projectName", "Meteocar" // Name of your project 
     property "sonar.projectVersion", "1.0.2" // Version of your project 
     property "sonar.projectDescription", "Sonar" // Description of your project 
     property "sonar.junit.reportsPath", "build/reports/coverage/" 
    } 
} 



dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile files('libs/mbassador-1.2.0.jar') 
    compile 'com.android.support:appcompat-v7:21.0.3' 
    compile 'com.android.support:support-v4:20.0.0' 
    compile 'org.apache.commons:commons-lang3:3.0' 
    compile 'com.jjoe64:graphview:4.0.1' 
    testCompile 'junit:junit:4.12' 
    testCompile 'org.mockito:mockito-core:1.9.5' 
    testCompile 'org.powermock:powermock-api-mockito:1.6.1' 
    testCompile 'org.powermock:powermock-module-junit4-rule-agent:1.6.1' 
    testCompile 'org.powermock:powermock-module-junit4-rule:1.6.1' 
    testCompile 'org.powermock:powermock-module-junit4:1.6.1' 
    testCompile 'org.json:json:20140107' 
} 

回答

5

可以使用Jacoco的覆盖效果。它与sonar效果很好:

1.安装Android插件上SonarQube

2.增加jacoco plugin和创建Gradle一个gradle task产生coverage文件,水木清华这样的:

apply plugin: 'jacoco' 

jacoco { 
    version "0.7.1.201405082137" 
} 

task jacocoTestReport(type: JacocoReport, dependsOn: "testDebugUnitTest") { 
    group = "Reporting" 
    description = "Generate Jacoco coverage reports after running tests." 
    reports { 
     xml.enabled = true 
     html.enabled = true 
    } 
    classDirectories = fileTree(
      dir: 'build/intermediates/classes/debug/com/yourapppackagename', 
      excludes: ['**/R.class', 
         '**/R$*.class', 
         '**/BuildConfig.*', 
         '**/Manifest*.*']) 
    sourceDirectories = files('src/main/java') 
    executionData = files('build/jacoco/testDebugUnitTest.exec') 
    doFirst { 
     files('build/intermediates/classes/debug').getFiles().each { file -> 
      if (file.name.contains('$$')) { 
       file.renameTo(file.path.replace('$$', '$')) 
      } 
     } 
    } 
} 

3.创建sonar.properties文件在你的根目录下包括覆盖文件路径:

sonar.jacoco.reportPath=sdk/build/jacoco/testDebugUnitTest.exec 
sonar.junit.reportsPath=sdk/build/test-results/debug 

4.Run jacoco gradle task

./gradlew clean assembleDebug jacocoTestReport 

5.Run sonar analyses

+0

感谢您的帮助。它现在运作良好。 – user1816532

+1

我该如何扩展这个解决方案,以便它也可以用于Instrumentation测试(AndroidJUnit4)?为了最好,如果它是在一个报告中? – user1816532

+0

那么你究竟想让它工作?如果它关于通过或失败的测试声纳也支持他们,并且sonarqube官方页面上有关于如何整合它的文档。它比添加覆盖报告更容易,您只需定义测试代码的路径 – hrskrs