Criar um teste orientado por host na Trade Federation

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

Consideramos "lado do host" de teste e "orientado por host" testes sejam ligeiramente diferente:

  • teste orientado por host: é um teste em execução no host que interage com um ou mais dispositivos. O sistema em teste (SUT) não está no host, mas está que estão sendo testados a partir do host.
  • teste no lado do host: é um teste executado puramente no host e que testa algo somente no host, como em 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 a emissão de Reinicialização do comando. No caso de teste de instrumentação, uma reinicialização eliminaria de hardware, o teste não pôde continuar e nenhum resultado estaria disponível.

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

Um teste orientado por host pode lidar com esses casos de uso e permitir testes avançados de o dispositivo com mais cenários. Se você está nessa situação, escrever um conduzido por host faz mais sentido.

Como os testes orientados por host são escritos no TF?

Aqui está 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 conduzidos pelo host na Trade Federation são realizados pelo DeviceJUnit4ClassRunner executor de testes do JUnit4. A estrutura geral da classe de teste é a mesma de teste JUnit4 comum:

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

Extensão de BaseHostJunit4Test é uma maneira de herdar a API 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 destino. dispositivo.
  • 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 ou não. (pm list features).
  • runDeviceTests(DeviceTestRunOptions options): executar uma instrumentação testar em um dispositivo de destino usando DeviceTestRunOptions para lidar com todas as opções possíveis.

Forneça também acesso ao objeto de dispositivo Tradefed:

  • getDevice(): retorna um objeto de dispositivo TF para manipular o dispositivo.
  • getBuild(): retorna um objeto do TF de informações do build para receber informações sobre o ser construído.
  • 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 impossibilita o uso do gerenciador #getDevice() para fazer algumas específica para o dispositivo, configuração ou limpeza única, por classe. Para resolver esse problema, use a anotação Tradefed.

  • @BeforeClassWithInfo: é executada antes das anotações @BeforeClass
  • @AfterClassWithInfo: é executada depois das 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 que você use as propriedades do dispositivo e da loja que podem ser usadas em escopo estático ou não estático. BaseHostJUnit4Test suporta receber TestInformation em um escopo não estático usando #getTestInformation().

Se você não estender BaseHostJUnit4Test, será possível implementar ITestInformationReceiver para receber o objeto TestInformation.

Como configurar um teste orientado por host no Tradefed?

No arquivo de configuração XML do Tradefed, os testes orientados por host são executados por meio do HostTest (em inglês) runner.

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