Testfragmentierung

Wenn der Testkorpus groß ist oder die Ausführungszeit zu lang wird, können Sie die Tests auf mehrere Geräte aufteilen: Sharding.

Für das Sharding gelten Voraussetzungen, damit der Test-Runner das Sharding unterstützt.

Die meisten der wichtigsten Testläufer unterstützen bereits das Sharding, sodass keine zusätzlichen Arbeiten erforderlich sind. Diese unterstützen bereits das Sharding: Instrumentierungstests, hostseitige Tests und GTest.

In Tradefed werden zwei Arten von Sharding unterstützt: lokal und verteilt. Sie haben einige Gemeinsamkeiten. Auf dieser Seite werden daher zuerst die gemeinsamen Eigenschaften und dann die Besonderheiten der einzelnen Typen beschrieben.

Gemeinsame Eigenschaften

Für beide Formen des Sharding gelten dieselben Eigenschaften für die Testausführer: Shards müssen unabhängig und deterministisch sein. Der erste Schritt bei beiden Shardings besteht darin, die vollständige sortierte Liste der Tests zu erstellen und sie dann in verschiedene Gruppen/Shards aufzuteilen.

Der Hauptunterschied der Fragmentierungsformen liegt in der Art und Weise, wie die Tests ausgeführt werden. Weitere Informationen finden Sie in den folgenden Abschnitten.

Lokales Sharding

Lokale Fragmentierung bedeutet, dass alle Geräte, die an der Ausführung des fragmentierten 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 mit Tests erstellt, die ausgeführt werden müssen, und jedes Gerät prüft, ob es verfügbar ist (d. h., ob der vorherige Test abgeschlossen ist). Das führt zu einer optimierten Geräteauslastung. Wir nennen das auch dynamisches Sharding.

Optionen

--shard-count XX

Verteilte Sharding

Verteilte Fragmentierung bedeutet, dass alle Geräte, die an der Ausführung des fragmentierten Aufrufs beteiligt sind, an einem beliebigen Ort existieren und mit verschiedenen physischen Hosts verbunden sein können.

Umsetzung

Das verteilte Sharding erfolgt beim Erstellen der Liste der Tests. Der Inhalt jedes Shards wird nur für den aktuell angeforderten Shard ausgeführt. So erstellen alle verteilten Shards zuerst dieselbe Liste und führen dann eine sich gegenseitig ausschließende Teilmenge davon aus, was dazu führt, dass 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 ausgewogen ist, da wir die Laufzeit der einzelnen Tests in den einzelnen Shards nicht im Voraus vorhersagen können. Die Verteilung ist so, dass in jedem Shard ungefähr die gleiche Anzahl von Testfällen vorhanden ist.

Optionen

--shard-count XX --shard-index XX

Token-Sharding

Token-Sharding kann nur mit lokalem Sharding verwendet werden. Das Flag ist bei nicht lokalen Sharding-Anwendungsfällen nicht funktionsfähig. Manchmal enthält eines der Geräte, die am Sharding beteiligt sind, 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 würden andernfalls fehlschlagen.

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. Tradefed leitet die Tests dann an ein Gerät weiter, auf dem die Ressource vorhanden ist.

XML-Konfiguration

<option name="config-descriptor:metadata" key="token" value="SIM_CARD" />

Die value des Tokens stimmt mit der 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 kein Gerät den Test ausführen kann?

Wenn keine verfügbaren Geräte die Ressource haben, die dem Testmodul entspricht, wird das Testmodul fehlgeschlagen und übersprungen, da es nicht ordnungsgemäß ausgeführt werden kann.

Wenn ein Testmodul beispielsweise eine SIM-Karte anfordert, aber keine Geräte eine SIM-Karte haben, schlägt das Testmodul fehl.

Implementierung

Übergeben Sie dieses Feature-Flag an die Tradefed-Hauptbefehlszeile:

--enable-token-sharding