O Maestro controla seu aplicativo instalado em um simulador ou emulador com fluxos declarativos em YAML - toque, role, afirme texto visível - sem escrever código de harness de teste nativo. Combine-o com builds do EAS para que cada PR execute as mesmas jornadas que o CI executa localmente.
# Execução local (após instalar o Maestro CLI e um build de depuração no emulador/simulador)maestro test .maestro/home.ymlmaestro test .maestro/# Acionar EAS Workflow manualmentenpx eas-cli@latest workflow:run .eas/workflows/e2e-test-android.yml
O que isso demonstra:
appId corresponde a android.package / ios.bundleIdentifier de app.json.
Correspondências de Regex - Tasks.* e Explore.* toleram pequenas alterações de rótulo e diferenças de texto entre plataformas.
Perfil de build e2e-test - produz .apk (Android) e .app de simulador (iOS) sem credenciais de loja.
Job maestro do EAS - instala o artefato de build do build_id e executa os fluxos de flow_path.
Fluxos independentes - cada arquivo YAML é uma jornada; falhas identificam a tela quebrada.
O Maestro CLI se conecta a um emulador/simulador em execução (ou dispositivo físico) e inicia o aplicativo por appId.
Cada fluxo é uma lista ordenada de comandos (launchApp, tapOn, inputText, assertVisible, scrollUntilVisible, …) executados contra a árvore de UI ao vivo.
O Maestro usa rótulos de acessibilidade e texto visível - adicione testID / accessibilityLabel no React Native quando a cópia sozinha for ambígua.
EAS Workflowstype: build produz um binário instalável; type: maestro baixa esse binário para o runner e executa os fluxos - sem upload manual de artefatos.
Os fluxos são caixa-preta - eles não importam seu JS; mudar a implementação não quebra os testes se a UI visível para o usuário permanecer a mesma.
// Prefira seletores estáveis que o Maestro possa direcionar<Pressable testID="sign-in-button" accessibilityLabel="Sign in" onPress={handleSignIn}> <Text>Sign in</Text></Pressable>
- tapOn: id: "sign-in-button"
testID mapeia para id no Maestro - use kebab-case consistentemente entre plataformas.
Expo Go vs cliente de desenvolvimento vs builds de lançamento - appId difere; o CI deve testar o mesmo tipo de binário que você envia (perfil e2e-test do EAS, não Expo Go).
Animações - espere pelo conteúdo com extendedWaitUntil em vez de comandos sleep fixos.
Teclado - inputText após focar um campo; no simulador iOS, certifique-se de que o teclado de software esteja habilitado para execuções realistas.
appId incorreto - O fluxo inicia um aplicativo diferente ou falha imediatamente. Correção: Copie android.package / ios.bundleIdentifier de app.json após eas build:configure, não o slug do Expo.
Testando no Expo Go com appId de produção - O ID do aplicativo do Expo Go é host.exp.exponent, não seu ID de pacote. Correção: Instale um build de desenvolvimento ou de pré-visualização do EAS no emulador antes de maestro test.
Mega-fluxos difíceis de depurar - Um arquivo YAML cobrindo onboarding → paywall → configurações oculta qual etapa falhou. Correção: Uma jornada por arquivo; compartilhe o login via runFlow.
Asserções de string exata frágeis - "Welcome" falha quando a cópia se torna "Welcome!" ou inclui espaço em branco no final. Correção: Asserções de Regex (Welcome!, Welcome.*) e testID para toques críticos.
Estado de backend compartilhado entre fluxos - Execuções paralelas de CI modificam o mesmo usuário de teste. Correção: Tenants de teste dedicados, scripts de semente idempotentes ou contas por execução.
Sem espera por conteúdo assíncrono - assertVisible é executado antes que a busca seja concluída - falhas intermitentes. Correção:extendedWaitUntil ou assertVisible após um indicador de carregamento estável desaparecer.
Assumir que o Maestro substitui o Jest - E2E é lento e não cobre todos os ramos. Correção: Mantenha testes unitários/de componente (Configuração do Jest para Expo, RNTL); use o Maestro para caminhos críticos finos.
Siga Instalando o Maestro CLI. Você precisa de um emulador/simulador iniciado com o binário do seu aplicativo instalado antes de maestro test.
Onde os arquivos de fluxo residem?
Convenção: .maestro/ na raiz do projeto (irmão do eas.json). Nomeie os fluxos por jornada (login.yml, checkout-guest.yml), não por número de sprint.
Qual é o separador --- em fluxos YAML?
Linhas acima de --- são configurações (appId, name opcional, env). Linhas abaixo são a lista de comandos executados em ordem.
Como executo todos os fluxos?
maestro test .maestro/
Executa todos os fluxos no diretório. Em CI, liste caminhos explícitos em flow_path para que rascunhos experimentais não sejam capturados acidentalmente.
Como o EAS sabe qual binário de aplicativo instalar?
O job maestrobuild_id referencia o artefato do job build no mesmo workflow. Compile com o perfil e2e-test para que a saída seja um .apk instalável ou .app de simulador.
Posso executar o Maestro em iOS e Android em um único workflow?
Use arquivos de workflow (ou jobs) separados por plataforma - platform: ios vs platform: android compilam artefatos diferentes. Compartilhe fluxos YAML quando a paridade da UI for próxima; ramifique com fluxos específicos da plataforma quando não for.
Como direciono um elemento com texto duplicado?
- tapOn: id: "submit-button"
Adicione testID no React Native. Prefira id em vez de toques de coordenada - coordenadas quebram em diferentes tamanhos de tela.
Espere pela tela pós-carregamento - não pelo spinner em si - para que redes rápidas não falhem na visibilidade do spinner.
O Maestro pode preencher campos de texto seguro?
Sim - inputText funciona em campos seguros focados. Certifique-se de que o campo seja tocado primeiro. Teste em ambas as plataformas; o comportamento do teclado difere no simulador iOS.
Mantenha sub-fluxos em .maestro/subflows/ e referencie com runFlow.
Qual perfil de build o e2e-test deve usar?
withoutCredentials: true - builds internos de CI sem configuração de assinatura de loja.
Android buildType: "apk" - instalável no emulador sem a dança de assinatura da Play.
iOS simulator: true - produz um .app de simulador, não um IPA da App Store.
Maestro vs Detox para Expo SDK 57?
Maestro: YAML, caixa-preta, tipo de job EAS Workflow, baixa configuração. Detox: testes JS, sincronização de caixa cinza, configuração de build nativa - veja Detox E2E quando precisar de IDs de teste no aplicativo e sincronização ociosa.
Como reduzo falhas em CI?
Fixe o nível da API do emulador em CI para corresponder ao desenvolvimento local.
Alimente dados de backend antes dos fluxos.
Use extendedWaitUntil para telas vinculadas à rede.
Divida fluxos longos; políticas de retentativa ajudam, mas primeiro corrija os problemas de tempo raiz.
Devo commitar .maestro no git?
Sim - os fluxos são código-fonte. Revise-os como alterações de aplicativo. Exclua a saída de depuração local do Maestro ou gravações de tela se sua equipe as gerar durante o desenvolvimento.
Quantos fluxos E2E eu preciso?
Cubra apenas os caminhos críticos - autenticação, pagamento, perda de dados, telas regulatórias. A cobertura exaustiva de ramos permanece no Jest. Veja Noções Básicas de Teste Móvel para o equilíbrio da pirâmide.