Задача — использовать JUnit фреймворк версии 4.1 и выше для тестирования бизнесс-логики Android приложения, применяя Gradle. На первый взгляд тривиальная задача может принести массу проблем при конфигурации тестовой среды.
Дано:
В Сети много примеров как все это использовать, но ни одно из решений и их комбинации не привели к положительному результату, а лишь пополняли зоопарк ошибок.
Ключ к успеху лежит в правильной конфигурации
Добавляем плагин облегчающий работу с Gradle в секцию dependencies.
Затем помечаем директорию src/test как папку для тестов. В Android Studio начиная с версии 0.3.X убрали возможность делать это из интерфейса.
Активируем плагин
Расставляем зависимости. В нашем случае минимальный набор — JUnit и Mockito. Тут нас ждет несколько тонкостей. Во-первых важен порядок, в котором добавлены записи. Во-вторых нужно выкинуть библиотеку Hamcrest из зависимостей JUnit и Mockito.
Конфигурируем логгер:
В итоге файл может выглядеть следующим образом. Последовательность секций также важна:
Переходим в корневую папку проекта и можем использовать команды
Чтобы использовать proxy при обновлении зависимостей можно использовать стандартный приём:
Результаты тестов можно увидеть как в консоли, так и в сгенерированных отчетах:
Уверен есть более оптимальные способы решения задачи, но может кому-нибудь это будет полезным.
Дано:
- Android Studio 0.3.6
- Gradle
- JUnit 4.8
- Плагин android-unit-test для удобства
- Проект
В Сети много примеров как все это использовать, но ни одно из решений и их комбинации не привели к положительному результату, а лишь пополняли зоопарк ошибок.
Настройка
Ключ к успеху лежит в правильной конфигурации
build.gradle
файла.Добавляем плагин облегчающий работу с Gradle в секцию dependencies.
buildscript {
...
dependencies {
classpath 'com.android.tools.build:gradle:0.6.+'
classpath 'com.github.jcandksolutions.gradle:android-unit-test:1.0.+'
}
}
Затем помечаем директорию src/test как папку для тестов. В Android Studio начиная с версии 0.3.X убрали возможность делать это из интерфейса.
android {
...
sourceSets {
instrumentTest.setRoot('src/test')
}
}
Активируем плагин
apply plugin: 'android-unit-test'
Расставляем зависимости. В нашем случае минимальный набор — JUnit и Mockito. Тут нас ждет несколько тонкостей. Во-первых важен порядок, в котором добавлены записи. Во-вторых нужно выкинуть библиотеку Hamcrest из зависимостей JUnit и Mockito.
dependencies {
compile ('junit:junit:4.8.+') {
exclude group: 'org.hamcrest' //by artifact name
}
compile 'com.android.support:appcompat-v7:+'
compile 'com.android.support:support-v4:13.0.+'
compile project(':libraries:wit-android-sdk:wit.sdk')
instrumentTestCompile ('org.mockito:mockito-core:1.9.0') {
exclude group: 'org.hamcrest'
}
}
Конфигурируем логгер:
tasks.withType(Test) {
testLogging {
events 'started', 'passed'
}
}
В итоге файл может выглядеть следующим образом. Последовательность секций также важна:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.6.+'
//adding test plugin as dependence
classpath 'com.github.jcandksolutions.gradle:android-unit-test:1.0.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
}
android {
compileSdkVersion 17
buildToolsVersion '18.1.1'
defaultConfig {
minSdkVersion 15
targetSdkVersion 17
}
//setting the test source folder
sourceSets {
instrumentTest.setRoot('src/test')
}
}
//including the plugin
apply plugin: 'android-unit-test'
dependencies {
//setting a junit dependence for the whole project at the top
//exclude the hamcrest lib!
compile ('junit:junit:4.8.+') {
exclude group: 'org.hamcrest' //by artifact name
}
compile 'com.android.support:appcompat-v7:+'
compile 'com.android.support:support-v4:13.0.+'
compile project(':libraries:custom-lib:custom.sdk')
//setting additional testing libraries
//exclude the hamcrest lib!
instrumentTestCompile ('org.mockito:mockito-core:1.9.0') {
exclude group: 'org.hamcrest' //by artifact name
}
instrumentTestCompile 'org.robolectric:robolectric:2.1.+'
instrumentTestCompile 'com.jayway.android.robotium:robotium-solo:4.2'
}
//setting up test logging events
tasks.withType(Test) {
testLogging {
events 'started', 'passed'
}
}
Запуск
Переходим в корневую папку проекта и можем использовать команды
./gradlew clean
— очищает кэш Gradle../gradlew test
— собирает и запускает тесты из папки src/test../gradlew assembleTest
— собирает тесты.Чтобы использовать proxy при обновлении зависимостей можно использовать стандартный приём:
./gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8080 clean
Просмотр результатов
Результаты тестов можно увидеть как в консоли, так и в сгенерированных отчетах:
.../build/test-report/debug/index.html
.Уверен есть более оптимальные способы решения задачи, но может кому-нибудь это будет полезным.