Configurar a fragmentação

Esta página descreve o que é possível ajustar para um módulo de pacote (AndroidTest.xml) usando o fragmentação e conseguir a melhor velocidade de execução contínua no laboratório. Vamos tentar descrever as opções de maneira genérica com a justificativa para usar cada uma delas.

Ao executar continuamente um pacote no laboratório, ele geralmente é dividido em vários dispositivos para reduzir o tempo de conclusão geral. O arcabouço normalmente tenta equilibrar o tempo de execução de cada fragmento para minimizar o tempo total de conclusão (quando o último fragmento termina). No entanto, devido à natureza de alguns testes, nem sempre temos introspecção suficiente e precisamos que o proprietário do módulo ajuste algum comportamento.

Pode ser fragmentado ou não?

É possível marcar um módulo (AndroidTest.xml) com <option name="not-shardable" value="true" /> para notificar o harness de que ele não deve ser dividido.

Em um módulo comum, permitir a fragmentação de arcabouço do módulo (o comportamento padrão) é a coisa certa a fazer. Mas, em alguns casos, é possível modificar esse comportamento:

  • Quando a configuração do módulo é cara:

A fragmentação de um módulo resulta na preparação (APK de instalação, arquivo push etc.) possivelmente executada uma vez por dispositivo envolvido. Se a configuração do módulo for longa e cara e não valer a pena ser replicada em comparação com o tempo de execução do teste, marque o módulo como não particionável.

  • Quando o número de testes no módulo estiver baixo:

O fragmentação de um módulo resulta em todos os casos de teste possivelmente sendo executados de forma independente em diferentes dispositivos. Isso está relacionado ao primeiro ponto: se o número de testes for baixo, você poderá acabar com um único teste ou nenhum teste em alguns fragmentos, o que tornaria qualquer etapa de preparação muito cara. Instalar um APK para um único caso de teste geralmente não vale a pena, por exemplo.

Testes de instrumentação: número máximo de fragmentos?

Um teste de instrumentação executado pelo AndroidJUnitTest não expõe ao harness quantos testes fazem parte da instrumentação até que o APK seja instalado e executado. Essas operações são caras e não podem ser executadas no momento do sharding para todos os módulos do pacote.

O arcabouço pode fragmentar em excesso o teste de instrumentação e acabar com alguns fragmentos vazios. A fragmentação de um teste de instrumentação com cinco testes em seis fragmentos resulta em cinco fragmentos com um teste e um sem testes. Cada um desses fragmentos exigiria uma instalação de APK cara.

Portanto, quando o número de testes no APK de teste de instrumentação é baixo, a inclusão de tags no módulo com <option name="not-shardable" value="true" /> permite que o harness saiba que o sharding desse módulo não vale a pena.

O executor AndroidJUnitTest tem uma opção especial que permite especificar o número máximo de fragmentos em que ele pode ser dividido: <option name="ajur-max-shard" value="5" />.

Isso permite especificar um número máximo de vezes que a instrumentação pode ser fragmentada, independentemente do número de fragmentos solicitados no nível de invocação. Por padrão, a instrumentação será dividida no número de fragmentos solicitados para a invocação.

Por exemplo, se o APK do teste de instrumentação tiver apenas dois casos de teste, mas você ainda quiser particioná-lo, ter um valor de ajur-max-shard de 2 garantirá que você não está criando fragmentos vazios.