Testfragmentierung

Wenn der Testkorpus groß ist oder die Ausführungszeit lang wird, bieten wir die Möglichkeit, die Tests auf mehrere Geräte aufzuteilen: Sharding .

Für Sharding gelten Voraussetzungen , damit der Testläufer Sharding unterstützt.

Die Mehrheit der Haupttestläufer unterstützt bereits Sharding, sodass kein zusätzlicher Aufwand erforderlich ist. Diese unterstützen bereits Sharding: Instrumentierungstests, hostseitige Tests, GTest.

Es gibt zwei Arten von Sharding, die wir in Tradefed unterstützen: lokal und verteilt. Sie haben einige Gemeinsamkeiten, daher beschreibt diese Seite die gemeinsamen Eigenschaften und dann die Besonderheiten der einzelnen.

Gemeinsame Eigenschaften

Beide Sharding-Formen setzen von den Testläufern die gleichen Eigenschaften voraus: Shards müssen unabhängig und deterministisch sein. Der erste Schritt beider Shardings besteht darin, die vollständige geordnete Liste der Tests zu erstellen und sie dann in verschiedene Gruppen/Shards aufzuteilen.

Der Hauptunterschied der Sharding-Formen besteht in der Art und Weise, wie sie die Tests ausführen. Weitere Details finden Sie in den folgenden Abschnitten.

Lokales Sharding

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

Ausführung

Lokales Sharding nutzt den Vorteil, dass alle Geräte mit demselben Host verbunden sind, indem ein Pool von Tests erstellt wird, die ausgeführt werden müssen, und jedes Gerät Tests abfragt, wenn es frei ist (d. h. mit dem vorherigen Test durchgeführt wird). Dies führt zu einer optimierten Geräteauslastung. Wir nennen es auch dynamisches Sharding .

Optionen

--shard-count XX

Verteiltes Sharding

Verteiltes Sharding bedeutet, dass alle an der Ausführung des Sharding-Aufrufs beteiligten Geräte überall leben und mit verschiedenen physischen Hosts verbunden sein können.

Ausführung

Das verteilte Sharding erfolgt beim Erstellen der Testliste, und der Inhalt jedes Shards führt nur den aktuell angeforderten Shard aus. Daher erstellen alle verteilten Shards zunächst 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 besteht darin, dass die Shards überhaupt nichts voneinander wissen und unabhängig voneinander ausfallen können.

Der Hauptnachteil besteht darin, dass die Shard-Länge nicht unbedingt ausgeglichen ist, da wir die Laufzeit jedes Tests in jedem Shard nicht im Voraus vorhersagen können. Die Verteilung erfolgt 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 in nicht-lokalen Sharding-Anwendungsfällen nicht funktionsfähig. Manchmal verfügt eines der am Sharding beteiligten Geräte über spezielle Ressourcen, über die andere nicht verfügen, beispielsweise 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 ihrer AndroidTest.xml angeben, welche spezielle Ressource sie benötigen, und Tradefed leitet die Tests an ein Gerät weiter, das über die Ressource verfügt.

XML-Konfiguration

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

Der value des Tokens stimmt mit TokenProperty von Tradefed überein und ist einem Handler in TokenProviderHelper zugeordnet.

Dadurch 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 Geräte verfügbar sind, deren Ressource mit dem Testmodul übereinstimmt, schlägt das Testmodul fehl und wird übersprungen, da es nicht ordnungsgemäß ausgeführt werden kann.

Wenn beispielsweise ein Testmodul die Ausführung einer SIM-Karte anfordert, aber kein Gerät über eine SIM-Karte verfügt, schlägt das Testmodul fehl.

Implementierung

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

--enable-token-sharding