studio - unit test android
Cómo ejecutar pruebas unitarias con Android Studio (5)
Estoy usando el plugin de pruebas de unidad de Android de Jake para gradle: https://github.com/JakeWharton/gradle-android-test-plugin
Mi build.gradle se ve así:
dependencies {
// analytics
compile(''com.crittercism:crittercism-android:3.0.11'')
// retrofit
compile(''com.squareup.retrofit:retrofit:1.2.2'')
compile(''com.squareup.okhttp:okhttp:1.2.1'')
// dagger
compile(''com.squareup.dagger:dagger:1.1.0'')
compile(''com.squareup.dagger:dagger-compiler:1.1.0'')
// compatibility
compile(''android.compatibility:android-support:v4-r13'')
compile(''com.actionbarsherlock:actionbarsherlock:4.4.0@aar'')
// Picasso
compile(''com.squareup.picasso:picasso:2.1.1'')
// Otto
compile(''com.squareup:otto:1.3.4'')
// Tests
testCompile ''junit:junit:4.10''
testCompile ''org.robolectric:robolectric:2.2''
testCompile ''org.powermock:powermock-api-mockito:1.5.1''
testCompile ''org.easytesting:fest-assert-core:2.0M10''
}
Lamentablemente, no puedo ejecutar todas las pruebas de unidad o unidades específicas de Android Studio. Me sale un error:
Exception in thread "main" java.lang.NoClassDefFoundError: junit/textui/ResultPrinter
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:171)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:113)
Caused by: java.lang.ClassNotFoundException: junit.textui.ResultPrinter
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 3 more
Y esto es correcto porque ejecutar la línea de comando no incluye mi dependencia JUnit:
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java -ea -Didea.launcher.port=7533 "-Didea.launcher.bin.path=/Applications/Android Studio.app/bin" -Dfile.encoding=UTF-8 -classpath "/Applications/Android Studio.app/lib/idea_rt.jar:/Applications/Android Studio.app/plugins/junit/lib/junit-rt.jar:/Users/eugen/Development/SDK/android-sdk-macosx/platforms/android-18/android.jar:/Users/eugen/Development/SDK/android-sdk-macosx/platforms/android-18/data/res:/Users/eugen/Development/SDK/android-sdk-macosx/tools/support/annotations.jar:/Users/eugen/Development/Projects/eBuddy/xms/android/xms3-android/build/classes/alpha/debug:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.retrofit/retrofit/1.2.2/jar/cdf7b60568092fbcc7a254371c345e92f733c03c/retrofit-1.2.2.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.google.code.gson/gson/2.2.4/jar/a60a5e993c98c864010053cb901b7eab25306568/gson-2.2.4.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.okhttp/okhttp/1.2.1/jar/c3562574496bb4d452d6fc45b817577e98d08afe/okhttp-1.2.1.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup/javawriter/2.1.1/jar/67ff45d9ae02e583d0f9b3432a5ebbe05c30c966/javawriter-2.1.1.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.dagger/dagger/1.1.0/jar/49f2061c938987c8e56679a731d74fd8448d8742/dagger-1.1.0.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.picasso/picasso/2.1.1/jar/ab19bfb23f641f189b6dca9a4d393f8dc291103a/picasso-2.1.1.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup/otto/1.3.4/jar/4d72fb811c7b3c0e7f412112020d4430f044e510/otto-1.3.4.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.dagger/dagger-compiler/1.1.0/jar/ddb38c2be31deeb7a001177f7c358665e350d646/dagger-compiler-1.1.0.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/javax.inject/javax.inject/1/jar/6975da39a7040257bd51d21a231b76c915872d38/javax.inject-1.jar:/Users/eugen/Development/Projects/eBuddy/xms/android/xms3-android/build/exploded-bundles/ComActionbarsherlockActionbarsherlock440.aar/res:/Users/eugen/Development/Projects/eBuddy/xms/android/xms3-android/build/exploded-bundles/ComActionbarsherlockActionbarsherlock440.aar/classes.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.okhttp/okhttp-protocols/1.2.1/jar/ec2beaefef3bd4f680c17fad8e72e66f2a006f1/okhttp-protocols-1.2.1.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.crittercism/crittercism-android/3.0.11/jar/e30c21ae491d780622ecaee2752969be98140c3/crittercism-android-3.0.11.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/android.compatibility/android-support/v4-r13/jar/bd6479f5dd592790607e0504e66e0f31c2b4d308/android-support-v4-r13.jar" com.intellij.rt.execution.application.AppMain com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 @/private/var/folders/wq/knhztnf105v2_p1t580tj8h80000gp/T/idea_junit701450667388095664.tmp @w@/private/var/folders/wq/knhztnf105v2_p1t580tj8h80000gp/T/idea_working_dirs_junit4927192380605663413.tmp -socket63849
Me pregunto si alguien pudo ejecutar pruebas unitarias en Android Studio. Y si es posible, ¿cómo hacerlo?
Me encontré con este problema y encontré una solución: incluya classes.jar del paquete explosionado (.aar) en la carpeta de compilación. Sin embargo, no creo que ayude a encontrar recursos en dependencias .aar.
testCompile fileTree(dir: "$project.buildDir/exploded-bundles", include: "**/classes.jar")
Editar: Desde las herramientas de construcción Gradle de Android 0.9.0, la dependencia ha cambiado a:
androidTestCompile fileTree(dir: "$project.buildDir/exploded-aar", include: "**/classes.jar")
Edición 2: desde las herramientas de construcción de Android Gradle 0.10.0, la dependencia ha cambiado a:
androidTestCompile fileTree(dir: "$project.buildDir/../../build/exploded-aar", include: "**/classes.jar")
Nota: la ruta relativa puede ser diferente dependiendo de la estructura de su proyecto.
Tuve un problema similar con AS 1.2.2.
Seguí los pasos here . Básicamente:
- Se abrió la ventana de herramientas "Construir variantes" (ver imagen en el enlace) y se cambió el menú desplegable "Prueba de artefacto" a "Pruebas unitarias".
- Cree un directorio para su código fuente de prueba, es decir,
src/test/java
, y mueva su prueba al paquete respectivo allí. Asegúrese de que las siguientes secciones de su archivo
build.gradle
contengan estos:dependencies { testCompile ''junit:junit:4.12'' } android { sourceSets { test { resources { srcDir "test" } } } }
Voila! Haga clic derecho en su caso de prueba y seleccione el sabor JUnit.
Por cierto, parece alternar la visibilidad de las pruebas JUnit / Android cuando cambias la herramienta "Construir variantes", así que supongo que puedes probar como JUnit o Android pero no ambas al mismo tiempo.
simplemente agregue la carpeta llamada instrumentTest en / src, debería tener / java adentro así
luego amplíe la clase ActivityTestCase (o cualquier otra unidad de prueba android), como
package com.example.app.test;
import android.test.ActivityTestCase;
import junit.framework.Assert;
public class MainActivityTest extends ActivityTestCase {
public void testHappy(){
Assert.assertTrue(true);
}
}
Haga clic derecho en el directorio verde de java y seleccione ejecutar todas las pruebas y debe obtener esto:
buena suerte
Actualización para AS 1.1+, Android gradle plugin 1.1+
Finalmente es posible sin muchos trucos. Aquí hay un ejemplo de proyecto que muestra cómo configurar la prueba de Robolectric
en Android Studio v1.1+
y en el android gradle plugin v1.1+
: https://github.com/nenick/AndroidStudioAndRobolectric
También puede encontrar posibles problemas y soluciones. Sí, Robolectric
es complejo y Google no lo admite oficialmente, por lo que todavía tiene algunos problemas. Pero la mayoría de las veces funciona y aporta un gran valor a su proyecto.
También te animo a que comiences a usar Robolectric v3+
. Está casi liberado y es lo suficientemente estable.
Respuesta anterior para AS 0.x y 1.0x y la versión de Android Gradle Plugin debajo 1.1
Logré hacerlo con ayuda de amigos.
Entonces, básicamente, necesitas hacer los siguientes cambios para ejecutar las pruebas de la unidad Robolectric en Android Studio:
- Copie su classpath para la prueba (puede encontrarlo como primera línea en el registro "Ejecutar")
- Configuración de ejecución abierta para las pruebas de su unidad
- Cambia el directorio de trabajo a la carpeta donde está presente AndroidManifest.xml
- Agregue la opción VM
-classpath "<path_to_project_folder>/build/test-classes:<path_to_gradle_cache>/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar:<your old classpath>"
En cuanto a mí, el comienzo de un nuevo classpath se ve así:
/Users/emartynov/Development/Projects/work/android.project/build/test-classes:/Users/emartynov/.gradle/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar
Problemas:
- Puede ejecutar la prueba solo para la variante de depuración
- Cada nueva configuración de ejecución de prueba requiere tales cambios manuales. Pero esto es simplemente copiar / pegar de dos campos de edición
Tengo la versión de Android Studio 0.6. Aquí está otra vez parte de mi archivo build.gradle
:
buildscript {
repositories {
mavenCentral()
maven { url ''https://github.com/rockerhieu/mvn-repo/raw/master/'' }
}
dependencies {
classpath ''com.android.tools.build:gradle:0.11.+''
classpath ''com.neenbedankt.gradle.plugins:android-apt:1.3''
// classpath ''org.robolectric.gradle:gradle-android-test-plugin:0.10.1''
classpath ''org.robolectric.gradle:gradle-android-test-plugin:0.10.1-SNAPSHOT''
classpath ''com.jakewharton.sdkmanager:gradle-plugin:0.10.+''
}
}
apply plugin: ''android-sdk-manager''
apply plugin: ''android''
apply plugin: ''android-apt''
apply plugin: ''android-test''
repositories {
mavenCentral()
}
android {
compileSdkVersion 19
buildToolsVersion "19.1.0"
packagingOptions {
exclude ''META-INF/NOTICE''
exclude ''META-INF/NOTICE.txt''
exclude ''META-INF/notice.txt''
exclude ''META-INF/LICENSE''
exclude ''META-INF/LICENSE.txt''
exclude ''META-INF/license.txt''
exclude ''META-INF/ASL2.0''
exclude ''LICENSE.txt''
}
defaultConfig {
minSdkVersion 14
targetSdkVersion 19
versionCode 1
versionName "0.9.0"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
sourceSets {
androidTest.setRoot( ''src/test'' )
}
}
dependencies {
// butter knife
compile ''com.jakewharton:butterknife:5.0.0''
// dagger
compile ''com.squareup.dagger:dagger:1.2.1''
// apt
apt ''com.squareup.dagger:dagger-compiler:1.+''
// AS tests
androidTestCompile ''junit:junit:4.+''
androidTestCompile( ''org.robolectric:robolectric:2.3'' ) {
exclude group: ''commons-logging''
exclude group: ''org.apache.httpcomponents''
}
androidTestCompile ''com.squareup:fest-android:1.+''
androidTestCompile ''org.mockito:mockito-all:1.9.+''
androidTestCompile ''org.easytesting:fest-assert-core:2.0M10''
androidTestCompile( ''org.skyscreamer:jsonassert:1.2.+'' ) {
exclude group: ''org.json''
}
// tests
testCompile ''junit:junit:4.+''
testCompile( ''org.robolectric:robolectric:2.3'' ) {
exclude group: ''commons-logging''
exclude group: ''org.apache.httpcomponents''
}
testCompile ''com.squareup:fest-android:1.+''
testCompile ''org.mockito:mockito-all:1.9.+''
testCompile ''org.easytesting:fest-assert-core:2.0M10''
testCompile ''com.squareup.dagger:dagger-compiler:1.+''
testCompile( ''org.skyscreamer:jsonassert:1.2.+'' ) {
exclude group: ''org.json''
}
}