stamatios
← Voltar ao feed
Celular atravessa corda bamba com rede de vistos verdes abaixo, Shopify eleva estabilidade de testes E2E mobile a 98%
Dev & Engenharia

Shopify eleva estabilidade de testes E2E mobile de 50% para 98%

resumo de ~3 min

O problema com a suíte antiga

Os aplicativos móveis da Shopify dependem de uma camada de testes end-to-end (E2E) que rodam como CI bloqueante em cada pull request, simulando fluxos reais de uso. Desde 2023, esses testes do app móvel principal rodavam no Appium via WebdriverIO, localizando elementos por React Native Test IDs. O controle de baixo nível, porém, permitia padrões ruins: testes tocavam elementos antes da tela carregar e usavam atalhos como pause(1000), que acumulavam instabilidade. Além disso, os testes frequentemente validavam a existência de nós na árvore de componentes, não o que um comerciante realmente veria - testavam detalhes de implementação em vez de experiência do usuário. A situação piorou a ponto de o app principal bloquear mais PRs bons do que ruins, e a suíte E2E teve de ser removida das verificações de PR. A estabilidade girava em torno de 50%.

A equipe concluiu que o problema estava no framework em si, não na falta de manutenção, e decidiu reconstruir o sistema em vez de remendar o Appium.

A reconstrução

A solução tem duas partes: uma API estrita em estilo builder, que dificulta a escrita de testes instáveis, e visão computacional para localizar elementos como um usuário faria. O Appium ainda opera o dispositivo por baixo, mas fica inacessível aos desenvolvedores.

Na API builder, cada passo carrega uma asserção obrigatória: não é possível tocar, esperar ou digitar sem declarar o que a tela deve mostrar depois, e o teste falha no passo exato em que a realidade divergiu. Sequências reutilizáveis, como logIntoApp, podem ser aproveitadas por qualquer teste. Escapes das proteções existem, mas são prefixados com UNSAFE_ (como UNSAFE_timeoutInSeconds), sinalizando revisão. A gramática pequena e previsível também permite que humanos e agentes de IA escrevam testes corretos na primeira tentativa, sem conhecimento prévio do código.

Visão computacional no lugar dos Test IDs

Cada passo tira uma captura de tela e localiza o alvo visualmente: o PaddleOCR identifica textos e o OpenCV compara capturas com SVGs do sistema de design Polaris (em tons de cinza, incluindo variantes com cores invertidas e múltiplos tamanhos). Elementos duplicados são desambiguados por adjacências, como "ícone 1 à esquerda do ícone 2". Test IDs continuam disponíveis como alternativa para telas com conteúdo gerado, mas apenas via campo UNSAFE_testID. O ganho inclui velocidade de escrita - ver "Salvar" na tela e escrever touch({ text: 'Save' }) - e diagnósticos rápidos: cada execução gera um vídeo anotado mostrando o que cada passo buscava, o que encontrou e onde tocou.

Um único comando de CLI roda a mesma suíte em laptop, emulador de CI ou dispositivo real em farm remota de dispositivos.

Resultados e próximos passos

Semanas após promover a nova API ao CI bloqueante, a estabilidade chegou a 98% - medida como sucessos individuais sobre o total de execuções - contra 50% da API antiga. As falhas restantes vêm, em grande parte, de causas esperadas: falhas ocasionais de rede e simuladores que não inicializam. Um gate pré-promoção exige que novos testes passem múltiplas vezes em um pipeline dedicado antes de entrar na suíte bloqueante.

A Shopify validou o framework em seu maior app e agora avalia adotá-lo nos demais. A conclusão do time é que grande parte da instabilidade vivia na API, não nos testes: ao exigir asserção em cada passo, localizar elementos como um usuário e eliminar armadilhas, uma suíte que não sobrevivia ao CI passou a rodar com 98% de estabilidade em duas plataformas. Com a IA acelerando o desenvolvimento, frameworks assim permitem avançar mais rápido sem perder confiança no que se entrega.