Cómo ejecutar pruebas unitarias con Android Studio

Estoy usando Jake Android de la unidad de pruebas plugin de gradle: https://github.com/JakeWharton/gradle-android-test-plugin

Mi generación.gradle se parece a esto:

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:[email protected]')

//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'
}

Por desgracia no soy capaz de ejecutar todo o unidad específica formulario de prueba de Android Studio. Estoy recibiendo el 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 la ejecución de la línea de comandos no incluye mi JUnit dependencia:

/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 @[email protected]/private/var/folders/wq/knhztnf105v2_p1t580tj8h80000gp/T/idea_working_dirs_junit4927192380605663413.tmp -socket63849

Me pregunto si alguien era capaz de ejecutar las pruebas unitarias en Android Studio? Y si es posible ¿cómo lo hacen?

  • Si usted todavía está buscando, intente este post element84.com/easy-testing-with-android-studio.html
  • gracias por compartir, pero estoy buscando la manera de cómo ejecutar pruebas dentro de studio. Sobre todo necesito habilidad para ejecutar una prueba específica durante TDD sesión.
  • así que si usted utiliza Jake Wharton android de prueba plugin de gradle usted tiene que especificar mucho menos en construir.gradle y peldaño de todas las pruebas con gradle check
  • compruebe mi respuesta en stackoverflow.com/a/20329044/561323
  • Consulte tools.android.com/tech-docs/new-build-system/…
  • que uno es sobre la instrumental pruebas que son terriblemente lento. Estoy interesado en la prueba de unidad con Robolectric
  • Has probado a utilizar el adaptador de JUnit 3 en lugar de tratar de incluir JUnit 4?
  • No se puede utilizar junit 3 con robolectric
  • Esto es sólo tan exasperante en Android Studio 🙁

5 Kommentare

  1. 28

    acaba de agregar carpeta con el nombre instrumentTest bajo /src
    se debe tener /java en su interior, como este

    Cómo ejecutar pruebas unitarias con Android Studio

    a continuación, extender la clase ActivityTestCase (o cualquier otro android de la unidad de prueba de la clase), tales 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);
    }
    
    } 

    clic derecho en verde java directorio y seleccione ejecutar todas las pruebas
    y usted debe conseguir esto:

    Cómo ejecutar pruebas unitarias con Android Studio

    buena suerte

    • Me mudé mi respuesta aquí (yo quería poner la respuesta aquí en el primer lugar), esto es lo que tienes que hacer para ejecutar la unidad de pruebas en android studio. Al menos esto es lo que yo entiendo que usted quiera hacer, no entiendo tu pregunta equivocada?
    • Me estaba pidiendo Robolectric unidad de prueba no instrumental
    • lo siento, no me he dado cuenta de que – me enseñó que es en otra pregunta, ¿quieres que me quite la respuesta?
    • puede mantener. Así que tal vez algunas personas encuentran útil
    • parece que en Android Studio 0.5.7, «instrumentTest» se debería cambiar el nombre a «androidTest»
    • ¿Por qué poner /instrumentTest bajo /src? Debe estar en el mismo nivel superior como /src, no bajo…
    • aquí es donde android studio está a la espera de ser, acabo de comprobar y de su trabajo exactamente como esta
    • ¿Cómo puedo configurar para que se ejecute todos los tests cada vez que me «ejecutar» de la aplicación? Actualmente me puede sea ejecutar las pruebas o ejecutar la aplicación.

  2. 10

    Actualización para el 1,1+, android plugin de gradle 1.1+

    Finalmente es posible sin muchos trucos. Aquí es un ejemplo de proyecto que muestra cómo configurar Robolectric prueba en Android Studio v1.1+ y android gradle plugin v1.1+:
    https://github.com/nenick/AndroidStudioAndRobolectric

    Usted puede encontrar también hay posible problema y las soluciones. Sí, Robolectric es complejo y no es soportado oficialmente por Google por lo que todavía tiene algunos problemas. Pero la mayoría de las veces no funciona y aporta un enorme valor a su proyecto.

    También me animo a empezar a usar Robolectric v3+. Es casi liberado y lo suficientemente estable.

    Vieja respuesta para COMO 0.x y 1.0 x y android plugin de gradle la versión 1.1

    Me las arreglé para hacerlo con la ayuda de amigos.

    Así que, básicamente, usted necesita para hacer los cambios a ejecutar Robolectric pruebas de unidad en Android Studio:

    1. Copia de su ruta de clases para la prueba (se puede encontrar como primera línea en «Ejecutar» registro)
    2. Abrir la configuración de su unidad de pruebas
    3. De trabajo de cambiar de directorios a la carpeta donde AndroidManifest.xml está presente
    4. Agregar 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>"

    Como para mí el inicio de la nueva ruta de clases se parece a esto:

    /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:

    1. Puede ejecutar la prueba sólo para la variante de depuración
    2. Cada nueva ejecución de la prueba de configuración requiere que tales cambios manuales. Pero esto es simplemente copiar/pegar de dos campos de edición

    Tengo Android Studio versión 0.6. Aquí es de nuevo parte de mi build.gradle de archivo:

    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'
      }
    }
  3. 2

    Me encontré con este problema y encontrar una solución que incluya los classes.jar a partir de la explotó paquete (.aar) en la carpeta de compilación. No creo que ayuda con la búsqueda de recursos .aar dependencias sin embargo.

    testCompile fileTree(dir: "$project.buildDir/exploded-bundles", include: "**/classes.jar")

    Edición: Desde Android Gradle construir herramientas 0.9.0 la dependencia ha cambiado a:

    androidTestCompile fileTree(dir: "$project.buildDir/exploded-aar", include: "**/classes.jar")

    Edit 2: Desde Android Gradle construir herramientas 0.10.0 la dependencia ha cambiado a:

    androidTestCompile fileTree(dir: "$project.buildDir/../../build/exploded-aar", include: "**/classes.jar")

    Nota: la ruta de acceso relativa puede ser diferente dependiendo de la estructura del proyecto.

    • Lo siento, pero esto no ayuda a ejecutar Robolectric unidad de pruebas
    • probado esto, todavía gettin Exception in thread "main" java.lang.NoClassDefFoundError: junit/textui/ResultPrinter — parece ser el funcionamiento de mi sistema JDK /Library/Java/JavaVirtualMachines/jdk1.7.0_55.jdk/Contents/Home/bin/java que podría ser él?
    • con gradle construir herramientas 0.10.0 la ubicación de explotaron aar cambiado de nuevo (ver respuesta actualizada) – que podría ser su problema.
    • Con respecto a la «NoClassDefFoundError: he seguido las instrucciones aquí (stackoverflow.com/questions/24826252/…). La adición de la <output-test ... instrucción a mi .iml archivo ayudó a resolver este problema.
  4. 0

    He tenido un problema similar con 1.2.2.

    He seguido los pasos aquí. Básicamente:

    • Abrió la «Construir Variantes» en la ventana de la herramienta (véase la imagen en el enlace) y cambió la Prueba del «Artefacto» drop-down «Unidad de pruebas».
    • Crear un directorio para las pruebas de código fuente, es decir,src/test/java, y pasar su prueba de la respectiva paquete no.
    • Asegúrese de que las secciones siguientes de su build.gradle archivo contienen estos:

      dependencies { 
          testCompile 'junit:junit:4.12'
      }
      
      android {
          sourceSets {
              test {
                  resources {
                      srcDir "test"
                  }
              }
          }
      }

    Voila! Haz clic derecho en el caso de prueba y seleccione la JUnit sabor.

    Por CIERTO, parece alternar la visibilidad de la JUnit/Android pruebas cuando se cambia la «Construir Variantes» de la herramienta, así que mi conjetura es que usted puede probar como JUnit o Android, pero no ambas cosas al mismo tiempo.

    • Gracias por contestar! la pregunta no es relevante ya 🙂 BTW Android Studio 1.3 estable y 1.4 es en la vista previa ahora (si no tienes miedo)
  5. 0

    Para la posteridad Android Studio 2.0+ admite la ejecución de la Unidad de pruebas sin necesidad de plugins.

    Cómo ejecutar pruebas unitarias con Android Studio

    Esta pantalla se puede acceder a través del menú Ejecutar > Editar las Configuraciones de…

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea