Fragmentação de testes

Quando o corpus de teste é grande ou o tempo de execução se torna longo, oferecemos a possibilidade de dividir os testes em vários dispositivos: fragmentação.

A fragmentação tem pré-requisitos para que o executor de testes ofereça suporte a ela.

A maioria dos principais executores de testes já oferece suporte à fragmentação, então nenhum trabalho extra é necessário. Os seguintes já oferecem suporte à fragmentação: testes de instrumentação, testes orientados pelo host e GTest.

Há dois tipos de fragmentação com suporte no Tradefed: local e distribuída. Eles compartilham algumas semelhanças, então esta página descreve as propriedades comuns e as especificidades de cada um.

Propriedades comuns

Ambas as formas de fragmentação assumem as mesmas propriedades dos executores de testes: os fragmentos precisam ser independentes e determinísticos. A primeira etapa de ambas as fragmentações é criar a lista completa e ordenada dos testes e dividi-los em diferentes grupos/fragmentos.

A principal diferença das formas de fragmentação está na maneira como elas executam os testes. Mais detalhes nas seções abaixo.

Fragmentação local

Fragmentação local significa que todos os dispositivos envolvidos na execução da invocação fragmentada estão conectados ao mesmo host físico.

Execução

A fragmentação local aproveita todos os dispositivos conectados ao mesmo host, criando um pool de testes que precisam ser executados e fazendo com que cada dispositivo pesquise testes quando estiver livre (ou seja, concluído com o teste anterior). Isso resulta em uma utilização otimizada do dispositivo. Também chamamos isso de fragmentação dinâmica.

Opções

--shard-count XX

Fragmentação distribuída

Fragmentação distribuída significa que todos os dispositivos envolvidos na execução da invocação fragmentada podem estar em qualquer lugar e conectados a hosts físicos diferentes.

Execução

A fragmentação distribuída ocorre ao criar a lista de testes, e o conteúdo de cada fragmento executa apenas o fragmento solicitado no momento. Portanto, todos os fragmentos distribuídos criam a mesma lista no início e, em seguida, executam um subconjunto mutuamente exclusivo dela, o que resulta na execução de todos os testes.

A principal propriedade dessa forma é que os fragmentos são completamente desconhecidos uns dos outros e podem falhar de forma independente.

A principal desvantagem é que o comprimento do fragmento não é necessariamente equilibrado simplesmente porque não podemos prever com antecedência o tempo de execução de cada teste em cada fragmento. A distribuição é feita para ter aproximadamente o mesmo número de casos de teste em cada fragmento.

Opções

--shard-count XX --shard-index XX

Fragmentação de token

Fragmentação de token só pode ser usada com fragmentação local. A flag está inoperante em casos de uso de fragmentação não local. Às vezes, um dos dispositivos envolvidos na fragmentação contém recursos especiais que outros não têm, como um chip. Alguns testes só funcionam quando esse recurso especial está disponível e falham caso contrário.

A fragmentação de token é nossa solução para esses casos de uso. Os módulos de teste podem declarar qual recurso especial eles precisam no AndroidTest.xml, e o Tradefed encaminha os testes para um dispositivo que tenha o recurso.

Configuração de XML

<option name="config-descriptor:metadata" key="token" value="SIM_CARD" />

O value do token corresponde ao Tradefed's TokenProperty e está associado a um gerenciador em TokenProviderHelper.

Isso permite que os módulos de teste sejam executados em dispositivos que podem executar os testes corretamente.

E se nenhum dispositivo puder executar o teste?

Se nenhum dispositivo disponível tiver o recurso correspondente ao módulo de teste, o módulo de teste falhará e será ignorado porque não poderá ser executado corretamente.

Por exemplo, se um módulo de teste solicitar um chip para ser executado, mas nenhum dispositivo tiver um chip, o módulo de teste falhará.

Implementação

Transmita essa flag de recurso para a linha de comando principal do Tradefed:

--enable-token-sharding