Инструментальные тесты Android для покрытия библиотечных модулей

Я унаследовал проект Android, для которого нужно настроить покрытие кода. Не сделав много для Android и почти так же мало для Gradle, я начал поиски полезного руководства. Как ни удивительно, первые несколько руководств оказались очень полезными, и я смог включить плагин jacoco gradle и включить покрытие кода. С помощью Дженкинса я даже составил отчет о покрытии. Пока все выглядит нормально.

Однако, взглянув на отчет, я почувствовал запах рыбы. Соотношение между тестами и охватом казалось слишком маленьким. Дальнейшее расследование выявило виновного.

Сами тесты написаны скорее как функциональные, а не как модульные. Это было бы нормально. Однако в модуле библиотеки проекта нет тестов. Вместо этого тесты библиотеки написаны в модуле gui (поскольку именно там используется библиотека).

Поэтому, хотя большая часть функциональных возможностей библиотеки покрывается тестами, покрытие создается только для материала из модуля gui.

Проект

- Модуль Gui

---- исходники графического интерфейса

---- все тесты

- Библиотечный модуль

---- источники библиотеки

Нет, я давно искал рабочее решение. К сожалению, все, что мне удалось найти, - это объединить результаты покрытия модульных и интеграционных тестов .exec в один отчет (или другие решения на основе модульных тестов - ни одно из которых не работает для инструментальных).

Что мне нужно, так это сгенерировать покрытие для источников из модуля библиотеки на основе тестов модуля Gui.

Поскольку я спотыкаюсь здесь в темноте, возможно ли хоть что-нибудь подобное?


person Viliam Aboši    schedule 10.08.2017    source источник


Ответы (1)


Для всех, кто читает это ... если у вас такая же проблема, пора начать биться головой о стену ...

Сегодня мне посчастливилось наткнуться на это: https://issuetracker.google.com/issues/37004446#comment12

Фактическая «проблема», похоже, в том, что проекты библиотеки «всегда» релизного типа. Поэтому они не содержат «необходимую настройку инструментария» (если вы также не включили покрытие кода для выпуска, хотя я его не тестировал).

Таким образом, решение состоит в том, чтобы специально включить в публикуемой библиотеке «отладочную» сборку (как уже упоминалось, по умолчанию используется тип выпуска):

android { 
        publishNonDefault true 
} 

Затем в проекте, который использует библиотеку, укажите зависимость debugCompile (компиляция выпуска может использовать конфигурацию выпуска "по умолчанию"):

dependencies { 
        debugCompile project(path: 'library', configuration: 'debug') 
        releaseCompile project('library') 
} 

И, конечно же (я считаю это само собой разумеющимся), не забудьте включить тестовое покрытие для библиотеки:

android { 
        buildTypes { 
                debug { 
                        testCoverageEnabled true 
                } 
        } 
} 
person Viliam Aboši    schedule 14.08.2017
comment
Это не работает для меня, я вижу в журналах, publishNonDefault устарел и больше не действует. Все варианты опубликованы. - person KH_AJU; 22.09.2020