Schreiben Sie einen Tradefed-Testläufer

Auf dieser Seite wird beschrieben, wie Sie einen neuen Testläufer in Tradefed schreiben.

Hintergrund

Wenn Sie neugierig auf den Platz von Testläufern in der Tradefed-Architektur sind, lesen Sie Struktur eines Testläufers .

Dies ist keine Voraussetzung für das Schreiben eines neuen Testläufers; Testläufer können isoliert geschrieben werden.

Das absolute Minimum: Implementieren Sie die Schnittstelle

Das absolute Minimum, um sich als Tradefed-Testläufer zu qualifizieren, ist die Implementierung der IRemoteTest-Schnittstelle und insbesondere der run(TestInformation testInfo, ITestInvocationListener listener) -Methode.

Diese Methode wird vom Harness aufgerufen, wenn der Test-Runner verwendet wird, ähnlich einem Java Runnable.

Jeder Teil dieser Methode wird als Teil der Testläuferausführung betrachtet.

Melden Sie die Ergebnisse des Testläufers

Die run Methode in der Basisschnittstelle ermöglicht den Zugriff auf ein Listener-Objekt vom Typ ITestInvocationListener . Dieses Objekt ist der Schlüssel zur Meldung strukturierter Ergebnisse vom Testläufer an den Kabelbaum.

Durch die Meldung strukturierter Ergebnisse verfügt ein Testläufer über die folgenden Eigenschaften:

  • Geben Sie eine ordnungsgemäße Liste aller durchgeführten Tests an, wie lange sie gedauert haben und ob sie einzeln bestanden wurden, nicht bestanden wurden oder sich in einem anderen Zustand befanden.
  • Melden Sie gegebenenfalls mit den Tests verknüpfte Metriken, zum Beispiel Metriken zur Installationszeit.
  • Integrieren Sie die meisten Infrastrukturtools, z. B. Anzeigeergebnisse und Metriken usw.
  • In der Regel einfacher zu debuggen, da eine detailliertere Verfolgung der Ausführung erfolgt.

Allerdings ist die Meldung strukturierter Ergebnisse optional; Ein Testläufer möchte möglicherweise einfach den Status des gesamten Laufs als BESTANDEN oder FEHLGESCHLAGEN bewerten, ohne Einzelheiten zur tatsächlichen Ausführung zu nennen.

Die folgenden Ereignisse können auf dem Listener aufgerufen werden, um den Harness über den aktuellen Fortschritt der Ausführungen zu informieren:

  • testRunStarted: Benachrichtigen Sie den Beginn einer Gruppe von Testfällen, die miteinander in Zusammenhang stehen.
    • testStarted: Benachrichtigen Sie den Beginn eines Testfalls.
    • testFailed/testIgnored: Benachrichtigen Sie die Statusänderung des laufenden Testfalls. Ein Testfall ohne Zustandsänderung gilt als bestanden.
    • testEnded: Benachrichtigen Sie das Ende des Testfalls.
  • testRunFailed: Benachrichtigt, dass der Gesamtstatus der Ausführung der Gruppe von Testfällen ein Fehler ist. Ein Testlauf kann unabhängig von den Ergebnissen des Testfalls bestanden oder fehlgeschlagen sein, je nachdem, was die Ausführung erwartet hat. Beispielsweise könnte eine Binärdatei, die mehrere Testfälle ausführt, alle bestandenen Testfälle melden, jedoch mit einem Fehler-Exit-Code (aus beliebigen Gründen: durchgesickerte Dateien usw.).
  • testRunEnded: Benachrichtigen Sie das Ende der Testfallgruppe.

Die Aufrechterhaltung und Sicherstellung der richtigen Reihenfolge der Rückrufe liegt in der Verantwortung des Testläufer-Implementierers. Er stellt beispielsweise sicher, dass testRunEnded im Ausnahmefall mithilfe einer finally -Klausel aufgerufen wird.

Rückrufe von Testfällen ( testStarted , testEnded usw.) sind optional. Ein Testlauf kann ohne Testfälle erfolgen.

Möglicherweise stellen Sie fest, dass diese Ereignisstruktur von der typischen JUnit-Struktur inspiriert ist. Dies geschieht mit der Absicht, die Dinge nahe an etwas Grundlegendem zu halten, über das Entwickler normalerweise Kenntnisse haben.

Berichtsprotokolle vom Testläufer

Wenn Sie Ihre eigene Tradefed-Testklasse oder Ihren eigenen Tradefed-Testläufer schreiben, implementieren Sie IRemoteTest und erhalten einen ITestInvocationListener über die run() Methode. Mit diesem Listener können Dateien wie folgt protokolliert werden:

    listener.testLog(String dataName, LogDataType type_of_data, InputStreamSource data);

Testen Sie mit einem Gerät

Die obige Mindestschnittstelle ermöglicht die Ausführung sehr einfacher Tests, die isoliert sind und keine besonderen Ressourcen erfordern, beispielsweise Java-Komponententests.

Testautoren, die mit dem nächsten Schritt des Gerätetests fortfahren möchten, benötigen die folgenden Schnittstellen:

  • IDeviceTest ermöglicht den Empfang des ITestDevice Objekts, das das zu testende Gerät darstellt, und stellt die API für die Interaktion mit ihm bereit.
  • Mit IBuildReceiver kann der Test das im Build-Provider-Schritt erstellte IBuildInfo Objekt abrufen, das alle Informationen und Artefakte im Zusammenhang mit dem Test-Setup enthält.

Testläufer sind normalerweise an diesen Schnittstellen interessiert, um Artefakte im Zusammenhang mit der Ausführung zu erhalten, beispielsweise zusätzliche Dateien, und um das zu testende Gerät zu erhalten, das während der Ausführung als Ziel verwendet wird.

Testen Sie mit mehreren Geräten

Tradefed unterstützt die gleichzeitige Ausführung von Tests auf mehreren Geräten. Dies ist nützlich, wenn Sie Komponenten testen, die eine externe Interaktion erfordern, z. B. die Kopplung eines Telefons und einer Uhr.

Um einen Testläufer zu schreiben, der mehrere Geräte verwenden kann, müssen Sie IMultiDeviceTest implementieren, der es ermöglicht, eine Zuordnung von ITestDevice zu IBuildInfo zu erhalten, die die vollständige Liste der Gerätedarstellungen und die zugehörigen Build-Informationen enthält.

Der Setter der Schnittstelle wird immer vor der run Methode aufgerufen, daher kann davon ausgegangen werden, dass die Struktur verfügbar ist, wenn run aufgerufen wird.

Tests sind sich ihrer Setups bewusst

Einige Test-Runner-Implementierungen benötigen möglicherweise Informationen über das gesamte Setup, um ordnungsgemäß zu funktionieren, beispielsweise einige Metadaten über den Aufruf oder darüber, welcher target_preparer zuvor ausgeführt wurde usw.

Um dies zu erreichen, kann ein Testläufer auf das IConfiguration Objekt zugreifen, zu dem es gehört und in dem es ausgeführt wird. Weitere Einzelheiten finden Sie in der Beschreibung des Konfigurationsobjekts .

Für die Test-Runner-Implementierung müssen Sie den IConfigurationReceiver implementieren, um das IConfiguration Objekt zu empfangen.

Flexibler Testläufer

Testläufer können eine flexible Möglichkeit zur Ausführung ihrer Tests bieten, wenn sie eine detaillierte Kontrolle über sie haben. Beispielsweise kann ein JUnit-Testläufer jeden Unit-Test einzeln ausführen.

Dadurch kann der größere Kabelbaum und die Infrastruktur diese Feinsteuerung nutzen und Benutzer können den Testläufer teilweise über Filterung ausführen.

Die Filterunterstützung wird in der ITestFilterReceiver-Schnittstelle beschrieben, die den Empfang von Sätzen von include und exclude für die Tests ermöglicht, die ausgeführt werden sollen oder nicht.

Unsere Konvention besteht darin, dass ein Test dann ausgeführt wird, wenn er mit einem oder mehreren der Einschlussfilter übereinstimmt UND mit keinem der Ausschlussfilter übereinstimmt. Wenn keine Einschlussfilter angegeben sind, sollten alle Tests ausgeführt werden, solange sie keinem der Ausschlussfilter entsprechen.