Host-gestützten Test in der Trade Federation schreiben

Auf dieser Seite wird beschrieben, wie Sie einen vom Host gesteuerten Gerätetest im JUnit4-Format schreiben. Das bedeutet, dass die Hostseite des Kabelbaums Aktionen auf dem Gerät auslöst.

„Host-Tests“ und „host-getriebene Tests“ unterscheiden sich geringfügig:

  • Host-gesteuerter Test: 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: Ein Test, der ausschließlich auf dem Host ausgeführt wird und nur etwas auf dem Host testet, z. B. Unit-Tests.

Warum sollten Sie einen hostbasierten Test statt eines Instrumentierungstests erstellen?

Bei einigen Tests müssen Sie möglicherweise den Gesamtstatus des Geräts ändern, z. B. einen Neustartbefehl ausführen. Im Testfall für die Instrumentierung würde ein Neustart die Instrumentierung beenden, der Test könnte nicht fortgesetzt werden und es wären keine Ergebnisse verfügbar.

Hostbasierte Tests können auch zusätzliche Einrichtungsschritte erfordern, die eine Interaktion mit externen Geräten erfordern, von denen der Test abhängt.

Ein hostbasierter Test kann diese Anwendungsfälle verarbeiten und erweiterte Tests des Geräts mit mehr Szenarien ermöglichen. In diesem Fall ist es am sinnvollsten, einen hostbasierten Test zu schreiben.

Wie werden hostbasierte Tests in TF geschrieben?

Hier 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());
    }
}

Host-gestützte Tests in Trade Federation werden vom JUnit4-Test-Runner DeviceJUnit4ClassRunner ausgeführt. Die Gesamtstruktur der Testklasse entspricht der eines regulären JUnit4-Tests:

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

Wenn Sie BaseHostJunit4Test erweitern, können Sie nützliche APIs für Testtools wie die folgenden übernehmen:

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

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

  • getDevice(): Gibt ein TF-Geräteobjekt zurück, mit dem das Gerät manipuliert werden kann.
  • getBuild(): Hiermit wird ein TF-Objekt mit Build-Informationen zurückgegeben, um Informationen zum Build abzurufen.
  • getAbi(): Gibt die ABI zurück, gegen die der Test ausgeführt wird.

Tradefed-Unterstützung: Gerätevorbereitung und -bereinigung nach Geräteklasse

JUnit4 @BeforeClass und @AfterClass gelten nur für statische Methoden. Daher ist es nicht möglich, mit dem #getDevice()-Handler eine gerätespezifische, einmalige Einrichtung oder Bereinigung pro Klasse durchzuführen. Verwenden Sie die Tradefed-Anmerkung, um dieses Problem zu beheben.

  • @BeforeClassWithInfo: Wird vor @BeforeClass-Anmerkungen ausgeführt
  • @AfterClassWithInfo: Wird nach @AfterClass-Anmerkungen 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");
   }

Mit TestInformation können Sie Geräte- und Speichereigenschaften verwenden, die entweder im statischen oder nicht statischen Umfang 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 hostbasierten Test in Tradefed?

In der Tradefed-XML-Konfigurationsdatei werden hostbasierte Tests über den HostTest-Auslöser ausgeführt.

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