Einen hostgesteuerten Test in der Trade Federation schreiben

Auf dieser Seite wird beschrieben, wie Sie einen vom Host gesteuerten Gerätetest im JUnit4-Stil 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-Driven 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, wird aber 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 dieser Situation ist es am sinnvollsten, einen hostgesteuerten 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 APK als Nutzer auf dem Zielgerät.
  • uninstallPackage: Ermöglicht die Deinstallation eines APK.
  • isPackageInstalled: Prüft, ob ein Paket installiert ist oder nicht.
  • hasDeviceFeature: Prüfen, ob das Gerät eine Funktion unterstützt. (pm list features)
  • runDeviceTests(DeviceTestRunOptions options): Mit DeviceTestRunOptions einen Instrumentierungstest auf einem Zielgerät ausführen, um alle möglichen Optionen zu verarbeiten.

Gewähren Sie auch 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, mit der der Test ausgeführt wird.

Tradefed-Support: Vorbereitung und Bereinigung der 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 hostgesteuerte Tests über den Runner HostTest ausgeführt.

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