Criar um teste orientado a host na Trade Federation

Nesta página, descrevemos como escrever um teste de dispositivo no estilo JUnit4 controlado pelo host. Isso significa que o lado do host do conector vai acionar ações contra o dispositivo.

Consideramos que os testes "do lado do host" e "controlados pelo host" são um pouco diferentes:

  • Teste controlado pelo host: é um teste executado no host que interage com um ou mais dispositivos. O sistema em teste (SUT) não está no host, mas está sendo testado nele.
  • teste do lado do host: é um teste executado puramente no host e que testa algo apenas no host, por exemplo, testes de unidade.

Por que criar um teste orientado por host em vez de um teste de instrumentação?

Alguns testes podem exigir que você afete o estado geral do dispositivo, como emitir um comando de reinicialização. No caso de teste de instrumentação, uma reinicialização interromperia a instrumentação, o teste não poderia continuar e nenhum resultado estaria disponível.

Os testes controlados pelo host também podem gerar etapas de configuração adicionais que exigem interação com dispositivos externos de que o teste depende.

Um teste controlado pelo host pode lidar com esses casos de uso e permitir testes avançados do dispositivo com mais cenários. Nesse caso, escrever um teste controlado pelo host é o mais adequado.

Como os testes controlados pelo host são escritos no TF?

Confira um exemplo:

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

Os testes controlados pelo host no Trade Federation são controlados pelo executor de testes JUnit4 DeviceJUnit4ClassRunner. A estrutura geral da classe de teste é a mesma de um teste JUnit4 regular:

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

Estender BaseHostJunit4Test é uma maneira de herdar APIs de utilitários de teste úteis, como:

  • installPackage: permite instalar um APK no dispositivo de destino.
  • installPackageAsUser: permite instalar um APK como usuário no dispositivo de destino.
  • uninstallPackage: permite desinstalar um APK.
  • isPackageInstalled: verifica se um pacote está instalado ou não.
  • hasDeviceFeature: verifica se o dispositivo é compatível com um recurso. (pm list features).
  • runDeviceTests(DeviceTestRunOptions options): execute um teste de instrumentação em um dispositivo de destino usando DeviceTestRunOptions para processar todas as opções possíveis.

Também conceda acesso ao objeto do dispositivo Tradefed:

  • getDevice(): retorna um objeto de dispositivo do TF para manipular o dispositivo.
  • getBuild(): retorna um objeto TF de informações de build para receber informações sobre o build.
  • getAbi(): retorna a ABI em que o teste está sendo executado.

Suporte do Tradefed: preparação e limpeza de dispositivos por classe

Os @BeforeClass e @AfterClass do JUnit4 só são aplicáveis a métodos estáticos, o que impossibilita o uso do manipulador #getDevice() para fazer alguma configuração ou limpeza única, por classe e específica do dispositivo. Para resolver esse problema, use a anotação do Tradefed.

  • @BeforeClassWithInfo: é executado antes das anotações @BeforeClass.
  • @AfterClassWithInfo: executado após as anotações @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");
   }

O TestInformation permite usar o dispositivo e armazenar propriedades que podem ser usadas no escopo estático ou não estático. O BaseHostJUnit4Test oferece suporte para receber o TestInformation em um escopo não estático via #getTestInformation().

Se você não estiver estendendo BaseHostJUnit4Test, implemente ITestInformationReceiver para receber o objeto TestInformation.

Como configurar um teste controlado pelo host no Tradefed?

No arquivo de configuração XML do Tradefed, os testes controlados pelo host são executados pelo executor HostTest.

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