Ответ 1
В течение сотен раз поиска ответа на получение отчета о покрытии, я, наконец, нашел точный ответ, что я хочу.
Из этого поста в блоге я узнал, что gradlew createDebugCoverageReport
создает отчет о покрытии jacoco.
Кроме того, из исходного кода плагина Gradle плагин по умолчанию использует jacoco 0.6.2.201302030002. (следовательно, определение версии jacoco не требуется, если вы собираетесь использовать версию по умолчанию)
Таким образом, основные шаги для получения jacoco
покрытии jacoco
с плагином Android Gradle:
- Плагин Android Gradle версии 0.10.0 или выше (обычно в вашем проекте
build.gradle
) - добавьте
testCoverageEnabled true
в тип сборки, который вы хотите (т.е.debug
) - запустите
$ gradlew createDebugCoverageReport
илиgradlew connectedCheck
чтобы получитьjacoco
покрытииjacoco
.
Вы можете найти свой отчет о покрытии в build/reports/coverage/{buildType}
. (т.е. build/reports/coverage/debug
для отладочной сборки)
(Добавьте случай с несколькими вкусами из комментария @odiggity)
Если ваш проект использует конфигурацию с несколькими create{flavorName}CoverageReport
, используйте вместо этого create{flavorName}CoverageReport
. Отчет о покрытии будет сгенерирован в build/reports/coverage/{flavorName}/{buildType}
.
Пример для аромата krInternal с отладочным типом сборки:
- Команда:
./gradlew createKrInternalDebugCoverageReport
- Отчет генерируется по адресу:
build/reports/coverage/krInternal/debug
Совет:
Поскольку вы можете получить отчет о покрытии только с emulator
и device with root permission
, вы получите следующую ошибку после запуска команды на обычном (не device with root permission
) устройстве:
05:48:33 E/Device: Error during Sync: Permission denied
java.io.IOException: com.android.ddmlib.SyncException: Permission denied
at com.android.builder.testing.ConnectedDevice.pullFile(ConnectedDevice.java:114)
at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:158)
at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:42)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:695)
Caused by: com.android.ddmlib.SyncException: Permission denied
at com.android.ddmlib.SyncService.doPullFile(SyncService.java:511)
at com.android.ddmlib.SyncService.pullFile(SyncService.java:320)
at com.android.ddmlib.Device.pullFile(Device.java:849)
at com.android.builder.testing.ConnectedDevice.pullFile(ConnectedDevice.java:107)
... 10 more
:myDirections:connectedAndroidTest FAILED
FAILURE: Build failed with an exception.
Сценарий сборки Travis-CI для получения покрытия кода
Включить этот блок в build.gradle для всех модулей (библиотека, пример и т.д.)
android {
lintOptions {
abortOnError false
}
}
Ниже .travis-ci.yml
файл .travis-ci.yml
language: android
jdk: oraclejdk8
sudo: required
android:
components:
# Uncomment the lines below if you want to
# use the latest revision of Android SDK Tools
- tools
- platform-tools
# The BuildTools version used by your project
- build-tools-28.0.3
# The SDK version used to compile your project
- android-28
- android-22
- add-on
# Additional components
- extra-google-google_play_services
- extra-android-support
- extra-google-m2repository
- extra-android-m2repository
# Specify at least one system image,
# if you need to run emulator(s) during your tests
- sys-img-armeabi-v7a-android-22
licenses:
- 'android-sdk-preview-license-52d11cd2'
- 'android-sdk-license-.+'
- 'google-gdk-license-.+'
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
cache:
directories:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
- $HOME/.android/build-cache
before_install:
- yes | sdkmanager "build-tools;28.0.3"
before_script:
- echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a -c 100M
- emulator -avd test -no-audio -no-window &
- android-wait-for-emulator
- sleep 180
- adb devices
- adb shell input keyevent 82 &
script:
- ./gradlew build connectedCheck
after_success:
- bash <(curl -s https://codecov.io/bash)