Schreiben Sie einen hostgesteuerten Test in Trade Federation

Auf dieser Seite wird beschrieben, wie Sie einen vom Host gesteuerten Gerätetest im JUnit4-Stil schreiben. Dies bedeutet, dass die Hostseite des Kabelbaums Aktionen gegen das Gerät auslöst.

Beachten Sie, dass wir „hostseitige“ Tests und „hostgesteuerte“ Tests als etwas unterschiedlich betrachten:

  • Hostgesteuerter Test: Ist ein Test, der auf dem Host ausgeführt wird und mit einem oder mehreren Geräten interagiert. Das zu testende System (SUT) befindet sich nicht auf dem Host selbst, sondern wird vom Host aus getestet.
  • Hostseitiger Test: Ist ein Test, der ausschließlich auf dem Host ausgeführt wird und etwas nur auf dem Host testet, zum Beispiel Unit-Tests.

Warum einen hostgesteuerten Test anstelle eines Instrumentierungstests erstellen?

Bei einigen Tests müssen Sie möglicherweise den Gesamtzustand des Geräts beeinflussen, z. B. einen Neustartbefehl erteilen. Im Fall des Instrumentierungstests würde ein Neustart die Instrumentierung zerstören, der Test könnte nicht fortgesetzt werden und es wären keine Ergebnisse verfügbar.

Hostgesteuerte Tests können auch zu zusätzlichen Einrichtungsschritten führen, die eine Interaktion mit externen Geräten erfordern, von denen der Test abhängt.

Ein hostgesteuerter Test kann diese Anwendungsfälle bewältigen und ermöglicht erweiterte Tests des Geräts mit mehr Szenarien. Wenn Sie sich in dieser Situation befinden, ist das Schreiben eines hostgesteuerten Tests am sinnvollsten.

Wie werden hostgesteuerte Tests in TF geschrieben?

Hier ist ein Beispiel:

@RunWith(DeviceJUnit4ClassRunner.class)
public class SampleHostJUnit4DeviceTest extends BaseHostJUnit4Test {
    @Before
    public void setUp() throws Exception {
       // Some setup
    }

    @Test
    public void testCheckWeHaveDevice() throws Exception {
        Assert.assertNotNull(getDevice());
    }
}

Hostgesteuerte Tests in Trade Federation werden vom JUnit4-Testläufer DeviceJUnit4ClassRunner gesteuert. Die Gesamtstruktur der Testklasse ist die gleiche wie bei einem regulären JUnit4-Test:

  • @BeforeClass
  • @Before
  • @Test
  • @After
  • @AfterClass
  • Assume , Assert

Die Erweiterung von BaseHostJunit4Test ist eine Möglichkeit, nützliche APIs für Testdienstprogramme zu erben, wie zum Beispiel:

  • installPackage : Ermöglicht die Installation einer APK auf dem Zielgerät.
  • installPackageAsUser : Ermöglicht die Installation eines APK als Benutzer auf dem Zielgerät.
  • uninstallPackage : Ermöglicht die Deinstallation einer APK.
  • isPackageInstalled : Überprüfen Sie, ob ein Paket installiert ist oder nicht.
  • hasDeviceFeature : Überprüfen Sie, ob das Gerät eine Funktion unterstützt oder nicht. ( pm list features )
  • runDeviceTests(DeviceTestRunOptions options) : Führen Sie einen Instrumentierungstest für ein Zielgerät mit DeviceTestRunOptions aus, um alle möglichen Optionen zu verarbeiten.

Bieten Sie außerdem Zugriff auf das Tradefed-Geräteobjekt:

  • getDevice() : Gibt ein TF-Geräteobjekt zur Manipulation des Geräts zurück.
  • getBuild() : Gibt ein Build-Info-TF-Objekt zurück, um Informationen über den Build abzurufen.
  • getAbi() : Gibt den ABI zurück, gegen den der Test ausgeführt wird.

Tradefed-Support: Gerätevorbereitung und -bereinigung pro Klasse

JUnit4 @BeforeClass und @AfterClass sind nur auf statische Methoden anwendbar, was es unmöglich macht, den #getDevice() -Handler für gerätespezifische, einmalige Einrichtungs- oder Aufräumarbeiten pro Klasse zu verwenden. Um dieses Problem zu lösen, verwenden Sie die Tradefed-Annotation.

  • @BeforeClassWithInfo: Wird vor @BeforeClass-Annotationen ausgeführt
  • @AfterClassWithInfo: Wird nach @AfterClass-Annotationen ausgeführt
   @BeforeClassWithInfo
   public static void beforeClassWithDevice(TestInformation testInfo) {
       assertNotNull(testInfo.getDevice());
       testInfo.properties().put("mytest:test-prop", "test");
   }

   @AfterClassWithInfo
   public static void afterClassWithDevice(TestInformation testInfo) {
       assertNotNull(testInfo.getDevice());
       testInfo.properties().put("mytest:test-prop", "test");
   }

TestInformation können Sie die Geräte- und Speichereigenschaften verwenden, die entweder im statischen oder nicht statischen Bereich verwendet werden können. BaseHostJUnit4Test unterstützt das Abrufen der TestInformation in einem nicht statischen Bereich über #getTestInformation() .

Wenn Sie BaseHostJUnit4Test nicht erweitern, können Sie ITestInformationReceiver implementieren, um das TestInformation Objekt zu empfangen.

Wie konfiguriere ich einen hostgesteuerten Test in Tradefed?

In der XML-Konfigurationsdatei von Tradefed werden hostgesteuerte Tests über den HostTest- Runner ausgeführt.

<test class="com.android.tradefed.testtype.HostTest" >
    <option name="class" value="android.sample.cts.SampleHostJUnit4DeviceTest" />
</test>