Confundido acerca de testCompile y androidTestCompile en Android Gradle

87

Soy nuevo en el mundo de las pruebas y aún más en el mundo de las pruebas de Android. Mientras investigaba sobre Robolectric que ayuda con las pruebas en Android, una cosa me confunde más. A veces en la web veo personas que usan testCompilepalabras clave en dependencias del script de compilación de gradle cuando hacen referencia a Robolectric mientras que otros usan androidTestCompile. ¿Ciertamente ambos no pueden ser válidos?

¿Alguien puede explicar la diferencia entre ambos y cuál de estos debería ser el que se usa al usar Robolectric?

Lucas
fuente

Respuestas:

120

Simplemente testCompilees la configuración para las pruebas unitarias (las que se encuentran en src / test ) y androidTestCompilese usa para la API de prueba (que se encuentra en src / androidTest ). Dado que tiene la intención de escribir pruebas unitarias, debe usar testCompile.

Actualización: la principal distinción entre los dos es que el conjunto de testfuentes se ejecuta en una JVM Java normal, mientras que las androidTestpruebas de conjunto de fuentes se ejecutan en un dispositivo Android (o un emulador).

Mark Vieira
fuente
Gracias. Eso es lo que pensé al principio, pero si ese es el caso, algunos hacen referencia a la dependencia robolectric con testCompile y otros con androidTestCompile. ¿No es una biblioteca que ayuda a escribir pruebas de integración? Si es así, ¿no debería hacerse referencia con androidTestCompile? Sin embargo, incluso la guía oficial de robolectric indica usar testCompile ... Lo siento, pero es demasiado confuso para mí en este punto, como puede ver.
Lucas
3
Las convenciones de nomenclatura son un poco extrañas. Básicamente, si está escribiendo pruebas unitarias (pruebas que no se ejecutarán en el dispositivo), existirían en 'src / test' y, por lo tanto, sus dependencias pertenecen a la testCompileconfiguración. Las dependencias agregadas a la androidTestCompileconfiguración solo estarán disponibles para la fuente en 'src / androidTest', que en realidad está integrado en un APK y se implementa en un dispositivo.
Mark Vieira
Gracias por indicarme alguna dirección. No respondió a todas mis preguntas, pero me ayudó durante mi investigación. Solo para aclarar lo que ha dicho, las pruebas unitarias no son solo las que están en la carpeta de prueba (por defecto). Irónicamente, Google llama a veces a las pruebas ubicadas en androidTest también como pruebas unitarias. Depende, por supuesto, del propósito de la prueba en particular, pero aun así se suma a la confusión.
Lucas
1
Esto es principalmente semántica, por lo que no me obsesionaría con ellos. Muchas pruebas escritas con Roboelectric son posiblemente pruebas de integración, y no pruebas unitarias de todos modos. Dicho esto, la principal distinción entre los dos es que 'src / test' se ejecuta en la máquina del desarrollador en una JVM estándar y 'src / androidTest' está empaquetado en un APK y se ejecuta en un dispositivo real (o emulador).
Mark Vieira
1
Creo que el soporte para 'src / test' que viste antes era simplemente el que estaba disponible a través del complemento estándar de Gradle Java. Por lo tanto, no hubo soporte para versiones o tipos de compilación. Ahora, el complemento de Android tiene soporte completo para pruebas unitarias, para incluir conjuntos de fuentes de prueba unitaria por variante.
Mark Vieira
3

Para responder a su pregunta, use testCompile para robolectric

por qué, porque robolectric se ejecuta en la JVM burlándose de todo el comportamiento del dispositivo Android.

testCompile y androidTestCompile son carpetas de Android "por convención" que gradle usa mientras ejecuta tareas proporcionadas por el complemento de Android.

androidTestDebug selecciona pruebas de la carpeta androidTest, testDebug elige pruebas de la carpeta de prueba,

Nuevamente, estas son solo carpetas por convención que puede proporcionar conjuntos de fuentes para estas configuraciones

Nota: el espresso es una biblioteca tan impresionante que intenta alejarte de robolectric :)

Amit Kaushik
fuente
1

//examen de la unidad

testCompile 'junit:junit:4.12'

El código anterior es una dependencia de JUnit 4 en el archivo build.gradle en Android Studio. Verá que tiene testCompile, porque JUnit se ejecuta en JVM y no requiere un dispositivo o emulador para ejecutarse. Eso también significa que las pruebas de JUnit no requerirán que se ejecute el contexto de la aplicación y, si lo requieren, tendremos que hacer una "MOCK".

// Pruebas unitarias instauradas

androidTestCompile('com.android.support.test:runner:0.5', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

Ahora vemos androidTestCompile aquí, porque esta vez pretendemos usar el dispositivo o emulador para las pruebas, es decir, las pruebas de instrumentación. Para una mejor aclaración, sugeriría leer de developer.android.com

Lazycoder_007
fuente
0

Para agregar Dependencia para las pruebas de JVM o las pruebas unitarias (las pruebas se basan solo en el entorno Java, no necesitamos ningún entorno Android).

Usamos la directiva testCompile. Ejemplo:

dependencies {
    testCompile gradleTestKit()
}

Para agregar la prueba de dependencia para la instrumentación (las pruebas se basan principalmente en el entorno Android), usamos la androidTestCompiledirectiva.

Subhasish Nath
fuente