Confuso su testCompile e androidTestCompile in Android Gradle


87

Sono nuovo nel mondo dei test e ancora di più nel mondo dei test Android. Durante la ricerca su Robolectric che aiuta con i test su Android, una cosa mi confonde di più. A volte sul web vedo persone che usano testCompileparole chiave in dipendenza dello script di build gradle quando fanno riferimento a Robolectric mentre altri usano androidTestCompile. Certamente entrambi non possono essere validi?

Qualcuno può spiegare la differenza tra entrambi e quale di questi dovrebbe essere quello utilizzato quando si utilizza Robolectric?

Risposte:


120

Simply testCompileè la configurazione per gli unit test (quelli che si trovano in src / test ) e androidTestCompileviene utilizzata per l'api di test (quella che si trova in src / androidTest ). Poiché hai intenzione di scrivere unit test, dovresti usare testCompile.

Aggiornamento: la principale distinzione tra i due è che il testsourceset viene eseguito in una normale JVM Java, mentre i androidTesttest del sourceset vengono eseguiti su un dispositivo Android (o un emulatore).


Grazie. Questo è quello che ho pensato all'inizio, ma se è così perché alcuni fanno riferimento alla dipendenza robolectric con testCompile e alcuni con androidTestCompile. Non è una libreria che aiuta a scrivere test di integrazione? In tal caso, non dovrebbe essere referenziato con androidTestCompile? Tuttavia anche la guida ufficiale di robolectric indica di usare testCompile ... Scusate ma a questo punto mi confonde troppo, come potete vedere.
Lucas

3
Le convenzioni di denominazione sono un po 'strane. Fondamentalmente, se stai scrivendo unit test (test che non verranno eseguiti sul dispositivo), allora esisterebbero in "src / test" e quindi le loro dipendenze appartengono alla testCompileconfigurazione. Le dipendenze aggiunte alla androidTestCompileconfigurazione saranno disponibili solo per l'origine in "src / androidTest", che è effettivamente integrato in un APK e distribuito su un dispositivo.
Mark Vieira

Grazie per avermi indicato una direzione. Non ha risposto a tutte le mie domande ma mi ha aiutato durante la mia ricerca. Giusto per chiarire quanto hai detto, gli Unit Test non sono solo quelli nella cartella test (per impostazione predefinita). Per ironia della sorte google a volte chiama i test che si trovano in androidTest anche come Unit Test. Dipende ovviamente dallo scopo del test particolare, ma aumenta comunque la confusione.
Lucas

1
Si tratta principalmente di semantica, quindi non mi impiccherei. Molti test scritti con Roboelectric sono probabilmente test di integrazione e non test unitari comunque. Detto questo, la principale distinzione tra i due è che "src / test" viene eseguito sulla macchina degli sviluppatori in una JVM standard e "src / androidTest" è confezionato in un APK ed eseguito su un dispositivo reale (o emulatore).
Mark Vieira

1
Penso che il supporto per "src / test" che hai visto prima fosse semplicemente quello che era disponibile tramite il plug-in Java Gradle standard. Pertanto, non c'era supporto per build o tipi. Ora il plug-in Android ha il supporto completo per gli unit test, per includere set di sorgenti di unit test per variante.
Mark Vieira

3

Per rispondere alla tua domanda - Usa testCompile per robolectric

perché, perché robolectric gira sulla JVM deridendo tutto il comportamento del dispositivo Android.

testCompile e androidTestCompile sono cartelle Android "per convenzione" che gradle utilizza durante l'esecuzione di attività fornite dal plug-in Android.

androidTestDebug seleziona i test dalla cartella androidTest, testDebug seleziona i test dalla cartella di test,

Anche in questo caso queste sono solo per convenzione cartelle che puoi fornire set di sorgenti per queste configurazioni

Nota: l'espresso è una libreria così fantastica che cerca di allontanarti dal robolectric :)


1

// unit test

testCompile 'junit:junit:4.12'

Il codice sopra è una dipendenza di JUnit 4 nel file build.gradle in Android Studio. Si vede che ha testCompile, perché JUnit viene eseguito su JVM e non richiede un dispositivo o un emulatore per essere eseguito. Ciò significa anche che i test JUnit non richiederanno l'esecuzione del contesto dell'applicazione e, se lo richiedono, avremmo bisogno di "MOCK".

// Test unitario insturmentato

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

Ora vediamo androidTestCompile qui, perché questa volta intendiamo utilizzare il dispositivo o l'emulatore per i test, ovvero il test della strumentazione. Per maggiori chiarimenti suggerirei di leggere da developer.android.com


0

Per aggiungere la dipendenza per i test JVM o i test unitari (i test si basano solo sull'ambiente java, non abbiamo bisogno di alcun ambiente Android).

Usiamo la direttiva testCompile. Esempio:

dependencies {
    testCompile gradleTestKit()
}

Per aggiungere il test della dipendenza per la strumentazione (quelli che eseguono i test si basano principalmente sull'ambiente Android), utilizziamo la androidTestCompiledirettiva.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.