Sharding testen

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 Test-Runner 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 und GTest.

Tradefed unterstützt zwei Arten von Sharding: lokal und verteilt. Sie haben einige Gemeinsamkeiten. Auf dieser Seite werden daher zuerst 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.

Lokale Fragmentierung

Lokales Sharding bedeutet, dass alle Geräte, die an der Ausführung des geshardeten Aufrufs beteiligt sind, mit demselben physischen Host verbunden sind.

Ausführung

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, überall befinden und mit verschiedenen physischen Hosts verbunden sein können.

Ausführung

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, sodass alle Tests ausgeführt werden.

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 deklarieren, 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 stimmt mit TokenProperty von Tradefed überein 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 auf keinem Gerät eine SIM-Karte vorhanden ist, schlägt das Testmodul fehl.

Implementierung

Übergeben Sie dieses Funktions-Flag an die Hauptbefehlszeile von Tradefed:

--enable-token-sharding