Was sind die Aufgaben, die ConnectedAndroidTest ausführt?

7

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.

    
ap1234 30.07.2015, 00:50
quelle

2 Antworten

17

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:

%Vor%

Und dann ./gradlew -q cAT

ausführen

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.

    
Dean 20.08.2015, 16:02
quelle
2

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.

    
AutonomousApps 27.10.2016 20:34
quelle

Tags und Links