Verwirrt über testCompile und androidTestCompile in Android Gradle

87

Ich bin neu in der Testwelt und noch mehr in der Android-Testwelt. Während ich über Robolectric recherchiere, das bei Tests mit Android hilft, verwirrt mich eines am meisten. Manchmal sehe ich im Web Leute, die testCompileSchlüsselwörter in Abhängigkeiten des Gradle-Build-Skripts verwenden, wenn sie auf Robolectric verweisen, während andere es verwenden androidTestCompile. Sicherlich können beide nicht gültig sein?

Kann jemand den Unterschied zwischen beiden erklären und welche davon sollten bei der Verwendung von Robolectric verwendet werden?

Lucas
quelle

Antworten:

120

Einfach testCompileist die Konfiguration für Unit-Tests (die sich in src / test befinden ) und androidTestCompilewird für die Test-API verwendet (die sich in src / androidTest befindet ). Da Sie beabsichtigen, Komponententests zu schreiben, sollten Sie verwenden testCompile.

Update: Der Hauptunterschied zwischen beiden besteht darin, dass das testQuellenset in einer regulären Java-JVM ausgeführt wird, während die androidTestQuellset-Tests auf einem Android-Gerät (oder einem Emulator) ausgeführt werden.

Mark Vieira
quelle
Vielen Dank. Das habe ich mir zuerst gedacht, aber wenn das der Fall ist, warum einige Referenz-Robolectric-Abhängigkeiten mit testCompile und einige mit androidTestCompile. Ist das nicht eine Bibliothek, die beim Schreiben von Integrationstests hilft? Wenn ja, sollte nicht mit androidTestCompile darauf verwiesen werden? Allerdings weist sogar der offizielle Leitfaden von robolectric an, testCompile zu verwenden ... Entschuldigung, aber es ist mir an dieser Stelle einfach zu verwirrend, wie Sie sehen können.
Lucas
3
Die Namenskonventionen sind etwas seltsam. Wenn Sie Komponententests schreiben (Tests, die nicht auf dem Gerät ausgeführt werden), sind diese grundsätzlich in 'src / test' vorhanden, und daher gehören ihre Abhängigkeiten in die testCompileKonfiguration. Der androidTestCompileKonfiguration hinzugefügte Abhängigkeiten stehen nur der Quelle in 'src / androidTest' zur Verfügung, die tatsächlich in ein APK integriert und auf einem Gerät bereitgestellt ist.
Mark Vieira
Danke, dass du mich in eine Richtung gelenkt hast. Es hat nicht alle meine Fragen beantwortet, aber es hat mir bei meinen Recherchen geholfen. Um zu verdeutlichen, was Sie gesagt haben, befinden sich die Unit-Tests nicht nur im Testordner (standardmäßig). Ironischerweise nennt Google manchmal die Tests, die sich in androidTest befinden, auch als Unit-Tests. Hängt natürlich vom Zweck eines bestimmten Tests ab, trägt aber immer noch zur Verwirrung bei.
Lucas
1
Dies ist hauptsächlich Semantik, damit ich mich nicht auf sie einlassen würde. Viele mit Roboelectric geschriebene Tests sind wohl Integrationstests und ohnehin keine Komponententests. Der Hauptunterschied zwischen beiden besteht jedoch darin, dass 'src / test' auf dem Entwicklercomputer in einer Standard-JVM ausgeführt wird und 'src / androidTest' in einer APK gepackt und auf einem tatsächlichen Gerät (oder Emulator) ausgeführt wird.
Mark Vieira
1
Ich denke, die Unterstützung für 'src / test', die Sie zuvor gesehen haben, war einfach die, die über das Standard-Gradle-Java-Plugin verfügbar war. Daher gab es keine Unterstützung für Build-Aromen oder -Typen. Jetzt unterstützt das Android-Plugin Unit-Tests vollständig, einschließlich Unit-Test-Quellensets pro Variante.
Mark Vieira
3

So beantworten Sie Ihre Frage: Verwenden Sie testCompile für robolectric

warum, weil robolectric auf der JVM läuft und das gesamte Verhalten des Android-Geräts verspottet.

testCompile und androidTestCompile sind "gemäß Konvention" Android-Ordner, die gradle beim Ausführen von Aufgaben verwendet, die vom Android-Plugin bereitgestellt werden.

androidTestDebug wählt Tests aus dem androidTest-Ordner aus, testDebug wählt Tests aus dem Testordner aus,

Auch hier handelt es sich nur um Konventionsordner, für die Sie Quellensätze für diese Konfigurationen angeben können

Hinweis: Espresso ist eine großartige Bibliothek, die versucht, sich von Robolectric zu entfernen :)

Amit Kaushik
quelle
1

// Unit Testing

testCompile 'junit:junit:4.12'

Der obige Code ist eine Abhängigkeit von JUnit 4 in der Datei build.gradle in Android Studio. Sie sehen, dass es testCompile hat, da JUnit auf JVM ausgeführt wird und zum Ausführen kein Gerät oder Emulator erforderlich ist. Das bedeutet auch, dass für JUnit-Tests der Anwendungskontext nicht ausgeführt werden muss. Wenn dies erforderlich ist, müssen wir sie "verspotten".

// Insturmented Unit Testing

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

Jetzt sehen wir hier androidTestCompile, da wir dieses Mal beabsichtigen, das Gerät oder den Emulator für Tests zu verwenden, dh für Instrumentationstests. Zur besseren Klärung würde ich empfehlen, von developer.android.com zu lesen

Lazycoder_007
quelle
0

Um die Abhängigkeit für JVM-Tests oder Unit-Tests hinzuzufügen (Tests, die nur auf der Java-Umgebung basieren, benötigen keine Android-Umgebung).

Wir verwenden die Direktive testCompile. Beispiel:

dependencies {
    testCompile gradleTestKit()
}

Um den Test "Abhängigkeit für Instrumentierung" hinzuzufügen (diese Tests basieren hauptsächlich auf der Android-Umgebung), verwenden wir die androidTestCompileDirektive.

Subhasish Nath
quelle