Хобрук: Ваш путь к мастерству в программировании

Получите охват скомпилированных проектов с помощью jacoco, используя Gradle в проектах Android

У меня есть проект Android (который генерирует apk) и использует SDK. Чтобы использовать SDK в своем проекте, я поместил следующую строку в build.gradle:

compile project(':sdk')

Затем я использую Jacoco, чтобы получить отчет о покрытии для моих тестов, сделанных в проекте «myproject» (в sdk нет тестов). Я добавил эту строку (среди прочего) в build.gradle:

def coverageSourceDirs = [
    '../myproject/src/main/java',
    '../sdk/src/main/java'
]

но в результате я получаю покрытие только по проекту «myproject», но не получаю покрытия по классам SDK.

Можно ли получить покрытие строк SDK с помощью тестов, проведенных в моем проекте, с помощью плагина jacoco?

Большое спасибо!


  • Используете модульные тесты или не модульные тесты? Какие определения sourceSets предназначены для основного исходного кода? 31.01.2015
  • Я использую Espresso для тестирования пользовательского интерфейса. 02.02.2015
  • Это файл, но я спрашивал, запускаете ли вы модульные тесты, написанные в Expresso/Junit и т. д. (когда вы выполняете сборку или тестирование градиента). Expresso), в то время как ваше приложение/веб-сервис/проект .war/.ear и т. д. работает за целевой JVM (Tomcat, JBoss и т. д.). Во-вторых, какова ценность основного исходного кода. Я думаю, вам нужно сообщить Gradle, что sdk/src/main/java также является исходным кодом вашего основного/проекта (включая myproject/src/main/java). 02.02.2015

Ответы:


1

Вы хотите добавить пакеты, для которых вы хотите получить отчет о покрытии, как «включает».

def coverageSourceDirs = [**/src/main/java] 
task jacocoTestReport(type: JacocoReport, dependsOn: "connectedAndroidTest") {
     classDirectories = fileTree(
             dir: 'build/intermediates/classes',
             excludes: ['**/R.class',
                        '**/R$*.class',
                        '**/BuildConfig.*',
                        '**/Manifest*.*',
                        '**/*Activity*.*',
                        '**/*Fragment*.*'
             ],
             includes: ['**/path_to_your_app's_package/']
     )
     sourceDirectories = files(coverageSourceDirs)
     additionalSourceDirs = files(coverageSourceDirs)
     executionData = files('build/jacoco/connectedAndroidTest.exec') }
27.02.2015

2

Я пришел к решению. В настоящее время я тестирую SDK внутри внешней библиотеки (приложения), SDK компилируется и добавляется как зависимость в build.gradle. В моем SDK я использую кинжал для внедрения зависимостей, а в приложении Butterknife для внедрения представления. Dagger генерирует несколько $$.classes в файлах сборки dex, поэтому, когда вы пытаетесь запустить jacocoTest без исключения модулей внедрения, у вас возникают некоторые ошибки. Таким образом, вы должны исключить эти файлы. Также вы должны добавить классы и исходные файлы в качестве основных исходных каталогов и классов.

task jacocoTestReport(type: JacocoReport, dependsOn: "connectedAndroidTest") {
    description = "Generates Jacoco coverage reports: XML and HTML"
    group = "Reporting"
   jacocoClasspath = project.configurations['androidJacocoAnt']
  // exclude auto-generated classes and tests
    def fileFilter = ['*/$*.class',
                      '**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*',
                      'android/**/*.*','**/*$InjectAdapter.class',
                      '**/*$ModuleAdapter.class',
                      '**/*$ViewInjector*.class']
   def debugTree = fileTree(dir:
            "${project.getRootDir()}/sdk/build/intermediates/classes/debug",excludes:fileFilter
    )
    def mainSrc = "${project.getRootDir()}/sdk/src/main/java"
    sourceDirectories = files([mainSrc])
    classDirectories = files([debugTree])
    sourceDirectories = files([mainSrc])
    classDirectories = files([debugTree])
    executionData = fileTree(dir: project.projectDir, includes: ['**/*.exec', '**/*.ec'])
    // Bit hacky but fixes https://code.google.com/p/android/issues/detail?id=69174.
    // We iterate through the compiled .class tree and rename $$ to $.
    doFirst {
        new File("${project.getRootDir()}/sdk/build/intermediates/classes/debug").eachFileRecurse { file ->
            if (file.name.contains('$$')) {
                file.renameTo(file.path.replace('$$', '$'))
            }
        }
    }
  reports {
        xml {
            enabled = true
            destination = "${project.buildDir}/reports/jacoco/test/jacocoTestReport.xml"
        }
        csv.enabled false
        html {
            enabled = true
            destination = "${project.buildDir}/reports/jacoco"
        }
    }

}
23.04.2015
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..