sirve - Ejecutar pruebas simples JUnit en Android Studio(IntelliJ) cuando se utiliza una configuraciĆ³n basada en Gradle
importar proyecto android studio (6)
Estoy usando Android Studio/IntelliJ
para construir sobre un proyecto Android
existente y me gustaría agregar algunas pruebas simples de unidad JUnit
. ¿Cuál es la carpeta correcta para agregar tales pruebas?
El Gradle
android Gradle
define una estructura de directorio con src/main/java
para el código fuente principal y src/instrumentTest/java
para Android
pruebas de Android
.
Intentar agregar mis pruebas JUnit en instrumentTest no funcionó para mí. Puedo ejecutarlo como una prueba de Android
(eso es lo que parece ese directorio) pero eso no es lo que estoy buscando, solo quiero ejecutar una prueba de JUnit
simple. Traté de crear una configuración de ejecución JUnit para esta clase, pero tampoco funcionó; supongo que porque estoy usando un directorio marcado como Android
Test en lugar de Source.
Si creo una nueva carpeta de origen y la marco como tal en la Estructura del proyecto, esta se borrará la próxima vez que IntelliJ
actualice la configuración del proyecto desde los archivos de compilación gradle.
¿Cuál es la forma más adecuada de configurar las pruebas JUnit en un proyecto de android basado en gradle en IntelliJ
? ¿Qué estructura de directorio usar para esto?
Introducción
Tenga en cuenta que en el momento de escribir robolectric 2.4 es la última versión y no tiene soporte para la biblioteca appcompat v7
. Se agregará soporte en la versión Robolectric 3.0 ( sin ETA aún ). También ActionBar Sherlock
puede causar problemas con robolectric.
Para utilizar Robolectric en Android Studio tiene 2 opciones:
(Opción 1) - Ejecutar pruebas JUnit con Android Studio utilizando un módulo Java
Esta técnica utiliza un módulo java para todas tus pruebas con una dependencia de tu módulo Android y un corredor de pruebas personalizado con algo de magia:
Las instrucciones se pueden encontrar aquí: http://blog.blundellapps.com/how-to-run-robolectric-junit-tests-in-android-studio/
También verifique el enlace al final de esa publicación para ejecutar las pruebas desde el estudio de Android.
(Opción 2) - Ejecutar JUnit Tests con Android Studio usando robolectric-gradle-plugin
Encontré algunos problemas al configurar pruebas junit para ejecutar desde gradle en Android Studio.
Este es un proyecto de muestra muy básico para ejecutar pruebas junit desde un proyecto basado en gradle en Android Studio: https://github.com/hanscappelle/android-studio-junit-robolectric Esto fue probado con Android Studio 0.8.14, JUnit 4.10, Robolectric gradle plugin 0.13+ y robolectric 2.3
Buildscript (project / build.gradle)
El script de construcción es el archivo build.gradle en la raíz de su proyecto. Ahí tuve que agregar el complemento https://github.com/robolectric/robolectric-gradle-plugin a classpath
buildscript {
repositories {
jcenter()
}
dependencies {
classpath ''com.android.tools.build:gradle:0.13.2''
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath ''org.robolectric:robolectric-gradle-plugin:0.13.+''
}
}
allprojects {
repositories {
jcenter()
}
}
Project buildscript (App / build.gradle)
En el script de compilación de su módulo de aplicación, use el complemento robolectric
, agregue la configuración robolectric
y agregue dependencias androidTestCompile
.
apply plugin: ''com.android.application''
apply plugin: ''robolectric''
android {
// like any other project
}
robolectric {
// configure the set of classes for JUnit tests
include ''**/*Test.class''
exclude ''**/espresso/**/*.class''
// configure max heap size of the test JVM
maxHeapSize = ''2048m''
// configure the test JVM arguments
jvmArgs ''-XX:MaxPermSize=512m'', ''-XX:-UseSplitVerifier''
// configure whether failing tests should fail the build
ignoreFailures true
// use afterTest to listen to the test execution results
afterTest { descriptor, result ->
println "Executing test for {$descriptor.name} with result: ${result.resultType}"
}
}
dependencies {
compile fileTree(dir: ''libs'', include: [''*.jar''])
androidTestCompile ''org.robolectric:robolectric:2.3''
androidTestCompile ''junit:junit:4.10''
}
Crear JUnit Test Classes
Ahora ponga las clases de prueba en la ubicación predeterminada (o actualice la configuración de gradle)
app/src/androidTest/java
Y junit.framework.TestCase
nombre a sus clases de prueba que terminen con Prueba (o nuevamente actualice la configuración), extienda junit.framework.TestCase
y anote los métodos de prueba con @Test
.
package be.hcpl.android.mytestedapplication;
import junit.framework.TestCase;
import org.junit.Test;
public class MainActivityTest extends TestCase {
@Test
public void testThatSucceeds(){
// all OK
assert true;
}
@Test
public void testThatFails(){
// all NOK
assert false;
}
}
Ejecutar pruebas
Luego ejecuta las pruebas usando gradlew desde la línea de comandos (hazlo ejecutable usando chmod +x
si es necesario)
./gradlew clean test
Muestra de salida:
Executing test for {testThatSucceeds} with result: SUCCESS
Executing test for {testThatFails} with result: FAILURE
android.hcpl.be.mytestedapplication.MainActivityTest > testThatFails FAILED
java.lang.AssertionError at MainActivityTest.java:21
2 tests completed, 1 failed
There were failing tests. See the report at: file:///Users/hcpl/Development/git/MyTestedApplication/app/build/test-report/debug/index.html
:app:test
BUILD SUCCESSFUL
Solución de problemas
directorios fuente alternativos
Al igual que puede tener los archivos fuente de Java en otro lugar, puede mover sus archivos fuente de prueba. Simplemente actualice la configuración de gradle sourceSets
.
sourceSets {
main {
manifest.srcFile ''AndroidManifest.xml''
java.srcDirs = [''src'']
res.srcDirs = [''res'']
assets.srcDirs = [''assets'']
}
androidTest {
setRoot(''tests'')
}
}
el paquete org.junit no existe
Olvidaste agregar la dependencia de prueba junit en el script de compilación de la aplicación
dependencies {
compile fileTree(dir: ''libs'', include: [''*.jar''])
androidTestCompile ''org.robolectric:robolectric:2.3''
androidTestCompile ''junit:junit:4.10''
}
java.lang.RuntimeException: Stub!
Está ejecutando esta prueba con las configuraciones de ejecución de Android Studio en lugar de la línea de comando (pestaña Terminal en Android Studio). Para ejecutarlo desde Android Studio, deberá actualizar el archivo app.iml
para que la entrada jdk aparezca en la parte inferior. Vea el ejemplo deckard-gradle para más detalles.
Ejemplo de error completo:
!!! JUnit version 3.8 or later expected:
java.lang.RuntimeException: Stub!
at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5)
at junit.textui.TestRunner.<init>(TestRunner.java:54)
at junit.textui.TestRunner.<init>(TestRunner.java:48)
at junit.textui.TestRunner.<init>(TestRunner.java:41)
at com.intellij.rt.execution.junit.JUnitStarter.junitVersionChecks(JUnitStarter.java:190)
at com.intellij.rt.execution.junit.JUnitStarter.canWorkWithJUnitVersion(JUnitStarter.java:173)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:56)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
ERROR: JAVA_HOME está establecido en un directorio no válido
Vea esta pregunta SO para una solución. Agregue la exportación siguiente a su perfil de bash:
export JAVA_HOME=`/usr/libexec/java_home -v 1.7`
El registro de error completo:
ERROR: JAVA_HOME is set to an invalid directory: export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.
Clase de prueba no encontrada
Si quieres ejecutar tus pruebas desde el Android Studio Junit Test Runner, tendrás que expandir un poco más el archivo build.gradle para que android studio pueda encontrar tus clases de prueba compiladas:
sourceSets {
testLocal {
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 {
// Dependencies for the `testLocal` task, make sure to list all your global dependencies here as well
testLocalCompile ''junit:junit:4.11''
testLocalCompile ''com.google.android:android:4.1.1.4''
testLocalCompile ''org.robolectric:robolectric:2.3''
// Android Studio doesn''t recognize the `testLocal` task, so we define the same dependencies as above for instrumentTest
// which is Android Studio''s test task
androidTestCompile ''junit:junit:4.11''
androidTestCompile ''com.google.android:android:4.1.1.4''
androidTestCompile ''org.robolectric:robolectric:2.3''
}
task localTest(type: Test, dependsOn: assemble) {
testClassesDir = sourceSets.testLocal.output.classesDir
android.sourceSets.main.java.srcDirs.each { dir ->
def buildDir = dir.getAbsolutePath().split(''/'')
buildDir = (buildDir[0..(buildDir.length - 4)] + [''build'', ''classes'', ''debug'']).join(''/'')
sourceSets.testLocal.compileClasspath += files(buildDir)
sourceSets.testLocal.runtimeClasspath += files(buildDir)
}
classpath = sourceSets.testLocal.runtimeClasspath
}
check.dependsOn localTest
de: http://kostyay.name/android-studio-robolectric-gradle-getting-work/
Algunos más recursos
Los mejores artículos que encontré alrededor de esto son:
A partir de Android Studio 1.1, la respuesta ahora es simple: http://tools.android.com/tech-docs/unit-testing-support
Esto ahora es compatible con Android Studio, comenzando con Android Gradle plugin 1.1.0, mira esto:
https://developer.android.com/training/testing/unit-testing/local-unit-tests.html
Aplicación de ejemplo con pruebas de unidades locales en GitHub:
https://github.com/googlesamples/android-testing/tree/master/unittesting/BasicSample
Normalmente, no puedes. Bienvenido al mundo de Android, donde todas las pruebas deben ejecutarse en un dispositivo (excepto Robolectric).
La razón principal es que en realidad no tiene las fuentes del marco: incluso si convence al IDE para que ejecute la prueba localmente, obtendrá inmediatamente una excepción "Stub! No implementado". "¿Por qué?" te preguntarás? Porque el android.jar
que te da el SDK en realidad se apagó, todas las clases y métodos están ahí, pero todos arrojan una excepción. Está ahí para proporcionar una API pero no allí para darle una implementación real.
Hay un maravilloso proyecto llamado Robolectric que implementa mucho del framework solo para que pueda ejecutar pruebas significativas. Junto con un buen marco simulado (por ejemplo, Mockito), hace que su trabajo sea manejable.
Plugin de Gradle: https://github.com/robolectric/robolectric-gradle-plugin
Para Android Studio 1.2+, configurar un proyecto para JUnit es bastante simple, intente seguir este tutorial:
Esta es la parte más simple de configurar un proyecto para JUnit:
https://io2015codelabs.appspot.com/codelabs/android-studio-testing#1
Siga a lo largo del último enlace hasta " Ejecutar sus pruebas "
Ahora, si quieres integrarte con la prueba de instrumentación, sigue desde aquí:
https://io2015codelabs.appspot.com/codelabs/android-studio-testing#6
Por favor, mira este tutorial del sitio oficial de Desarrolladores de Android. Este artículo también muestra cómo crear maquetas para tus pruebas.
Por cierto, debe tener en cuenta que el alcance de las dependencias para la prueba JUnit simple debe ser "testCompile".