Ich möchte mehr über ConnectedAndroidTest Gradle task erfahren. Ich sehe, dass es verwendet wird, um die Anwendung und Test-APKs zu installieren und die Tests auszuführen.
Aber was sind die einzelnen Schritte, die es macht? (Aufgaben, falls vorhanden)
"gradle build" scheint die Anwendung apk zu generieren. Welche Aufgabe generiert die Test-APK? Und wie installiert es (ConnectedAndroidTest) die Anwendung und Test-APK? Und wie startet es die Tests?
Vielen Dank.
Meine erste SO Antwort, sei bitte sanft;)
Aber was sind die einzelnen Schritte, die es macht? (Aufgaben, falls vorhanden)
Wenn Sie also einen Überblick über die wichtigsten Aufgaben von ConnectedAndroidTest erhalten möchten, geben Sie einfach ./gradlew connectedAndroidTest
oder ./gradlew cAT
(ohne die Option -q
) den Namen jeder Aufgabe aus Das cAT
hängt davon ab, bevor es selbst ausgeführt wird. Die Aufgabe selbst kann keine anderen Aufgaben haben, kann aber davon abhängen, dass andere davor stehen.
Von dieser Antwort ist die gradle build
Aufgabe eigentlich etwas, das mit Java in Verbindung steht, und isn Was ist verantwortlich für den Aufbau der Test-APK? Stattdessen ist es die assembleAndroidTest
Aufgabe, die direkt vor connectedAndroidTest
kommt, die es tut. Sie haben Recht mit der connectedAndroidTest
obwohl, es installiert tatsächlich und führt die Test-APK. Aber ich komme gleich dazu. Der Rest meiner Antwort ist detaillierter, als es nötig ist, um die Aufgabe effektiv zu nutzen, ist aber nützlich, wenn Sie verstehen wollen, wie es funktioniert.
Ein Hintergrund
Wie viele andere Android-Gradle-Plug-in-Aufgaben wird ConnectedAndroidTest aufgrund der verschiedenen Build-Varianten (Debug, Release, Flavor 1, Flavor 2 usw.) irgendwann in der Ausführungsphase zusammengestellt. Daher steht Ihnen connectedAndroidTest
in der Konfigurationsphase nicht zur Verfügung (wenn der Großteil Ihrer Build-Skript-Logik ausgeführt wird). Stattdessen wird es nach der Erstellung als connectedInstrumentTest
-Eigenschaft (im Grunde ein Feld) der testVariants
-Eigenschaft im android
-Objekt festgelegt.
Als ein Beispiel zur Verdeutlichung, wenn Sie auf diese Aufgabe zugreifen möchten, um sie irgendwie zu manipulieren (fügen Sie vielleicht ein Action
an das Ende davon ein), können Sie so etwas in Ihrer build.gradle
-Datei tun:
Und dann ./gradlew -q cAT
Ich füge also eine Aktion an das Ende der Aufgabe, die erstellt und der Eigenschaft connectedInstrumentTest
zugewiesen wurde, die ziemlich tief im Objekt android
verschachtelt ist. Diese Aufgabe wird wahrscheinlich connectedDebugAndroidTest
oder etwas Ähnliches sein.
Was macht die Aufgabe?
Nun können wir anhand der type-Eigenschaft, die ich in den letzten println eingegeben habe, sehen, dass die Klasse der Aufgabe tatsächlich com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask_Decorated
ist. Um ehrlich zu sein, ich bin mir noch nicht sicher, woher das _Decorated
Teil kommt, aber eine Google-Suche nach dem Rest des Klassennamens liefert uns die Quellcode für die Basisklasse der Aufgabe.
Der Hauptteil Action
der Aufgabe wird runTests()
genannt und zeigt Ihnen mehr oder weniger, wie die Aufgabe ihre Aufgabe erfüllt. Wenn Sie den Quellcode ein wenig herumlaufen lassen, werden Sie schließlich feststellen, dass der Befehl adb pm install
verwendet wird, um die apk zu installieren.
Obwohl ich es nicht ganz finden konnte, vermute ich, dass irgendwo anders der ADB-Befehl adb shell am instrument -w com.package.name/android.support.test.runner.AndroidJUnitRunner
verwendet wird, um die Tests endlich zu fahren.
Ich hoffe, das war nicht zu verwirrend - ich habe das meiste erst kürzlich gelernt, also sind manche Dinge vielleicht nicht 100%. Ich würde vorschlagen, die Gradle-Dokumente zu bearbeiten, insbesondere, wie man ein benutzerdefiniertes Plugin und eine benutzerdefinierte Aufgabe erstellt, und auch die Android-Gradle-Plug-in Werkzeugdokumentation.
Um die allgemeinere Frage zu beantworten: "Was sind die Aufgaben, die die Aufgabe <taskName>
ausführt?" gibt es zwei einfache Möglichkeiten, dies für jede Aufgabe herauszufinden.
Der erste ist:
%Vor% Dabei sollte <taskName>
durch die Aufgabe ersetzt werden, die Ihnen wichtig ist. Zum Beispiel ./gradlew tasks --all | grep connectedDebugAndroidTest
. Beachten Sie, dass ich durch grep
gehe, um mir die Mühe zu ersparen, die Liste aller Aufgaben manuell zu durchsuchen.
Der zweite ist:
Verwenden Sie das Task-Tree Plugin. Nach der Anwendung sieht die Verwendung folgendermaßen aus:
%Vor%Oder wie es mir normalerweise lieber ist:
%Vor%Die letztere Option macht die Ausgabe etwas weniger überladen.
Tags und Links android android-testing