2015-03-12 9 views
81

Ich bin neu in der Testwelt und noch mehr in Android Testwelt. Während der Forschung auf Robolectric, die mit Tests auf Android eine Sache hilft verwirrt mich am meisten. Manchmal im Web sehe ich Leute, die testCompile Schlüsselwort in Abhängigkeiten des Gradle-Erstellungsskriptes verwenden, wenn sie Robolectric referenzieren, während andere androidTestCompile verwenden. Sicherlich können beide nicht gültig sein?Verwirrt über testCompile und androidTestCompile in Android Gradle

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

Antwort

114

testCompile einfach ist die Konfiguration für Komponententests (die sich in src/test) und androidTestCompile für den Test api verwendet wird (das insrc/androidTest befindet). Da Sie Komponententests schreiben möchten, sollten Sie testCompile verwenden.

Update: Der Hauptunterschied zwischen den beiden ist die test sourceSet läuft in einer regelmäßigen Java JVM, während die androidTest sourceSet Tests auf einem Android Gerät ausgeführt (oder einen Emulator).

+0

Danke. Das ist, was ich zuerst dachte, aber wenn das der Fall ist, warum einige Robolectric Abhängigkeit mit testCompile und einige mit androidTestCompile. Ist das nicht eine Bibliothek, die beim Schreiben von Integrationstests hilft? Wenn ja, sollte es nicht mit androidTestCompile referenziert werden? Doch selbst der offizielle Guide von roboclect leitet testCompile ein ... Tut mir leid, aber das ist mir zu diesem Zeitpunkt einfach zu verwirrend, wie Sie sehen können. – Lucas

+2

Die Namenskonventionen sind ein wenig seltsam.Wenn Sie Komponententests schreiben (Tests, die nicht auf dem Gerät ausgeführt werden), würden sie grundsätzlich in 'src/test' existieren und ihre Abhängigkeiten gehören daher in die 'testCompile'-Konfiguration. Abhängigkeiten, die der 'androidTestCompile'-Konfiguration hinzugefügt werden, sind nur für die Quelle in 'src/androidTest' verfügbar, die tatsächlich in ein APK integriert ist und auf einem Gerät bereitgestellt wird. –

+0

Danke, dass Sie mich in eine Richtung weisen. Es hat nicht alle meine Fragen beantwortet, aber es hat mir bei meinen Recherchen geholfen. Um nur zu verdeutlichen, was Sie gesagt haben, sind die Unit-Tests nicht nur diejenigen im Testordner (standardmäßig). Ironischerweise ruft google manchmal die Tests im androidTest auch als Unit Test an. Hängt natürlich vom Zweck des bestimmten Tests ab, aber fügt noch der Verwirrung hinzu. – Lucas

3

Um Ihre Frage zu beantworten - Verwenden Sie testCompile für robolectric

warum, weil robolectric läuft auf der JVM Verhalten alle Android-Gerät spöttisch.

testCompile und androidTestCompile sind "per Konvention" android Ordner, die Grapple verwendet, während Aufgaben von Android-Plugin zur Verfügung gestellt.

androidTestDebug nimmt Tests von androidTest Ordner testDebug nimmt Tests von Testordner,

Wieder sind diese nur durch Konvention Ordner können Sie Source-Sets für diese Konfigurationen

Hinweis geben: Espresso ist solch eine fantastische Bibliothek versuchen, sich zu bewegen, von robolectric :)

0

// Unit-Tests

testCompile 'junit:junit:4.12' 

Der obige Code ist eine Abhängigkeit von JUnit 4 in Build.Gradle-Datei in Android Studio. Sie sehen, dass es testCompile hat, weil JUnit auf JVM ausgeführt wird und kein Gerät oder Emulator zum Ausführen benötigt. Das bedeutet auch, dass JUnit-Tests nicht die Ausführung des Anwendungskontextes erfordern und wenn sie es erfordern, müssten wir sie "MOCKEN".

// Insturmented Unit Testing

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

Jetzt sehen wir androidTestCompile hier, weil wir dieses Mal das Gerät oder Emulator für Tests verwenden wollen, ist, dass Instrumentation Tests. Für bessere Erklärung würde ich vorschlagen, von developer.android.com zu lesen