DevReview: UI Tests com Xamarin Test Cloud e AWS Device Farm

Israel Fonseca
mercos-engineering
Published in
6 min readOct 3, 2017

Recentemente (antes tarde do que nunca) adicionamos Smoke Tests nos nossos apps mobile. Já tínhamos testes unitários, mas ainda faltavam os famosos "testes de UI". Contarei um pouco dos nossos aprendizados com isso.

Primeiramente, vale lembrar que utilizamos Xamarin para o desenvolvimento de apps, mas isso não é um pré-requisito para utilizar o Xamarin Test Cloud. Desenvolvedores de apps Nativos podem contratar o serviço sem problemas.

O Xamarin Test Cloud não foi a nossa primeira escolha, testamos as seguintes hipóteses (nesta ordem):

  • Testes nos simuladores
  • Testes na AWS Device Farm
  • Testes no Xamarin Test Cloud

Testes nos Simuladores

Nossa primeira alternativa era fazer nosso CI, o BitRise, rodar os testes nos simuladores do iOS e Android. Isso de cara já vem com um problema: um simulador não é um dispositivo real (duh!). Não seria com ele que pegaríamos algum cenário de bug maluco, coisa que todo desenvolvedor mobile enfrentou ou vai enfrentar eventualmente. Além disso, testes de UI que são tradicionalmente instáveis, são ainda mais instáveis num simulador e ainda mais instáveis num ambiente virtualizado como o BitRise.

Na prática nossos testes além de lentos, estavam falhando constantemente por motivos aleatórios, e pior, o diagnóstico disso era nulo. Como estava a tela quando o teste falhou? Difícil diagnosticar no BitRise.

Reprovado.

Teste no AWS Device Farm

Nossa infra é praticamente 80% AWS (começamos a brincar com Kubernetes recentemente na Google Cloud), então por quê não? O preço é convidativo: 0,17 USD por minuto de teste. Nosso Smoke Test leva em torno de 5 minutos e estes são rodados apenas quando fazemos merge para produção, o que ocorre 2x por dia em média. Colocando no papel:

0,17 USD * 5 min * 2 merges para produção * 20 dias úteis = 34 dólares mês

Um preço bacana, mas lembre-se que devemos rodar ao menos um teste para cada plataforma (Android e iOS), então temos ai 68 dólares.

Agora vem a parte ruim. Os tipos de testes suportados:

  • UIAutomator API ≥ 18
  • Appium API ≥17
  • Calabash

Nosso APP tem cerca de 5% de usuários em APIs < 17 que ainda precisamos dar suporte, por isso seria importante não ter essa restrição. O Calabash por sua vez parece ser a bala de prata, porém pede por testes escritos em Ruby. Não é pela rixa Python x Ruby (nosso app web é escrito em python), mas a principio seria melhor evitar ter mais uma linguagem na nossa stack (preciosismo? Talvez). No entanto, nenhum desses foi o problema decisivo. Este foi:

ANDROID_APP_UNZIP_FAILED

E assim, com essa mensagem, a chance de utilizarmos o Device Farm foi pro espeto. Por algum motivo este erro sempre ocorre ao submetermos nossas APKs e nas nossas pesquisas não conseguimos resolver. Algum conflito sinistro motivado por um APK que tem o Mono/Xamarin bundled? Não sei.

Como ficamos travados, passamos para o próximo candidato.

E eu também não.

Xamarin Test Cloud

Impressionantemente tudo funcionou muito bem. É mandar o .APK/.IPA conforme as instruções da documentação e sair para o abraço. Algo que achei curioso é que apenas para o iOS o artefato enviado deve ser um build específico contendo a biblioteca de testes do Xamarin (que contém o parasita que vai permitir manipular a UI). Isso acaba te obrigando a fazer o anti-pattern de testar um binário diferente do que de fato é enviado para produção. Meio tenso, mas não chega a ser um no-go.

Agora deixe eu fazer um jabá não remunerado: Que API bem escrita a desse XamarinUITest! Além de ter uma API bem clean/intuitiva, possui o magnifico app.Repl(), que permite testar interações na UI via CLI. Depois é só fazer um copiar e colar dos comandos e jogar nos testes. Time saver.

O comando 'tree' no REPL mostra o que você está "vendo" no device.

No que diz respeito à UI na Cloud, lá o trabalho também é bem feito. É possível ver como estava a tela em todos os dispositivos em cada passo, o que pode ser útil para depurar algum erro (em dado momento o Google Play Services parou). Obviamente, ele também oferece o log de execução também para uma depuração mais violenta.

Por algum motivo o teste falhou em uma etapa e podemos ver como a tela estava no device falho e no válido.

Além disso, ele monta pra você um gráfico com o tamanho do APP e uso de memória do aplicativo que é bem interessante.

Durante meus testes tive a incrível sorte (ou falta dela) de vivenciar um apagão na infra deles, sim você leu certo, problemas de terceiro mundo lá também.

Não tá fácil pra ninguém.

Os testes pararam de funcionar por um dia, mas o suporte deles funcionou e responderam meu e-mail no mesmo dia. Em outra situação tive problema com um erro aleatório em um dos devices e novamente fui atendido rapidamente. Inclusive o meu report fez com que eles corrigem um bug na plataforma deles, ou ao menos foi o que me informaram depois.

Por fim o preço: salgados 99 USD sem paralelismo e uma restrição de média de uso diário de 1 hora. Após um mês ao passar dessa média, eles entrarão em contato com você para negociar o próximo plano. Que também não é nada barato: módicos 379 USD, mas com paralelismo de 3 dispositivos e com 5 horas de testes por dia.

Conclusão

Xamarin Test Cloud funcionou e por enquanto isso já agrega valor o bastante para o nosso cenário atual. Estamos no trial ainda, então efetivamente estamos recebendo o plano de 379 USD de graça. Quando começarmos a pagar o plano mais simples, estaremos ainda dentro do limite das horas diárias já que faremos os testes em 2 devices Android e 2 iOS (20 minutos diário de testes).

Hoje nosso processo de Deploy envia os apps automaticamente para a PlayStore (em Alfa) e o TestFlight (em Beta), sendo que o release propriamente dito é feito manualmente depois quando for preciso. No nosso caso, talvez fosse válido ter um run específico de uma suite de teste com vários dispositivos diferentes antes da nossa publicação. Isso nos permitiria otimizar melhor nosso tempo contratado e fazer o teste em mais dispositivos, sem deixar o processo de merge muito lento (sem paralelismo no plano mais barato).

Independentemente do "sucesso" com o Xamarin Test Cloud, é certo que vamos dar uma nova chance para a AWS Device Farm em algum momento para tentar otimizar custos. No nosso caso, os testes na AWS talvez fossem custar o equivalente ao Xamarin, mas rodando em paralelo e com um valor on-demand.

Quem estiver começando a se aventurar com serviços de teste em cloud, recomendo dar uma olhada na AWS primeiro, mas se dinheiro não for um issue vá de Xamarin Test Cloud cujo o funcionamento é smooth e a UI do serviço agrega valor.

#partiuTestesDeUI

--

--