Запуск покрытия Android с JaCoCo

У нас есть приложение для Android, которое мы создаем с помощью Gradle/Android Studio и используем JaCoCo для создания отчетов о покрытии кода для наших модульных тестов; это отлично работает. Мы также заинтересованы в возможности генерировать отчеты о покрытии для ручных тестов; то есть показать, какой код был покрыт при запуске произвольного приложения. Похоже, что предшественник JaCoCo EclEmma был на это способен, но мне не удалось найти ни одного подтверждение так или иначе о JaCoCo (хотя я начинаю предполагать, что это невозможно из-за отсутствия дискурса).

Я пытался использовать EclEmma из Eclipse просто для того, чтобы что-то получить, но последняя версия не работает с эта ошибка, и я не мог сразу заставить работать старые версии.

Кто-нибудь может подтвердить, возможно ли генерировать данные о покрытии при запуске произвольного приложения с помощью JaCoCo? Например, запустите приложение, нажмите кнопки, закройте приложение и получите отчет о том, какой код был выполнен с помощью кнопок, которые вы нажали. Если нет, есть ли другой инструмент, который может это сделать?

Спасибо!


person Tbadams    schedule 04.05.2015    source источник


Ответы (1)


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("enter code here"
            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('$$', '$'))
            }
        }
    }
}

// это для отчета

 debug {
            testCoverageEnabled true
        }

// это для офлайн

добавьте их в файл build.gradle.

добавить каталог «ресурсы» в приложение> src> main

добавьте файл jacoco-agent.properties в ресурсы.

записать destfile=/sdcard/coverage.exec в файл jacoco-agent.properties

Теперь добавьте этот класс в свой проект.

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) {
            new Throwable("Is emma jar on classpath?", e);
        }
    }
}

когда ваше приложение находится в режиме onDestroy, вызовите функцию

jacoco.generateCoverageReport();

вы можете запустить свое приложение. когда тест закончен, вы можете использовать команду «adb pull /sdcard/coverage.exec yourapp/build/outputs/code-coverage/connected/coverage.exec».

последняя операция запуска задачи gradle определяет выше там «jacocoTestReport».

в порядке. все сделано. откройте index.html в «yourapp/build/reports/jacoco/jacocoTestReport/html/».

person X Fun    schedule 22.12.2015
comment
Не забудьте объявить разрешение на запись во внешнее хранилище в файле манифеста вашего приложения для Android. - person user3509406; 23.08.2017