Escreva um teste orientado por host na Trade Federation

Esta página descreve como escrever um teste de dispositivo estilo JUnit4 conduzido pelo host. Isso significa que o lado host do chicote irá desencadear ações contra o dispositivo.

Observe que consideramos os testes "do lado do host" e os testes "orientados pelo host" um pouco diferentes:

  • teste controlado por host: é um teste executado no host que interage com um ou mais dispositivos. O sistema em teste (SUT) não está no host em si, mas está sendo testado no 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 orientado a 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 interromperia a instrumentação, o teste não poderia continuar e nenhum resultado estaria disponível.

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

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

Como os testes orientados a host são escritos em 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 controlados por host na Trade Federation são conduzidos pelo executor de testes DeviceJUnit4ClassRunner JUnit4. A estrutura geral da classe de teste é a mesma de um teste JUnit4 normal:

  • @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 : 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.

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 TF de informações de construção para obter informações sobre a construção.
  • getAbi() : Retorna a ABI em que 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 torna impossível usar o 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 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 suporta a obtenção de TestInformation em um escopo não estático via #getTestInformation() .

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

Como configurar um teste controlado por 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>