Как найти покрытие кода приложения для Android для ручного тестирования? - PullRequest
0 голосов
/ 24 июня 2019

Я хочу найти покрытие кода для ручного и автоматического тестирования (appium) для приложения Android (Android studio + gradle).

В StackOverflow уже есть несколько вопросов, связанных с этой проблемой, но ни одногоиз них работает для меня.Я следовал за шагами этого вопроса: Запуск Android Coverage с JaCoCo Файл jacoco.exec, который генерируется в SDCard /, составляет 37 байт и в основном пуст.

Текущая конфигурация build.gradle:

apply plugin: 'com.android.application'

apply plugin: 'jacoco'
def coverageSourceDirs = [
        '../app/src/main/java'
]

jacoco{
    toolVersion = "0.7.4.201502262128"
}

task jacocoTestReport(type: JacocoReport) {
    group = "Reporting"
    description = "Generate Jacoco coverage reports after running tests."
    reports {
        xml.enabled = true
        html.enabled = true
    }
    classDirectories = fileTree(
            dir: './build/intermediates/classes/debug',
            excludes: ['**/R*.class',
                       '**/*$InjectAdapter.class',
                       '**/*$ModuleAdapter.class',
                       '**/*$ViewInjector*.class'
            ])
    sourceDirectories = files(coverageSourceDirs)
    executionData = files("$buildDir/outputs/code-coverage/connected/coverage.exec")
    doFirst {
        new File("$buildDir/intermediates/classes/").eachFileRecurse { file ->
            if (file.name.contains('$$')) {
                file.renameTo(file.path.replace('$$', '$'))
            }
        }
    }
}
// this is for the report
...

jacoco.java:

package anubhav.calculatorapp;

import android.util.Log;

import java.lang.reflect.Method;

public class jacoco {
    static void generateCoverageReport() {
        String TAG = "jacoco";
        // use reflection to call emma dump coverage method, to avoid
        // always statically compiling against emma jar
        String coverageFilePath = "/sdcard/coverage.exec";
        java.io.File coverageFile = new java.io.File(coverageFilePath);
        try {
            Class<?> emmaRTClass = Class.forName("com.vladium.emma.rt.RT");
            Method dumpCoverageMethod = emmaRTClass.getMethod("dumpCoverageData",
                    coverageFile.getClass(), boolean.class, boolean.class);

            dumpCoverageMethod.invoke(null, coverageFile, false, false);
            Log.e(TAG, "generateCoverageReport: ok");
        } catch (Exception  e) {
            Log.e("jacoco", "inside catch. no emma jar found");
            new Throwable("Is emma jar on classpath?", e);
        }
    }
}

1 Ответ

0 голосов
/ 28 июня 2019

Внесите эти изменения в файл build.gradle:

apply plugin: 'jacoco' 

Также добавьте testCoverageEnabled true отладке {} в buildTypes. Я не могу подчеркнуть важность testCoverageEnabled, он обрабатывает файлы, и вы не сможете получить покрытие без него. Убедитесь, что эта строка добавлена ​​правильно.

Для правильной настройки 'build.gradle' проверьте 'build / middleates'.

Добавить разрешение на чтение и запись для внешнего хранилища в AndroidManifest.xml

В функции onDestroy () MainActivity.java добавьте следующие строки:

Log.d("StorageSt", Environment.getExternalStorageState());
        String coverageFilePath = Environment.getExternalStorageDirectory() + File.separator+ "coverage.exec";
        File coverageFile = new File(coverageFilePath);
        super.onStop();
        if(BuildConfig.DEBUG)
        {
            try {
                Class<?> emmaRTClass = Class.forName("com.vladium.emma.rt.RT");
                Method dumpCoverageMethod = emmaRTClass.getMethod("dumpCoverageData",coverageFile.getClass(),boolean.class,boolean.class);
                dumpCoverageMethod.invoke(null, coverageFile,true,false);
            }
            catch (Exception e) {}

Запустите ваше приложение, и вы найдете cover.exec в / sdcard /. Если покрытие на эмуляторе составляет 37 байт, попробуйте его на реальном устройстве или создайте APK и поместите его в эмулятор, чтобы установить его.

После этого вы можете вставить в файл cover.exec свой компьютер и с помощью jacoco сгенерировать из него отчет в формате HTML.

...