Você já ouviu falar de monkey testing?

Wellington Avelino
assert(QA)
Published in
3 min readApr 13, 2018

Pensando no cenário atual que vivemos, os aplicativos precisam ser dinâmicos, resilientes, tratar erros ou acontecimentos inesperados, diferente do cenário Web, onde não temos rotação de tela, se você recebe uma notificação você apenas troca de aba e não de contexto como em mobile.

Tendo isso em vista, existe algum meio de tentar previnir esses possíveis problemas? Sim, mas nenhum deles pode ser considerado uma bala de prata para seus problemas.

Existe essa técnica chamada de monkey testing, não encontrei nenhuma referência que me pareceu confiável mas, segundo as mesmas o cara por trás disso tudo é o Steve Capps. A idéia era gerar eventos randômicos para tentar encontrar possíveis problemas nos programas que rodavam no Mac.

Bom até agora parece ser uma ótima técnica, já podemos sair implementando e colocar como skill no Linkedin.

Obvio que não.. quais são as vantagens e desvantagens do uso dessa técnica? existem ferramentas para realizar isso de forma automatizada? Como replicar possíveis bugs que venham a ser encontrados?

Vantagens

  • Pode identificar alguns erros bem fora da caixa
  • Ridiculamente fácil de se configurar e executar
  • Pessoas que não são tão técnicas podem realizar numa boa
  • Mais um agregador de qualidade
  • Capazes de encontrar problemas com alto impacto(e.g Memory Leak)
  • Baixo custo

Desvantagens

  • Não é garantia de que você vá encontrar bug algum com isso(muita gente pode ver como perda de tempo).
  • Reproduzir os bugs(caso encontrados) realmente vai ser trabalhoso
  • Tempo

Realmente existem alguns pontos que precisam ser levados em consideração, mas é uma técnica interessante. Mas como fazer isso de forma automatizada e incluir isso em alguma pipeline de testes no CI?

Já tive o prazer de brincar com o monkeyrunner que já vem com o SDK do Android. A configuração é muito simples e pode ser adicionada junto aos testes do Espresso.
Abaixo um exemplo bem simples de código retirado do próprio site.

monkeyrunner example

Para iOS não existe algo nativo ou que seja suportado diretamente pela Apple, porém existe um repositório que venho acompanhando o SwiftMonkey, esse framework lembra o funcionamento do monkeyrunner, onde você consegue adicionar eles dentro dos seus testes. A lib não está tão madura, ainda existem diversas issues para serem tratadas e adicionar novos gestos, porém é um bom baby step.

Pensando em integração contínua esses testes por não serem custosos comparados a testes end to end, você poderia encaixar ele em algum job separado, que rodasse frequentemente durante suas iterações de desenvolvimento, mas não necessariamente seria alguma coisa impeditiva, a ideia é conseguir enxergar Crashs que ocorrem somente quando a Lua está alinhada com Vênus, memory leak, travamentos inesperados e muitos outros.

Lembrando que não adianta só botar para rodar e esquecer dos testes é importante sempre avaliar os logs e realmente cuidar deles para continuarem a ser confiáveis.

Minha conclusão quanto essa técnica é que é muito válida se bem aplicada e conseguimos uma granularidade maior em divisão de testes e responsabilidades, baixamos um pouco mais o nível para olhar problemas distintos e novamente um teste não anula o outro eles se complementam, não faz sentido criar fluxos end to end usando Espresso + monkeyrunner para validar jornada e dizer que não precisamos mais de testes funcionais.

--

--

Wellington Avelino
assert(QA)

Software Eng, Testing, Build Tools, Crossfit, Cycling