Pull to refresh

Настройка Gradle в Android приложении с JUnit 4.1+

Задача — использовать JUnit фреймворк версии 4.1 и выше для тестирования бизнесс-логики Android приложения, применяя Gradle. На первый взгляд тривиальная задача может принести массу проблем при конфигурации тестовой среды.

Дано:


В Сети много примеров как все это использовать, но ни одно из решений и их комбинации не привели к положительному результату, а лишь пополняли зоопарк ошибок.

Настройка


Ключ к успеху лежит в правильной конфигурации 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.

Уверен есть более оптимальные способы решения задачи, но может кому-нибудь это будет полезным.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.