簡體   English   中英

Jacoco覆蓋率報告問題

[英]Jacoco Coverage Report issues

我正在嘗試定義位置,jacoco將為真實設備上運行的儀器測試創建覆蓋文件。

從gradle任務的--debug運行我看到這個日志:

[DEBUG] [org.gradle.api.Task] DeviceConnector 'Nexus 5X - 6.0.1': installing /home/martin/workspace/lib/my-lib/build/outputs/apk/my-lib-debug-androidTest-unaligned.apk
[INFO] [org.gradle.api.Task] Starting 1 tests on Nexus 5X - 6.0.1
[INFO] [org.gradle.api.Task]  de.my.lib.utils.UtilsTest testMyTest[Nexus 5X - 6.0.1] [32mSUCCESS [0m
[DEBUG] [org.gradle.api.Task] DeviceConnector 'Nexus 5X - 6.0.1': fetching coverage data from /data/data/de.my.lib.test/coverage.ec
[DEBUG] [org.gradle.api.Task] DeviceConnector 'Nexus 5X - 6.0.1': uninstalling de.my.lib.test 13:46:14.538
[DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':my-lib:connectedDebugAndroidTest'

我嘗試了三種方法來定義位置:

使用清單文件中的<instrumentation>標記沒有任何改變。

<?xml version="1.0" encoding="utf-8"?>
<manifest
    package="de.my.lib.test"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <instrumentation
        android:name="android.support.test.runner.AndroidJUnitRunner"
        xmlns:tools="http://schemas.android.com/tools"
        android:targetPackage="de.my.lib.test"
        tools:replace="android:targetPackage">
        <meta-data
            android:name="coverage"
            android:value="true" />
        <meta-data
            android:name="coverageFile"
            android:value="/sdcard/coverage.ec" />
    </instrumentation>
</manifest>

我用gradle嘗試了它,但輸出是相同的:

defaultConfig {
    // unimportant stuff
    testApplicationId "de.my.lib.test"

    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    testInstrumentationRunnerArgument('coverageFile', '/sdcard/coverage.ec')
}

最后我用adb命令試了一下:

adb shell am instrument -w -e coverage true -e coverageFile /sdcard/coverage.ec de.my.lib.test/android.support.test.runner.AndroidJUnitRunner

但在那里我得到2個錯誤:

de.my.lib.utils.UtilsTest :. 找不到類:org.jacoco.agent.rt.internal_773e439.CoverageTransformer。 時間:0,072

好的(1個測試)

錯誤:無法生成emma覆蓋率。

我完全迷失在這里。 有任何想法嗎?

背景為什么我需要它將它存儲在另一個地方:某些設備和Android版本上存在adb shell run-as命令的錯誤,因此我的測試設備場中的設備返回0%覆蓋率因為文件不能被拉。 所以我需要將文件存儲在公共場所。

但是,尚未生成覆蓋率報告。 要啟用此選項,我們需要向調試版本變量添加屬性。 使用Android插件DSL,我們可以通過testCoverageEnabled屬性啟用覆蓋:

android {
    ...
    buildTypes {
        debug {
            testCoverageEnabled true
        }
        ...
    }
}

要在使用2.2版本的Android Gradle插件時啟用本地測試的覆蓋率報告,您需要在應用的build.gradle啟用它:

android {
    //...

    testOptions {
        unitTests.all {
            jacoco {
                includeNoLocationClasses = true
            }
        }
    }
}

通過Jacoco執行的儀器產生包含必要的數據來創建報告(HTML,XML等)執行的文件。 這里的問題是Espresso生成.ec文件,而單元測試執行生成.exec文件......我們有不同的格式!

由於我們無法配置Espresso的覆蓋任務,我們必須確保首先執行它。 接下來,我們需要運行單元測試,然后使用兩個文件( ecexec )創建coverage數據。

要啟用此功能,我們需要再次編輯我們的任務,並將coverage.ec文件添加為executionData屬性中的參數:

apply plugin: 'jacoco'

task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'createDebugCoverageReport']) {

    reports {
        xml.enabled = true
        html.enabled = true
    }

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

    sourceDirectories = files([mainSrc])
    classDirectories = files([debugTree])
    executionData = fileTree(dir: "$buildDir", includes: [
            "jacoco/testDebugUnitTest.exec", 
            "outputs/code-coverage/connected/*coverage.ec"
    ])
}

由於Android Gradle插件2.2。+現在為每次執行生成一個覆蓋文件,使用文件名中的設備/模擬器,現在我們需要將每個文件傳遞給執行數據,因為文件名現在是動態的。 另外,我添加了createDebugCoverageReport任務作為我們自定義任務的依賴項,因此我們不需要手動運行它:)

最后,當我們執行這兩項任務時,首先運行Espresso測試,我們將獲得統一的覆蓋率報告!

gradle clean jacocoTestReport

有關詳細說明,請參見此處

編輯:

因此,命令adb shell am instrument不會生成報告,為此您必須使用gradle解決方案來處理它。 如果你真的想要自己測試它,那么你就要使用自定義跑步者

參考文獻:

1) 如何自動生成HTML的Android測試報告

2) 使用“adb shell am instrument”時如何檢索測試結果

3) https://github.com/jsankey/android-junit-report


從命令行進行測試


更新到命令行方法請按照下列步驟操作。

運行已檢測的應用程序

一旦我們有了EmmaInstrumentation類(在ref鏈接中),我們需要進行一些調整才能獲得正在運行的應用程序的覆蓋率報告。

首先,我們需要將新的Activity添加到清單中。 其次,如果我們決定生成覆蓋率報告,我們應該允許我們的應用程序寫入SD卡。 為此,您應該授予android.permission.WRITE_EXTERNAL_STORAGE權限。 然后,是時候構建和安裝檢測的apk:

$ ant clean
$ ant instrument
$ ant installi

一切都准備好啟動儀表化的應用程序

$ adb shell am instrument -e coverage true \
    -w com.example.i2at.tc/\
        com.example.instrumentation.EmmaInstrumentation

是源代碼。

缺少的CoverageTransformer類提示缺少對JaCoCo代理運行時的依賴關系。 一種簡單的解決方案可能是,為它提供它所需要的(在設備上可用):

testImplementation "org.jacoco:org.jacoco.agent:0.8.3"

如果你得到一個FileNotFoundException ,當ClassNotFoundException被修復時,請確保有權寫入SD卡,這似乎是另一個可能的陷阱:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

正如我剛才看到的,還有一個org.jacoco.report包,可以選擇添加:

testImplementation "org.jacoco:org.jacoco.report:0.8.3"

org.jacoco.agent在每種情況下都是包含CoverageTransformer類的包。

對我們來說這是一個AOSP應用程序。 我們正在生成帶有禁用Jack編譯器的測試和模塊apks,這導致了這個進一步的問題。 因為對我們來說,Jack編譯器需要生成coverage.em 但錯誤並不十分重要。 所以沒有任何進一步的線索。

所以解決方法是運行jack編譯器服務器並獲取使用它生成的apks。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM