Escreva um teste orientado por host na Trade Federation

Esta página descreve como escrever um teste de dispositivo no estilo JUnit4 controlado pelo host. Isso significa que o lado do host do arnês irá acionar ações contra o dispositivo.

Observe que consideramos os testes "host-side" e "host-driven" ligeiramente diferentes:

  • teste orientado a host: é um teste em execução no host que interage com um ou mais dispositivos. O sistema em teste (SUT) não está no próprio host, mas está sendo testado a partir do host.
  • teste do lado do host: é um teste executado puramente no host e testando algo apenas no host, por exemplo, testes de unidade.

Por que criar um teste controlado 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 encerraria a instrumentação, o teste não poderia continuar e nenhum resultado estaria disponível.

Os testes controlados por host também podem direcionar etapas de configuração adicionais que requerem interação com dispositivos externos dos quais o teste depende.

Um teste orientado a 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 controlado por host faz mais sentido.

Como os testes baseados em host são escritos em TF?

Aqui está uma amostra:

@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 por host no Trade Federation são controlados pelo executor de teste DeviceJUnit4ClassRunner JUnit4. 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 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 dispositivo de destino.
  • uninstallPackage : permite desinstalar um APK.
  • isPackageInstalled : Verifica se um pacote está instalado ou não.
  • hasDeviceFeature : Verifique se o dispositivo suporta 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 lidar com 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 TF de informações de compilação para obter informações sobre a compilação.
  • getAbi() : Retorna a ABI contra a qual o teste está sendo executado.

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

JUnit4 @BeforeClass e @AfterClass são aplicáveis ​​apenas a métodos estáticos, o que impossibilita o uso do manipulador #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: é 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");
   }

TestInformation permite que você use o dispositivo e armazene propriedades que podem ser usadas no escopo estático ou não estático. BaseHostJUnit4Test dá suporte à obtenção de TestInformation em um escopo não estático por meio de #getTestInformation() .

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

Como configurar um teste orientado a host no Tradefed?

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

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