2015-03-18 232 views
21

我試圖生成Jacoco代碼覆蓋率報告。 我已經使用AndroidTestCase爲我的測試類。Jacoco代碼覆蓋在Android Studio中

我一直在使用testCoverageEnabled真實,使用默認的Android -Studio默認jacoco, ./gradlew connectedCheck或createDebugCoverageReport 創建全成的百分比/失敗測試案例,但沒有覆蓋報告發現。

然後我嘗試了jacoco {toolVersion「0.7.1.201405082137」}和任務jacocoTestReport(類型:JacocoReport,dependsOn:「testDebug」)。我試圖用各種任務來改變dependsOn值。該報告顯示0(零)測試覆蓋率,這是不可能的,因爲至少有一半的類都經過測試。

我跟隨在過去幾天的堆棧溢出的各種公認的答案。結果是消極的。

我gradle這個文件:

buildscript { 
    repositories { 
     mavenLocal() 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.0.0'   
    } 
} 

apply plugin: 'com.android.application' 
apply plugin: 'jacoco' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "test.gradle.com.myapplicationtestgradle" 
     minSdkVersion 21 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
    } 

    buildTypes { 
     release { 
      minifyEnabled false    
      proguardFiles getDefaultProguardFile(
      'proguard-android.txt'), 'proguard-rules.pro' 
     } 
     debug { 
      testCoverageEnabled true 
     } 
    } 

    jacoco { 
     version "0.7.1.201405082137" 
    } 

    packagingOptions { 
     exclude 'LICENSE.txt' 
    } 
} 


jacoco { 
    toolVersion "0.7.1.201405082137" 
} 

task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") { 
    group = "Reporting" 

    description = "Generate Jacoco coverage reports" 

    // exclude auto-generated classes and tests 
    def fileFilter = ['**/R.class', '**/R$*.class', 
    '**/BuildConfig.*', '**/Manifest*.*',   
    'android/**/*.*'] 
    def debugTree = fileTree(dir: 
    "${project.buildDir}/intermediates/classes/debug", 
    excludes: fileFilter) 
    def mainSrc = "${project.projectDir}/src/main/java" 

    sourceDirectories = files([mainSrc]) 
    classDirectories = files([debugTree]) 
    additionalSourceDirs = files([ 
      "${buildDir}/generated/source/buildConfig/debug", 
      "${buildDir}/generated/source/r/debug" 
    ]) 
    executionData = fileTree(dir: project.projectDir, includes: 
        ['**/*.exec', '**/*.ec']) 

    reports { 
     xml.enabled = true 
     xml.destination = "${buildDir}/jacocoTestReport.xml" 
     csv.enabled = false 
     html.enabled = true 
     html.destination = "${buildDir}/reports/jacoco" 
    } 
} 


dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('junit:junit:4.11') { 
     exclude module: 'hamcrest-core' 
    } 
} 

回答

12

我看你已經懂了工作,然而,有一個爲獲得單位執行測試數據更簡單的方法。我最近也在研究這個,我實際上做了一個完整的寫作earlier today

在我的情況下,我不想創建額外的Gradle任務,因爲我希望將報告生成爲現有工作流程的一部分。我也不想明確添加Jacoco插件,因爲測試工具測試覆蓋報告的Jacoco Ant任務是Google already dups

除了設置屬性android.jacoco.versionbuildTypes.debug.testCoverageEnabled,添加以下到testDebug JVM參數以生成執行數據:

project.afterEvaluate { 
    def append = "append=true" 
    def destFile = "destfile=$buildDir/outputs/code-coverage/connected/coverage.ec" 
    testDebug.jvmArgs "-javaagent:$buildDir/intermediates/jacoco/jacocoagent.jar=$append,$destFile" 

    createDebugCoverageReport.dependsOn testDebug 
} 

此單元測試執行數據附加到由connectedAndroidTest產生的覆蓋文件,所以你的報告既反映了儀器測試,也反映了單元測試,而不是單獨的每個變體。

請注意,connectedAndroidTest會覆蓋覆蓋率文件,請在創建報告時考慮這一點。如果任務testDebug沒有任何更改,並且您運行的是createDebugCoverageReport,則它只會反映您的儀器測試覆蓋範圍。因此,請對您的單元測試進行更改。 Linux命令touch在這裏可能很有用,雖然我還沒有嘗試過。

+0

只是引用什麼似乎是獲得任何類型的覆蓋報告生成的規範方法,請參閱[this](http://stackoverflow.com/q/23795595/269300)這樣的問題 - 任何人誰在獲取'createDebugCoverageReport'時遇到問題。 – 2015-03-19 20:11:33

+1

我已經看到了接受的答案。我認爲。你對儀器測試和單元測試都是正確的。我確實需要看看(testDebug.jvmArgs)。非常感謝你解釋一些有用的信息。 – user1365169 2015-03-20 15:29:28

+0

這似乎並沒有爲我合併這兩份報告。它只包括來自android測試的覆蓋,而不是單元測試。我使用多種口味,但是我相應地更改了'project.afterEvaluate'。任何想法? – 2015-04-09 07:58:18

1

我完全去除機器人工作室,Android SDK中,gradle這個。然後重新安裝一切。今天我完全刪除了android studio,android sdk,gradle。然後重新安裝一切。之後,我只是在應用程序build.gradle內添加。

debug { 
    testCoverageEnabled true 
} 

然後我運行./gradlew connectedChec。一切都很完美。 Android工作室默認Jacoco對我來說工作得很好。我認爲也可以創建一個jacocoTestReport Task,然後創建代碼覆蓋率。我不知道爲什麼gradle和android studio以前沒有工作。

38

Gradle已經內置了對生成測試覆蓋率報告的支持,我們不需要創建任何額外的配置或添加任何插件來生成測試覆蓋率報告。基本上,我們需要做的唯一的事情就是設置testCoverageEnabled參數truebuild.gradle文件,如下所示:

android { 
    buildTypes { 
     debug { 
     testCoverageEnabled = true 
     } 
    } 
} 

接下來,我們可以從CLI執行以下搖籃任務:

./gradlew createDebugCoverageReport 

在Windows我們可以這樣執行它:

gradlew.bat createDebugCoverageReport 

任務將分析/src/main/java/直接我們項目的代碼ory和單元測試放在/src/androidTest/java/目錄中。 執行此任務後,我們可以發現在模塊的以下目錄中的測試覆蓋率報告:

/build/outputs/reports/coverage/debug/ 

當我們打開index.html文件,我們可以看到測試覆蓋率,可以在網絡上觀看的可視化報表瀏覽器。

它看起來如下圖所示。

enter image description here

我已經寫在Android應用程序的測試覆蓋率報告的文章,它前一段時間發表在我的博客。如果你有興趣在該主題中,您可以在閱讀:

http://blog.wittchen.biz.pl/test-coverage-report-for-android-application/

更新(單元測試覆蓋率爲Robolectric測試)

如果你想創建單元測試的測試覆蓋率報告寫有Robolectric並生成測試覆蓋率報告與Jacoco特拉維斯CICodecov.io,請看看在新的北極勒在我的博客:

http://blog.wittchen.biz.pl/test-coverage-report-with-travis-ci-for-robolectric-tests-on-android/

+6

我看到的唯一問題是在Android Studio上使用JUnit時,/ src/androidTest/java不是默認值。/src/test/java是目錄。任何線索如何覆蓋該目錄? – 2015-10-26 23:55:36

+0

在我的情況下,我在'/ src/androidTest/java'中進行了所有測試,測試覆蓋率報告仍然正確生成。當您將所有測試放到'/ src/test/java'或部分測試(普通java)到一個目錄和另一部分(android)到不同目錄時,我沒有檢查它是如何工作的。 – 2015-10-27 09:24:34

+0

但我們必須瞭解android studio本身使用jacoco來生成測試報告。 – dsharew 2015-12-02 06:18:28