Wenn der Testkorpus groß ist oder die Ausführungszeit lang wird, können Sie die Tests auf mehrere Geräte aufteilen (Sharding).
Für Sharding gibt es Voraussetzungen, die der Testrunner erfüllen muss.
Die meisten Haupttest-Runner unterstützen Sharding bereits, sodass keine zusätzlichen Maßnahmen erforderlich sind. Diese unterstützen bereits Sharding: Instrumentierungstests, hostseitig gesteuerte Tests, GTest.
Tradefed unterstützt zwei Arten von Sharding: lokal und verteilt. Sie haben einige Gemeinsamkeiten. Auf dieser Seite werden die gemeinsamen Eigenschaften und dann die Besonderheiten der einzelnen Elemente beschrieben.
Allgemeine Eigenschaften
Bei beiden Formen des Sharding werden dieselben Eigenschaften von den Test-Runnern vorausgesetzt: Shards müssen unabhängig und deterministisch sein. Beim ersten Schritt beider Shardings wird die vollständige geordnete Liste der Tests erstellt und dann in verschiedene Gruppen/Shards aufgeteilt.
Der Hauptunterschied zwischen den Sharding-Formen besteht in der Art und Weise, wie die Tests ausgeführt werden. Weitere Informationen finden Sie in den Abschnitten unten.
Lokales Sharding
Lokales Sharding bedeutet, dass alle Geräte, die an der Ausführung des geshardeten Aufrufs beteiligt sind, mit demselben physischen Host verbunden sind.
Umsetzung
Beim lokalen Sharding werden alle Geräte genutzt, die mit demselben Host verbunden sind. Dazu wird ein Pool von Tests erstellt, die ausgeführt werden müssen. Jedes Gerät fragt Tests ab, wenn es kostenlos ist (d. h. wenn der vorherige Test abgeschlossen ist). Das führt zu einer optimierten Gerätenutzung. Wir nennen es auch dynamisches Sharding.
Optionen
--shard-count XX
Verteiltes Sharding
Verteiltes Sharding bedeutet, dass sich alle Geräte, die an der Ausführung des geshardeten Aufrufs beteiligt sind, an einem beliebigen Ort befinden und mit verschiedenen physischen Hosts verbunden sein können.
Umsetzung
Die verteilte Aufteilung erfolgt beim Erstellen der Liste der Tests. Der Inhalt jedes Shards wird nur für den aktuell angeforderten Shard ausgeführt. Alle verteilten Shards erstellen also zuerst dieselbe Liste und führen dann eine sich gegenseitig ausschließende Teilmenge davon aus. So werden alle Tests ausgeführt.
Die Haupteigenschaft dieser Form ist, dass die Shards sich gegenseitig nicht kennen und unabhängig voneinander ausfallen können.
Der Hauptnachteil besteht darin, dass die Shard-Länge nicht unbedingt ausgeglichen ist, da wir die Laufzeit der einzelnen Tests in den einzelnen Shards nicht im Voraus vorhersagen können. Die Verteilung ist so konzipiert, dass in jedem Shard ungefähr die gleiche Anzahl von Testläufen enthalten ist.
Optionen
--shard-count XX --shard-index XX
Token-Sharding
Token-Sharding kann nur mit lokalem Sharding verwendet werden. Das Flag ist in Anwendungsfällen ohne lokales Sharding nicht funktionsfähig. Manchmal enthält eines der am Sharding beteiligten Geräte spezielle Ressourcen, die andere nicht haben, z. B. eine SIM-Karte. Einige Tests funktionieren möglicherweise nur, wenn diese spezielle Ressource verfügbar ist, und schlagen andernfalls fehl.
Token-Sharding ist unsere Lösung für solche Anwendungsfälle. Testmodule können in ihrem AndroidTest.xml
angeben, welche spezielle Ressource sie benötigen, und Tradefed leitet die Tests an ein Gerät weiter, das die Ressource hat.
XML-Konfiguration
<option name="config-descriptor:metadata" key="token" value="SIM_CARD" />
Die value
des Tokens entspricht TokenProperty
von Tradefed und ist mit einem Handler in TokenProviderHelper
verknüpft.
So können Testmodule auf Geräten ausgeführt werden, die die Tests ordnungsgemäß ausführen können.
Was passiert, wenn der Test auf keinem Gerät ausgeführt werden kann?
Wenn für die Ressource, die dem Testmodul entspricht, keine Geräte verfügbar sind, schlägt das Testmodul fehl und wird übersprungen, da es nicht richtig ausgeführt werden kann.
Wenn für ein Testmodul beispielsweise eine SIM-Karte erforderlich ist, aber keine Geräte eine SIM-Karte haben, schlägt das Testmodul fehl.
Implementierung
Übergeben Sie dieses Feature-Flag an die Hauptbefehlszeile von Tradefed:
--enable-token-sharding