Criar um teste orientado por host na Trade Federation

Esta página descreve como escrever um teste de dispositivo no estilo JUnit4 dirigido pelo host. Isso significa que o lado do host do harness vai acionar ações contra o dispositivo.

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

  • Teste orientado por host: é um teste em execução no host que interage com um ou mais dispositivos. O sistema em teste (SUT, na sigla em inglês) não está no host, mas está sendo testado nele.
  • Teste no 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 pelo host em vez de um teste de instrumentação?

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

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

Um teste orientado pelo host pode lidar com esses casos de uso e permitir testes avançados do dispositivo com mais cenários. Se você estiver nessa situação, escrever um teste orientado pelo host é mais adequado.

Como os testes orientados pelo host são escritos em 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 orientados pelo host na Trade Federation são conduzidos pelo executor de testes do 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 um 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 oferece suporte a um recurso ou não. (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 forneça acesso ao objeto de dispositivo Tradefed:

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

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

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

  • @BeforeClassWithInfo: é executada 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");
   }

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

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

Como configurar um teste orientado pelo host no Tradefed?

No arquivo de configuração XML do Tradefed, os testes orientados por host são executados pelo executador HostTest.

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