Android, Gradle. Как создать приложение и запустить тесты из тестового приложения
У меня есть проект проекта андроида и андроида, внутри которого находятся тесты папок. Структура этого проекта - eclipse, например
+ - ЦСИ
| - res
| - libs
| - тесты
|.....
Я использую gradle. Все, что я хочу, - это создание приложения, запуск модульных тестов и получение отчетов о них. Но я не понимаю, как это сделать правильно. Я создал файл build.gradle в корневой папке
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android'
android {
compileSdkVersion 18
buildToolsVersion "18.1.1"
defaultConfig {
minSdkVersion 8
targetSdkVersion 18
testPackageName "ua.cooperok.stringcalc.tests"
testInstrumentationRunner "android.test.InstrumentationTestRunner"
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
unitTest {
java.srcDir file('tests/src')
resources.srcDir file('tests/res')
}
}
configurations {
unitTestCompile.extendsFrom runtime
unitTestRuntime.extendsFrom unitTestCompile
}
dependencies {
unitTestCompile files("$project.buildDir/classes/release")
}
task unitTest(type:Test){
description = "Run unit tests..."
testClassesDir = android.sourceSets.unitTest.output.classesDir
classpath = android.sourceSets.unitTest.runtimeClasspath
}
build.dependsOn unitTest
}
Но когда я запустил gradle build, я получил ошибку
Не удалось найти свойство 'output' на исходном наборе unit test.
Кроме того, как я понимаю, для получения отчетов мне нужно применить плагин "android-reporting", но когда я это сделаю, я получил ошибку
Невозможно добавить расширение с именем "android", так как есть расширение, уже зарегистрированное с этим именем.
Должен ли я сделать это так, или я должен создать новый файл gradle.build в моем проекте тестового приложения?
UPDATE
Я исправил ошибку с выходом и сделал конструкцию gradle успешной, но я не понимаю, что происходит. Я намеренно провалил свой тест, но gradle build все еще успешно.
Что я сделал:
1. Я переместил задачу unitTest из секции android в root, после чего мой тестовый проект начал компилироваться, но есть ошибка "packackage android.test not found"
2. Чтобы исправить эту ошибку, я добавил к пути к траектории пути к источникам Android, поэтому после этого сборка gradle была успешной, но, действительно, я не понимаю, почему она всегда успешна, даже когда тест терпит неудачу.
И все же я не понимаю, как получать отчеты из теста
Это мой новый файл build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.6+'
}
}
apply plugin: 'android'
android {
compileSdkVersion 18
buildToolsVersion "18.1.1"
defaultConfig {
minSdkVersion 8
targetSdkVersion 18
testPackageName "ua.cooperok.stringcalc.tests"
testInstrumentationRunner "android.test.InstrumentationTestRunner"
}
sourceSets {
main {
manifest.srcFile file('AndroidManifest.xml')
java.srcDirs = ['src']
resources.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
}
sourceSets {
unitTest {
java.srcDirs = ['tests/src']
resources.srcDirs = ['tests/src']
}
}
configurations {
unitTestCompile.extendsFrom runtime
unitTestRuntime.extendsFrom unitTestCompile
}
dependencies {
unitTestCompile files("$project.buildDir/classes/release")
unitTestCompile 'junit:junit:4.11'
compile fileTree(dir: 'libs', include: '*.jar')
}
task unitTest(type:Test, dependsOn: assemble) {
description = "run unit tests"
testClassesDir = sourceSets.unitTest.output.classesDir
classpath = files("$System.env.ANDROID_HOME/sources/android-18")
//actualy I didn't get any report
getReports().getJunitXml().setOutputPerTestCase(true)
}
build.dependsOn unitTest
Ответы
Ответ 1
Я нашел решение. Я был разочарован несколькими темами и подумал, что мне нужно создать отдельную задачу для модульных тестов. На самом деле это было просто.
Я не менял свою структуру проекта, просто build.gradle file. Чтобы создать приложение, выполните следующие действия:
gradle чистая сборка connectCheck
connectedCheck запускает модульные тесты из моего тестового проекта, и если какой-то тест завершился неудачно - сборка gradle тоже не удастся
Здесь окончательная версия
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.6+'
}
}
apply plugin: 'android'
android {
compileSdkVersion 18
buildToolsVersion "18.1.1"
defaultConfig {
minSdkVersion 8
targetSdkVersion 18
testPackageName "ua.cooperok.stringcalc.tests"
testInstrumentationRunner "android.test.InstrumentationTestRunner"
}
sourceSets {
main {
manifest.srcFile file('AndroidManifest.xml')
java.srcDirs = ['src']
resources.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
instrumentTest {
java.srcDirs = ['tests/src']
manifest.srcFile file('tests/AndroidManifest.xml')
resources.srcDirs = ['tests/src']
res.srcDirs = ['tests/res']
assets.srcDirs = ['tests/assets']
}
}
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
//Signing apk
if(project.hasProperty("signingPropertiesPath")) {
File propsFile = new File(System.getenv('HOME') + "/" + project.property("signingPropertiesPath"))
if(propsFile.exists()) {
Properties props = new Properties()
props.load(new FileInputStream(propsFile))
//loading keystore properties
signingConfigs {
release {
storeFile file(propsFile.getParent() + "/" + props['keystore'])
storePassword props['keystore.password']
keyAlias props['keyAlias']
keyPassword props['keyPassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
}
}