studio sirve requisitos que proyecto para otra importar historia funciona exportar configurar computadora como abrir android junit intellij-idea gradle android-studio

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:




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



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".