Frage Wie kann ich meine unabhängigen Robotium UI-Tests parallel ausführen?


Ich verwende Jenkins für meine kontinuierliche Android-Integration. Ich habe einige isolierte, unabhängige Robotium-UI-Tests, die derzeit 12 Minuten dauern, um seriell gegen einen einzelnen Emulator zu laufen. Kann jemand einen guten Weg empfehlen, sie parallel laufen zu lassen, so dass es nur 6 Minuten (oder weniger) dauert?

Ich weiß über verschiedene Möglichkeiten, um die voll Testsuite parallel auf mehreren Geräten / Emulatoren, z.B. Siehe die Mehrfachkonfigurationsjob (Matrix) Abschnitt des Jenkins Android Emulator Plugins, Löffeloder Cloud-Test-Unternehmen mögen AppThwack.

Ich weiß, wie ich eine bestimmte Teilmenge meiner Tests unter Verwendung von JUnit-Annotationen ausführen kann, oder anscheinend unterstützt Spoon eine ähnliche Funktion (siehe meine Frage dazu).

Ich verwende jetzt Spoon, um meine vollständige Testsuite auszuführen (hauptsächlich, um die schöne HTML-Ausgabe mit Screenshots zu nutzen). Wenn jemand Tipps hat, wie ich meine Tests am besten aufteilen und parallel laufen lassen kann, wäre das großartig.

Ich nehme an, ich könnte dies erreichen, indem ich die Tests in zwei separate CI-Jobs aufspalte, aber es klingt wie ein Schmerz, zwei getrennte Jobs zu erhalten und die Ergebnisse zu kombinieren.


15
2017-07-20 00:51


Ursprung


Antworten:


Aktualisieren: Ich habe hinzugefügt eine andere Antwort was meiner Meinung nach zu einer saubereren und prägnanteren Jenkins-Konfiguration führt und direkter auf Spoon basiert.


Ich habe gerade die Jenkins entdeckt MultiJob Plugin Damit können Sie mehrere Jobs parallel in einer Phase ausführen.

Unten ist meine Arbeit, aber ein wenig zerbrechlicher Ansatz, dies zu tun mit dem Gabel Plugin. Ich verwende manuell konfigurierte reguläre Ausdrücke, um die Tests zu partitionieren (das war der Hauptgrund, warum ich Fork zu benutzen versuchte - es unterstützt die Verwendung von Regex).

Der MultiJob sieht bei mehreren nachgeordneten Jobs in einer Phase folgendermaßen aus:

multi_job_summary

Hauptaufgabe Konfiguration 

So ist mein "Android Multi Job" konfiguriert:

multi_job_summary_1 multi_job_summary_2

Downstream-Jobkonfiguration 

Hier ist, wie die Downstream "Android Phase N" Jobs konfiguriert sind (mit anderen android.test.classes reguläre Ausdrücke für jedes):

downstream_config

Gotchas

  • Fork kann derzeit nicht wie geplant auf Gradle v1.0.0 ausgeführt werden Problem # 6.
  • Wenn Sie möchten, dass ein Fork-Regex mehreren verschiedenen Paketen entspricht, müssen Sie die Regex durch Kommas voneinander trennen. Dies ist im Fork-Projekt nicht sehr gut dokumentiert, aber ihre TestClassFilter-Quelle zeigt Ihnen, wie sie die Regex interpretieren.
  • Alle abstrakten Testklassen müssen benannt werden Abstract*Andernfalls versucht Fork, sie als Tests auszuführen, was zu störenden Fehlern führt. Ihr TestClassScanner steuert dies, und Problem # 5 Spuren ändern dies.
  • IIRC, du musst das haben Fingerabdruck-Plugin installiert, damit die Option "Nachgeordnete Testergebnisse aggregieren" funktioniert. Wenn Sie es nicht installiert haben, wird dieser Fehler angezeigt: "Fingerprinting ist in diesem Build nicht aktiviert. Die Testaggregation erfordert Fingerabdrücke."

Einschränkungen

  • Testergebnisse werden aggregiert, aber nur mit den JUnit XML-Testberichten. Dies bedeutet, dass Sie sich zu jedem nachgelagerten Job durchklicken müssen, um schöne HTML-Ergebnisse anzuzeigen.
  • Das manuelle Partitionieren Ihrer Tests auf Basis von regulären Ausdrücken kann mühsam und fehleranfällig sein. Wenn Sie diesen Ansatz verwenden, empfehle ich Ihnen immer noch einen nächtlichen / wöchentlichen Jenkins-Job, um Ihre vollständige Testsuite an einem einzigen Ort auszuführen, um sicherzustellen, dass Sie nicht versehentlich Tests verlieren.
  • Dieser MultiJob-Ansatz erfordert, dass Sie jeden nachgeordneten Job manuell konfigurieren, einen für jeden Slave-Knoten, den Sie verwenden möchten. Wir haben einen besseren Ansatz mit einem Matrix-Job entwickelt, bei dem nur alles in einem Jenkins-Job konfiguriert werden muss. Wir werden versuchen, das in den nächsten Wochen zu schreiben.

Futures

Wir haben auch eine Art der Erweiterung entwickelt Löffel (Die Ausgabe ist schöner als Gabel) um die gesamte Testsuite automatisch auf N Downstream-Jobs zu verteilen. Wir müssen es noch verbessern, um all diese Ergebnisse im Upstream-Job auf eine einzige HTML-Seite zurückzuschicken, aber leider ein Fehler im Jenkins "Copy To Slave" -Plugin blockiert dies von der Arbeit im Moment.


6
2017-07-26 05:46



Sie können dies in 3 Schritten durchführen:

  1. Erstellen Sie 2 Knoten, die auf den einzelnen Zielcomputer zeigen (was Ihrer Bedingung entspricht, Tests auf demselben Computer auszuführen).
  2. Im Job während der Ausführung verwenden Sie die Jenkins - Umgebungsvariable $ NODE_NAME und weisen jedem Knoten unterschiedliche Tests zu (möglicherweise benötigen Sie die NodeLabel Parameter Plugin).
  3. Nach der Ausführung haben Sie 2 Berichtsdateien, glücklicherweise auf demselben Rechner. Sie können sie entweder zu einem zusammenführen, wenn es sich um Textdateien handelt, oder um XML zu erstellen, ähnlich wie das PerfPublisher-Plugin-Format, das Ihnen einen detaillierten Bericht liefert.

Dies bedeutet, dass Sie mit einem einzigen Job tatsächlich zwei Testsätze auf demselben Computer ausführen können (zwei Knoten, die auf den Computer zeigen). Einen einzelnen Bericht zu erhalten wäre schwierig, aber wenn ich das Format kenne, kann ich helfen.

Ich hoffe, das ist nützlich


4
2017-07-22 07:13



Diese Antwort ist eine Verbesserung meiner vorherige MultiJob Antwort.


Der beste Weg, den ich gefunden habe, ist einen Jenkins-Matrix-Job zu verwenden (alias "Multi-Konfigurations-Projekt"). Dies ist sehr praktisch, da Sie alles in einem Jenkins-Job konfigurieren können.

Löffel unterstützt jetzt a --e Option, mit der Sie Argumente direkt an den Instrumentierungslauf übergeben können. Ich habe ihre README-Datei mit einem aktualisiert Abschnitt über Test-Sharding.

Diese README sollte dir geben, was du brauchst, aber hier sind weitere Highlights aus unserer Jenkins-Jobkonfiguration, falls das hilft.

Das User-defined Axis legt die Anzahl der Slave-Knoten fest, die wir ausführen möchten. Wir müssen das Label auf setzen android damit unser Cloud-Anbieter einen geeigneten Slave starten kann.

matrix_configuration

Wir haben ein run-build.sh Skript, das Spoon mit den richtigen Parametern aufruft. Wir müssen die Gesamtzahl der Knoten (in diesem Fall) übergeben 6) und der Index des spezifischen Slave - Knotens, der gerade ausgeführt wird (automatisch in der node_indexVariable).

matrix_build

Die Post-Build-Schritte sollten sich nicht von Ihren bestehenden unterscheiden. In Zukunft werden wir wahrscheinlich etwas hinzufügen müssen, um die Ergebnisse auf dem Master-Knoten zu sammeln (dies war überraschend schwierig herauszufinden). Momentan können Sie noch auf Ergebnisse zu den Slaves klicken.

matrix_post_build


0
2018-04-13 18:38



Sie können zum Beispiel Jenkins MultiJob Plugin und Testdroid API, um Ihre APKs an echte Geräte zu senden. Das ist wahrscheinlich der einfachste Weg, es zu tun. Ref-Führer Hier.


-2
2017-07-29 12:37