¿Por qué el ejecutor de pruebas de Android informa "Conjunto de pruebas vacío"?

98

Estoy golpeando mi cabeza contra la pared aquí tratando de averiguar por qué IntelliJ / Android informa "Suite de prueba vacía". Tengo un pequeño proyecto con dos módulos IntelliJ ("Proyectos" en Eclipse). El módulo de prueba unitaria tiene su propio AndroidManifest.xml, que he pegado en la parte inferior. Estoy intentando ejecutar un ActivityUnitTestCase, ya que las pruebas dependerán del Context-objeto.

El nombre del paquete del módulo principal es nilzor.myapp. El nombre del paquete del módulo de prueba esnilzor.myapp.tests

¿Por qué el corredor de pruebas no detecta el testBlah()método -como una prueba?

<?xml version="1.0" encoding="utf-8"?>
<!-- package name must be unique so suffix with "tests" so package loader doesn't ignore us -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="nilzor.myapp.tests"
          android:versionCode="1"
          android:versionName="1.0">
    <!-- We add an application tag here just so that we can indicate that
         this package needs to link against the android.test library,
         which is needed when building test cases. -->
    <application>
        <uses-library android:name="android.test.runner"/>
    </application>
    <!--
    This declares that this application uses the instrumentation test runner targeting
    the package of nilzor.myapp.  To run the tests use the command:
    "adb shell am instrument -w nilzor.myapp.tests/android.test.InstrumentationTestRunner"
    -->
    <instrumentation android:name="android.test.InstrumentationTestRunner"
                     android:targetPackage="nilzor.myapp"
                     android:label="Tests for nilzor.myapp"/>
</manifest>

Y aquí está mi clase de prueba :;

package nilzor.myapp.tests;

public class NilzorSomeTest<T extends Activity> extends ActivityUnitTestCase<T>{
    public NilzorSomeTest(Class<T> activityClass){
        super(activityClass);
    }

    @SmallTest
    public void testBlah(){
        assertEquals(1,1);
    }
}

He leído los fundamentos de las pruebas , el documento de pruebas de actividad y he intentado seguir este blog de prueba de Hello world , aunque es para Eclipse. No puedo hacer que el corredor de pruebas busque y ejecute mi prueba. ¿Qué estoy haciendo mal?

Algunas de las preguntas de las que todavía me siento inseguro son:

  1. ¿Necesito una anotación sobre el método de prueba unitaria?
  2. ¿Necesito prefijar el método con "prueba", o es solo para las pruebas JUnit?
  3. ¿Puedo realizar pruebas en subpaquetes de nilzor.myapp.tests?

Pero la pregunta principal de esta publicación es ¿por qué el corredor de pruebas no detecta mi prueba ?

Nilzor
fuente
Para el punto 3, si está utilizando Android Studio, le recomiendo el cmd+shift+tacceso directo que creará una clase de prueba automáticamente en la ubicación correcta del paquete que coincida con la clase que está editando actualmente.
David Argyle Thacker
En caso de que alguien más esté tan ausente como yo. Asegúrese de no olvidarse de poner el @Testmarcador encima de la prueba.
Matt D

Respuestas:

70

Debe proporcionar un constructor predeterminado para su clase de prueba, por ejemplo:

package nilzor.myapp.tests;

public class NilzorSomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
    public NilzorSomeTest(){
        super(ActivityYouWantToTest.class);
    }

    @SmallTest
    public void testBlah(){
        assertEquals(1,1);
    }
}

sobre sus otras preguntas:

  1. No. Mis pruebas aún se ejecutan sin anotaciones, pero creo que es una buena práctica tenerlas. Le permite especificar el tamaño de las pruebas a ejecutar. Consulte ¿Cuál es el propósito de las anotaciones @SmallTest, @MediumTest y @LargeTest en Android? para más detalles.

  2. Sí, necesita el prefijo "prueba". InteliJ da una advertencia de "método nunca usado" cuando no hay un prefijo de "prueba" y omite ese método durante la ejecución de la prueba.

  3. Si. Tengo mis pruebas organizadas en subpaquetes y parece que funciona bien.

lmac
fuente
5
Esto no es necesario si usa ActivityTestRule
Yair Kukielka
Agregar el constructor predeterminado hizo el trabajo por mí.
Dragan Marjanović
54

Si esto está sucediendo "de repente" o "estaba funcionando hace 5 minutos", mi solución fue ir a las configuraciones Ejecutar / Depurar y eliminar cualquier configuración en "Pruebas de Android". A veces, estas configuraciones se corrompen si refactorizo ​​la clase bajo prueba (por ejemplo, moviéndome a un nuevo paquete).

ingrese la descripción de la imagen aquí

tir38
fuente
Esto funcionó para mí. Recibí un error de suite de prueba vacía. Podría deberse a que agregué PowerMockito después de que se creó la configuración inicialmente.
Ajith Memana
Con frecuencia tengo este y otros problemas al ejecutar pruebas en las que las configuraciones de compilación funcionaron correctamente antes. He podido solucionarlos adoptando este enfoque.
stevehs17
3
Después de eliminar las configuraciones, hago clic con el botón derecho en un paquete de prueba en el explorador de proyectos (vista de Android) y selecciono Create 'Tests in XXX..., luego funcionó de nuevo
TmTron
9

Ninguno de los anteriores me lo arregló. Lo que ayudó fue seguir las instrucciones :

Crea una configuración de prueba

En Android Studio:

  • Abra el menú Ejecutar -> Editar configuraciones
  • Agregar una nueva configuración de pruebas de Android
  • Elige un módulo
  • Agregue un corredor de instrumentación específico:

  android.support.test.runner.AndroidJUnitRunner

Ejecute la configuración recién creada.

serv-inc
fuente
6

Tuve un problema similar. No estoy seguro de por qué ocurre esto, pero pude solucionarlo yendo a: "Archivo"> ​​"Invalidar cachés / reiniciar" en Android Studio.

Jeff Stapleton
fuente
Esto me solucionó cuando obtuve el mismo error que OP después de refactorizar el nombre de mi clase de prueba.
Marco
4

No sé si ayuda para Android Studio, pero tuve algún tipo de conflicto Intellij-Gradle. Lo resolvió haciendo "clic derecho" en el archivo de prueba y presionando "compilar archivo ... Test.java". Después de eso, pude volver a ejecutar pruebas individuales.

Kotlinski
fuente
2
¿Dónde está este "archivo de compilación" en un * Test.java? ¿Qué versión de Android Studio?
Mark Lapasa
Como intenté decir anteriormente, no uso Android Studio. Estoy usando Intellij 15 profesional. imagen de menú desplegable con clic derecho <- Pegué una imagen aquí.
kotlinski
4

Tuve el mismo problema en Android Studio 2.3.1, resulta que fue solo un error con AS. Ejecutar la misma prueba en la versión 2.2.1 funciona bien.

Si solo está ejecutando Android Studio en el canal Cannary, le recomiendo que también instale una versión estable. http://tools.android.com/tips/using-multiple-android-studio-versions

David Argyle Thacker
fuente
Lo mismo para mí, 3.1.2 estable funciona, 3.2 canary 15 no.
arekolek
3

Tenía pruebas que funcionaban bien hasta que gradlese actualizó el estudio de Android.

Además de agregar un constructor predeterminado a sus pruebas, es posible que deba hacer algunas de estas cosas para que su conjunto de pruebas funcione

Bajo src/crear androidTest/java/<your-package-name>/test. Tenga en cuenta el androidTest. Cualquier otra cosa, incluso instrumentTestno funcionará.

Agregar esto a build.gradle

sourceSets {
    testLocal {
        java.srcDir file('src/androidTest/java')
        resources.srcDir file('src/androidTest/resources')
    }
}



android{
    sourceSets {
       instrumentTest.setRoot('src/androidTest/')
    }
}

dependencies{
     testLocalCompile 'junit:junit:4.11'
}

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

Agregue esto al AndroidManifest.xml

 <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:label="Tests for my packaged app"
        android:targetPackage="<my-package-name>.test" />
Pratik Mandrekar
fuente
3

Para Intellij 15 resolví este problema de la siguiente manera:

  1. Abrir la configuración de 'Estructura del proyecto'
  2. Haciendo clic en 'Módulos' (a la izquierda)
  3. Pestaña 'Fuentes'
    a. Haga clic derecho en su directorio de origen (generalmente src) haga clic en 'Fuente'.
    si. Haga clic derecho en su directorio de prueba, haga clic en 'Prueba'
    c. Haga clic derecho en su directorio de salida, haga clic en 'Excluido'
  4. Vaya a la pestaña 'Rutas'
    a. Haga clic en el botón de
    opción 'Usar ruta de salida de compilación del módulo' b. Seleccione su directorio de ruta de salida para 'Ruta de salida'
    c. Seleccione su directorio de ruta de prueba para 'Ruta de salida de prueba'
  5. Haga clic en Aceptar
Marqués Blount
fuente
3

Obviamente, necesita un dispositivo de destino para ejecutar sus pruebas, ya que son pruebas instrumentadas. Por algunas razones, Android Studio a veces no le pide que apunte a este dispositivo de destino y solo le muestre el mensaje "Empty Test Suite". Hay diferentes formas de solucionar este problema, aquí hay algunas:

  • ejecute su aplicación principal y seleccione un dispositivo de destino o

  • ir a la configuración Ejecutar (Ejecutar / Ejecutar ... / Editar configuraciones) y modificar las Opciones de destino de implementación

usuario2243632
fuente
Solo para ayudar a alguien si prueba tu solución. En mi caso, primero tuve que ejecutar la aplicación real en el dispositivo / emulador y luego mi AndroidTest pudo ver el dispositivo para ejecutar las pruebas. Después de eso, todo funcionó. Dar más uno por la respuesta.
A_P
2

En mi caso, ninguna de las respuestas anteriores funcionó. La solución fue simplemente mover la clase de prueba a otro paquete .

Esto sucedió bajo androidTest/

Mateus Gondim
fuente
2

En mi caso, ese problema se debió a un error en mi código, en realidad eso estaba en la clase de aplicación, por lo que la actividad de destino no se abrió y las impresiones de salida de prueba

Error de suite de prueba vacía

He intentado ejecutar pruebas directamente desde la terminal con adb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner. Con esto imprime mucho más sobre la excepción.

Beloo
fuente
2

Tuve este problema porque tenía esto en mi build.gradle:

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

Aunque no estaba usando Android Test Orchestrator (debe haber copiado de los tutoriales por error).

Comentar eso lo resolvió para mí.

Pablo
fuente
1

Ninguna de las otras soluciones funcionó para mí, pero pude hacer que esto funcionara simplemente desinstalando la aplicación existente o el conjunto de pruebas y luego ejecutando las pruebas.

Phil
fuente
Eso me ayudó. Hice cambios en el nivel de la base de datos antes de ejecutar la prueba, por lo que la clase bajo la prueba instrumentada no pudo funcionar. Es extraño que Android Studio muestre un mensaje tan poco relevante.
PetroCliff
1

En mi caso, el proyecto en el que estaba trabajando tenía un par de módulos. Ninguna de las soluciones que encontré para este error me ayudó, y luego de alguna manera me di cuenta de que si agregaba las dependencias de prueba en AMBOS archivos build.gradle, las pruebas comenzaron a funcionar mágicamente. No importa si sus pruebas se encuentran solo en 1 de los módulos, ambos archivos gradle deben incluir las dependencias y el valor testInstrumentationRunner.

Entonces, si como yo, ninguna de las otras respuestas te ha ayudado, intenta agregar estas líneas al archivo build.gradle de cada uno de tus módulos:

android {    
    ....
    defaultConfig {
        ...
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }  
}

y luego también agregue:

dependencies {
    ...
    // Test
    androidTestCompile 'com.android.support:support-annotations:23.4.0'
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test:rules:0.5'

}
Jorge Salas
fuente
1

Acabo de cambiar el nombre del archivo y el problema se solucionó.

Lyn
fuente
1

Tuve el mismo problema, ¡y la razón fue que mi clase de prueba no tenía Prueba al final del nombre de la clase!

Janin
fuente
1

Mi problema fue causado por una excepción lanzada en el @BeforeClassmétodo de mi caso de prueba. De alguna manera no estaba causando que la prueba fallara, solo lo encontré inspeccionando la salida de logcat.

¡Arreglé la excepción y de repente mis pruebas se estaban ejecutando!

impactante
fuente
lo mismo para mi. Parece que las excepciones en BeforeClass no se muestran correctamente en el panel de ejecución
David Refaeli
1

Después de enfrentar el problema hoy, no poder ejecutar las pruebas de Android instrumentadas con el error de suite vacía, encontré un problema de git sobre este problema y, gracias a Stephan Linzner, pude ejecutar las pruebas.

tl; dr Tienes que hacer clic con el botón derecho en el paquete de prueba y no en la clase para que se ejecuten las pruebas.

Referencia: https://github.com/googlecodelabs/android-testing/issues/27#issuecomment-219074863

Francisco Junior
fuente
0

Este artículo me ayudó: suite de pruebas vacía

Básicamente, tuve que crear un paquete, instrumentTest / java , en mi directorio src y poner todas las pruebas allí. Entonces podría ejecutar estas pruebas individualmente.

IgorGanapolsky
fuente
0

Tenía un proyecto de Java en bruto donde esto estaba ocurriendo. Simplemente Java + JUnit4. Definitivamente reside con algo en sus archivos .idea / o .iml. Deseché el mío, lo volví a importar y finalmente las pruebas se volvieron a ejecutar.

cdaringe
fuente
0

La clase de prueba puede excluirse de la compilación. Corríjalo en setting-compiler-exclude.

petertc
fuente
0

Estos son los pasos de depuración que sigo cuando Android Studio, de repente, decide dejar de ejecutar / depurar las pruebas (¡Y esto sucede vergonzosamente a menudo!):

  • Construir: → Reconstruir proyecto
  • Reiniciar dispositivo: reinicia tu dispositivo / emulador y vuelve a intentarlo
  • Cambio de dispositivo: si tiene un teléfono normal y un emulador, desconecte uno e intente ejecutarlo con solo uno de los dispositivos
  • Android Studio: Archivo -> Invalidar cachés y reiniciar
  • Monitor de actividad / Administrador de tareas: clasifique los procesos por nombre, vea si hay un proceso sin nombre que esté usando una gran cantidad de memoria RAM, este es un proceso "fantasma" del estudio de Android que debe eliminarse
  • git revert: intente guardar / revertir su último código. A veces hay un error de compilación que Android Studio / gradle no emite y solo intentará ejecutar un código no compilable.
  • Desinstale y vuelva a instalar Android Studio.

¡Agregaré más correcciones a medida que las encuentre!

gorbysbm
fuente
0

No hice nada y el problema desapareció después de medio día de dolor, abrí y cerré los proyectos muchas veces, ejecuté las pruebas de cada clase manualmente, tal vez eso lo solucionó.

Gary Davies
fuente
0

En Android Studio con spock framework, cambié la versión de mi gradle de 2.2.2 a 3.2.1 y todo va bien.

Psijic
fuente
0

La respuesta aceptada no resolvió mi problema. Así que decidí copiar lo ExampleInstrumentedTestque se crea por defecto en Android Studio y se ejecuta sin ningún problema, lo renombré durante el proceso de copia (¡no Refactor-> Renombrar después de copiar!) Y pegué el contenido de mi prueba unitaria en él. Después de eso, el error desapareció.

ka3ak
fuente
0

Experimenté el error "Conjunto de pruebas vacío" al intentar ejecutar pruebas de unidades locales en mi proyecto de Android Studio 3.0.

Después de leer la documentación del desarrollador de Android , rápidamente me di cuenta de que el problema era causado por mi configuración de Gradle, que incluía las siguientes líneas.

testImplementation 'com.android.support.test:runner:0.5'
testImplementation 'com.android.support.test:rules:0.5'

La clase AndroidJUnitRunner es un corredor de prueba JUnit que le permite ejecutar clases de prueba de estilo JUnit 3- o JUnit 4 en dispositivos Android .

Dado que mis pruebas eran locales y, por lo tanto, no era necesario que se ejecutaran en ningún dispositivo, la eliminación de las entradas com.android.support.test ... anteriores me permitió ejecutar las pruebas unitarias.

Will P
fuente
0

Estaba haciendo algunas inserciones en una base de datos en el método @BeforeClass. Me di cuenta de que tenía un problema de mapeo de objetos / bases de datos. Este problema de mapeo de datos fue la causa de este problema para mí.

Laurent
fuente
0

En mi caso, tenía mis pruebas instrumentadas androidTest/java/<package.name>/MyTestingClass, pero había configurado mi variante de compilación actual en "preproducción". ¡Y ese es el punto! Como se especifica en la documentación de Android Studio :

De forma predeterminada, todas las pruebas se ejecutan con el tipo de compilación de depuración.

El mensaje Class not found. Empty test suite.siguió apareciendo hasta que hice esto:

  1. Agregue esta línea a mi build.gradle :

    android{
        [...]
        testBuildType "preproduction"
    }
  2. Gradle sincronizado.
  3. Elimina mis configuraciones de prueba anteriores, ya que no tienen en cuenta esta sincronización de Gradle.

Luego ejecuté las pruebas de nuevo y esta vez se ejecutaron perfectamente !!!

Juan José Melero Gómez
fuente
0

Me pasó esto cuando marqué por error una variable de clase no simulada con la anotación @Mock Eliminé la anotación y las pruebas se ejecutaron correctamente. Esto sucedió con Junit 4.5 en Android Studio

Mihir
fuente
0

No es una solución, sino una solución alternativa que lo volverá a encaminar rápidamente:

  1. En primer lugar, busque una prueba que funcione. Estaba escribiendo una nueva prueba en la que recibí el error de "suite de pruebas vacía". Hice otras pruebas y funcionaron como de costumbre.

  2. Copie el archivo de prueba que sí funciona. Ejecútelo para asegurarse de que esta copia funcione como el original.

  3. Retire el cuerpo y reemplácelo con su nuevo código de prueba.

La prueba debería funcionar ahora.

Pasamos unas dos horas tratando de encontrar la causa, pero fue en vano.

xavierdominguez
fuente