studio - robolectric android example
Proyecto Android con Robolectric y Gradle(estudio Android) (6)
Es poco probable que funcione de inmediato, ya que src / test no se usa automáticamente. Tendrá que crear una tarea de prueba automáticamente que compila estos conjuntos de origen, establece las dependencias correctas y ejecutarlo.
Tenemos la intención de apoyar esto en el futuro, pero ahora mismo debe hacer esto manualmente.
Intento usar Robolectric en una compilación de proyecto con gradle dentro del nuevo Ide para android: estudio de Android, pero me enfrenta un problema extraño, he importado correctamente todas las bibliotecas y he creado la carpeta "prueba" dentro de "src" ", el hecho es que cada vez que ejecuto las pruebas el ide sigue diciendo" Class not found: "com.example.myandroidproject.test" ¿Qué estoy haciendo mal? Necesito cambiar algo en gradle.build? aquí está mi directorio estructura:
Probé todas las soluciones presentadas aquí y todas carecen de algo (la versión del complemento gradle / gradle no es compatible, el proyecto de biblioteca no es compatible, no hay integración con el estudio de Android, etc.). Puede no ser cierto en el futuro, pero lo es hoy.
La mejor forma que encontré es configurar las pruebas de la unidad por ti mismo. Necesitará agregar algunas líneas de configuración a su archivo build.gradle. Las explicaciones se encuentran en el siguiente artículo: http://tryge.com/2013/02/28/android-gradle-build/ . Como no soy el autor, no creo que pueda copiar el contenido aquí directamente.
Además de ese artículo, si quieres configurar Android Studio para ver la carpeta de prueba de la unidad como carpeta de origen (autocompletado y demás), puedes aplicar el siguiente pequeño truco sucio y dejar que el IDE piense que las pruebas de la unidad se encuentran en la prueba de instrumentación. carpeta. Por supuesto, interferirá con las pruebas de instrumentación reales, por lo que solo funciona si no tiene ninguna de esas.
build.gradle
// the unit test source set as described in the article
sourceSets {
unitTest {
java.srcDir file(''src/test/java'')
resources.srcDir file(''src/test/resources'')
}
}
android {
// tell Android studio that the instrumentTest source set is located in the unit test source set
sourceSets {
instrumentTest.setRoot(''src/test'')
}
}
dependencies {
// your unit test dependencies as described in the article
unitTestCompile files("$project.buildDir/classes/release")
unitTestCompile ''junit:junit:4.11''
unitTestCompile ''com.google.android:android:4.1.1.4''
unitTestCompile ''org.robolectric:robolectric:2.1.1''
// duplicate these dependencies in the instrumentTestCompile scope
// in order to have the integration in Android Studio (autocompletion and stuff)
instrumentTestCompile ''junit:junit:4.11''
instrumentTestCompile ''org.robolectric:robolectric:2.1.1''
}
// the rest of the config as described in the article
Probado con Android Studio 0.2.6 y Android gradle plugin 0.5.
He probado muchos escenarios (como http://tryge.com/2013/02/28/android-gradle-build/ y http://www.peterfriese.de/android-testing-with-robolectric/ ) pero solo la solución proporcionada por el equipo Robolectric funcionó para mí. La configuración usa pruebas instrumentadas y roboeléctricas en un proyecto de Android con gradle como sistema de compilación.
Ver http://robolectric.org/getting_started/ y las fuentes en https://github.com/robolectric/deckard-gradle
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath ''com.android.tools.build:gradle:0.9.2''
classpath ''org.robolectric.gradle:gradle-android-test-plugin:0.9.4''
}
}
allprojects {
repositories {
mavenCentral()
}
}
apply plugin: ''android''
apply plugin: ''android-test''
android {
packagingOptions {
exclude ''LICENSE.txt''
exclude ''META-INF/LICENSE''
exclude ''META-INF/LICENSE.txt''
exclude ''META-INF/NOTICE''
}
compileSdkVersion 19
buildToolsVersion "19.0.3"
defaultConfig {
minSdkVersion 18
targetSdkVersion 18
versionCode 2
versionName "1.0.0-SNAPSHOT"
testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
}
buildTypes {
release {
runProguard false
}
}
sourceSets {
main {
manifest.srcFile ''AndroidManifest.xml''
res.srcDirs = [''res'']
}
androidTest {
setRoot(''src/test'')
}
}
}
androidTest {
include ''**/*Test.class''
exclude ''**/espresso/**/*.class''
}
dependencies {
repositories {
mavenCentral()
maven {
url ''https://oss.sonatype.org/content/repositories/snapshots/''
}
}
// Espresso
androidTestCompile files(''lib/espresso-1.1.jar'', ''lib/testrunner-1.1.jar'', ''lib/testrunner-runtime-1.1.jar'')
androidTestCompile ''com.google.guava:guava:14.0.1'',
''com.squareup.dagger:dagger:1.1.0'',
''org.hamcrest:hamcrest-integration:1.1'',
''org.hamcrest:hamcrest-core:1.1'',
''org.hamcrest:hamcrest-library:1.1''
androidTestCompile(''junit:junit:4.11'') {
exclude module: ''hamcrest-core''
}
androidTestCompile(''org.robolectric:robolectric:2.3-SNAPSHOT'') {
exclude module: ''classworlds''
exclude module: ''maven-artifact''
exclude module: ''maven-artifact-manager''
exclude module: ''maven-error-diagnostics''
exclude module: ''maven-model''
exclude module: ''maven-plugin-registry''
exclude module: ''maven-profile''
exclude module: ''maven-project''
exclude module: ''maven-settings''
exclude module: ''nekohtml''
exclude module: ''plexus-container-default''
exclude module: ''plexus-interpolation''
exclude module: ''plexus-utils''
exclude module: ''wagon-file''
exclude module: ''wagon-http-lightweight''
exclude module: ''wagon-http-shared''
exclude module: ''wagon-provider-api''
}
androidTestCompile ''com.squareup:fest-android:1.0.+''
}
apply plugin: ''idea''
idea {
module {
testOutputDir = file(''build/test-classes/debug'')
}
}
Intenté diferentes appraoaches para combinar android studio y robolectric & espresso. Terminé con este ejemplo de configuración de proyecto https://github.com/nenick/android-gradle-template
Aquí alguna explicación para los diferentes enfoques:
módulo de aplicación + espresso + roboeléctrico
Hay un ejemplo de https://github.com/robolectric/deckard-gradle soportado por mantenedores roboeléctricos. Esto se basa en el complemento https://github.com/robolectric/gradle-android-test-plugin . Pero esto tiene un inconveniente con la contaminación de dependencias informada en https://github.com/robolectric/gradle-android-test-plugin/issues/17, que da como resultado pruebas lentas de esspresso que compilan el tiempo y el tiempo de ejecución.
build.gradle snippet que combina todo
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath ''com.android.tools.build:gradle:0.10.+''
classpath ''org.robolectric.gradle:gradle-android-test-plugin:0.10.+''
}
}
apply plugin: ''android''
apply plugin: ''android-test''
android {
defaultConfig {
testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
}
}
androidTest {
include ''**/*Test.class''
exclude ''**/espresso/**/*.class''
}
dependencies {
androidTestCompile(''junit:junit:4.11'')
androidTestCompile(''org.robolectric:robolectric:2.3-SNAPSHOT'')
androidTestCompile ''com.jakewharton.espresso:espresso:1.1-r2''
}
café espresso separado
Un ejemplo se muestra en https://github.com/stephanenicolas/Quality-Tools-for-Android pero está muy desactualizado y también presenta algunos inconvenientes. Se volverá a compilar y hace que el estudio de Android se comporte de manera extraña. Marca las fuentes del módulo de la aplicación como (fuente raíz) del módulo de prueba del expreso. Eso funciona pero no es intuitivo.
fragmento de build.gradle para módulo expreso
dependencies {
androidTestCompile ''com.jakewharton.espresso:espresso:1.1-r2''
}
android {
sourceSets {
main {
manifest.srcFile ''../AndroidSample/AndroidManifest.xml''
java.srcDirs += [''../AndroidSample/src/main/java'']
resources.srcDirs = [''../AndroidSample/res'']
res.srcDirs = [''../AndroidSample/res'']
}
}
defaultConfig {
testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
}
}
Spereate Robolectric
Existe un complemento https://github.com/novoda/gradle-android-test-plugin que nos permite poner pruebas roboeléctricas en un paquete sperate. La configuración de este proyecto me funciona genial:
- MyProject
|- app (with espresso tests)
|- - build.gradle (app)
|- robolectric (unit tests)
|- - build.gradle (robo)
fragmento de build.gradle (app + espresso)
dependencies {
androidTestCompile ''com.jakewharton.espresso:espresso:1.1-r2''
}
android {
defaultConfig {
testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
}
}
fragmento de build.gradle (robo)
buildscript {
repositories {
mavenCentral()
maven { url ''https://oss.sonatype.org/content/repositories/snapshots/'' }
}
dependencies {
classpath ''com.android.tools.build:gradle:0.9.+''
classpath "com.novoda:gradle-android-test-plugin:0.9.8-SNAPSHOT"
}
}
android {
projectUnderTest '':AndroidSample''
}
apply plugin: ''java''
apply plugin: ''android-test''
dependencies {
testCompile ''junit:junit:4.11''
testCompile ''org.mockito:mockito-core:1.9.5''
testCompile ''com.squareup:fest-android:1.0.+'')
testCompile (''org.robolectric:robolectric:2.3-SNAPSHOT'')
}
Hay una trampa cuando intenta configurar este proyecto, así que simplemente comience con un ejemplo de trabajo: https://github.com/nenick/android-gradle-template
El complemento Gradle Android Unit Testing es la mejor opción para mí.
Desarrollado por Jake Wharton, supongo que será el próximo estándar (tal vez hasta que Google publique un soporte inmediato para Robolectric en Android Studio).
Puede importar la biblioteca agregando en su archivo build.gradle
:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath ''com.android.tools.build:gradle:0.X.+''
classpath ''com.squareup.gradle:gradle-android-test-plugin:0.9.+''
}
}
...
apply plugin: ''android-test''
...
dependencies {
testCompile ''junit:junit:4.10''
testCompile ''org.robolectric:robolectric:2.1.+''
testCompile ''com.squareup:fest-android:1.0.+''
}
Actualización: esta biblioteca ha quedado obsoleta desde la versión 0.8 del complemento gradle
@ Aldo Borrero, finalmente parece que alguien ha encontrado la forma de probar proyectos de Android en "Android Studio" usando Robolectric y Gradle. Por favor, eche un vistazo a esta respuesta Robolectric con Gradle
Actualización: Los chicos de Square han lanzado un complemento para hacer que Robolectric funcione de forma original con Gradle y Android Studio, esta característica se integrará con Robolectric en v2, mientras tanto puedes obtener el complemento aquí: Gradle Android test Plugin