Fragmentação de testes

Quando o corpus de teste é grande ou o tempo de execução fica 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 teste ofereça suporte a ela.

A maioria dos executores de teste principais já oferece suporte a fragmentação, então nenhum trabalho extra é necessário. Eles 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ído. Elas têm algumas semelhanças, então esta página descreve as propriedades comuns e, em seguida, as especificidades de cada uma delas.

Propriedades comuns

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

A principal diferença entre os formatos de fragmentação é a maneira como eles 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 os testes quando estiver livre (ou seja, feito 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

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

Execução

O sharding distribuído ocorre ao criar a lista de testes, e o conteúdo de cada shard executa apenas o shard solicitado no momento. Assim, todos os fragmentos distribuídos criam a mesma lista primeiro e, em seguida, executam um subconjunto exclusivamente exclusivo, o que resulta na execução de todos os testes.

A propriedade principal desse formulário é que os fragmentos não têm conhecimento um do outro 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

O fragmento de token só pode ser usado com o fragmento local. A flag está inoperante em casos de uso de fragmentação não local. Às vezes, um dos dispositivos envolvidos no fragmentação tem recursos especiais que outros não têm, como um cartão SIM. Alguns testes só funcionam quando esse recurso especial está disponível e falham de outra forma.

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

Configuração de XML

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

O value do token corresponde ao TokenProperty do Tradefed 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 vai falhar e ser ignorado porque não pode ser executado corretamente.

Por exemplo, se um módulo de teste solicitar um chip para execução, mas nenhum dispositivo tiver um chip, o módulo de teste vai falhar.

Implementação

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

--enable-token-sharding