Scrivere un test basato sull'host in Trade Federation

Questa pagina descrive come scrivere un test del dispositivo in stile JUnit4 basato sull'host. Ciò significa che il lato host dell'harness attiverà le azioni sul dispositivo.

Tieni presente che consideriamo i test "lato host" e i test "basati sull'host" leggermente diversi:

  • Test basato sull'host: è un test eseguito sull'host che interagisce con uno o più dispositivi. Il sistema in fase di test (SUT) non si trova sull'host stesso, ma viene testato dall'host.
  • Test lato host: è un test eseguito esclusivamente sull'host e che testa qualcosa solo sull'host, ad esempio i test delle unità.

Perché creare un test basato sull'host anziché un test di strumentazione?

Alcuni test potrebbero richiedere di influire sullo stato generale del dispositivo, ad esempio l'emissione di un comando di riavvio. Nello scenario di test di strumentazione, un riavvio interromperebbe la strumentazione, il test non potrebbe continuare e non sarebbero disponibili risultati.

I test basati sull'host possono anche guidare passaggi di configurazione aggiuntivi che richiedono l'interazione con dispositivi esterni da cui dipende il test.

Un test basato sull'host può gestire questi casi d'uso e consentire test avanzati del dispositivo con più scenari. Se ti trovi in questa situazione, scrivere un test basato sull'host è la soluzione più logica.

Come vengono scritti i test basati sull'host in TF?

Ecco un esempio:

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

I test basati sull'host in Trade Federation sono basati sul runner di test DeviceJUnit4ClassRunner JUnit4. La struttura generale della classe di test è la stessa di un normale test JUnit4:

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

L'estensione di BaseHostJunit4Test è un modo per ereditare le API di utilità di test utili, ad esempio:

  • installPackage: consente di installare un APK sul dispositivo di destinazione.
  • installPackageAsUser: consente di installare un APK come utente sul dispositivo di destinazione.
  • uninstallPackage: consente di disinstallare un APK.
  • isPackageInstalled: verifica se un pacchetto è installato o meno.
  • hasDeviceFeature: verifica se il dispositivo supporta una funzionalità o meno. (pm list features)
  • runDeviceTests(DeviceTestRunOptions options): esegue un test di strumentazione su un dispositivo di destinazione utilizzando DeviceTestRunOptions per gestire tutte le opzioni possibili.

Fornisce inoltre l'accesso all'oggetto del dispositivo Tradefed:

  • getDevice(): restituisce un oggetto del dispositivo TF per manipolare il dispositivo.
  • getBuild(): restituisce un oggetto TF di informazioni sulla build per ottenere informazioni sulla build.
  • getAbi(): restituisce l'ABI su cui viene eseguito il test.

Supporto di Tradefed: preparazione e pulizia del dispositivo per classe

@BeforeClass e @AfterClass di JUnit4 sono applicabili solo ai metodi statici, il che rende impossibile utilizzare l'handler #getDevice() per eseguire una configurazione o una pulizia una tantum specifica per il dispositivo e per classe. Per risolvere il problema, utilizza l'annotazione Tradefed.

  • @BeforeClassWithInfo: viene eseguito prima delle annotazioni @BeforeClass
  • @AfterClassWithInfo: viene eseguito dopo le annotazioni @AfterClass
   @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 consente di utilizzare il dispositivo e memorizzare le proprietà che possono essere utilizzate nell'ambito statico o non statico. BaseHostJUnit4Test supporta l'ottenimento di TestInformation in un ambito non statico tramite #getTestInformation().

Se non estendi BaseHostJUnit4Test, puoi implementare ITestInformationReceiver per ricevere l'oggetto TestInformation.

Come configurare un test basato sull'host in Tradefed?

Nel file di configurazione XML di Tradefed, i test basati sull'host vengono eseguiti tramite il HostTest runner.

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