Maestro controla tu aplicación instalada en un simulador o emulador con flujos YAML declarativos - presiona, desplázate, afirma texto visible - sin escribir código de arnés de prueba nativo. Combínalo con compilaciones EAS para que cada PR ejecute los mismos viajes que CI ejecuta localmente.
# Ejecución local (después de instalar Maestro CLI y una compilación de debug en emulador/simulador)maestro test .maestro/home.ymlmaestro test .maestro/# Ejecutar EAS Workflow manualmentenpx eas-cli@latest workflow:run .eas/workflows/e2e-test-android.yml
Lo que esto demuestra:
appId coincide con android.package / ios.bundleIdentifier de app.json.
Coincidentes Regex - Tasks.* y Explore.* toleran cambios menores de etiqueta y diferencias de texto de plataforma.
Perfil de compilación e2e-test - produce .apk (Android) y simulador .app (iOS) sin credenciales de store.
Job EAS maestro - instala el artefacto de compilación desde build_id y ejecuta flujos flow_path.
Flujos independientes - cada archivo YAML es un viaje; los fallos señalan la pantalla rota.
Maestro CLI se conecta a un emulador/simulador en ejecución (o dispositivo físico) e inicia la aplicación por appId.
Cada flujo es una lista ordenada de comandos (launchApp, tapOn, inputText, assertVisible, scrollUntilVisible, ...) ejecutados contra el árbol de UI en vivo.
Maestro usa etiquetas de accesibilidad y texto visible - agrega testID / accessibilityLabel en React Native cuando solo el texto es ambiguo.
EAS Workflowstype: build produce un binario instalable; type: maestro descarga ese binario al runner y ejecuta flujos - sin carga manual de artefactos.
Los flujos son caja negra - no importan tu JS; cambiar la implementación no rompe las pruebas si la UI visible para el usuario permanece igual.
testID se asigna a id en Maestro - usa kebab-case consistentemente entre plataformas.
Expo Go vs cliente dev vs compilaciones de lanzamiento - appId difiere; CI debe probar el mismo tipo de binario que envías (perfil EAS e2e-test, no Expo Go).
Animaciones - espera contenido con extendedWaitUntil en lugar de comandos sleep fijos.
Teclado - inputText después de enfocar un campo; en el simulador iOS asegúrate de que el teclado de software esté habilitado para ejecuciones realistas.
appId incorrecto - El flujo inicia una aplicación diferente o falla inmediatamente. Arreglo: Copia android.package / ios.bundleIdentifier de app.json después de eas build:configure, no el slug de Expo.
Pruebas en Expo Go con appId de producción - El ID de aplicación de Expo Go es host.exp.exponent, no tu ID de paquete. Arreglo: Instala una compilación EAS dev o preview en el emulador antes de maestro test.
Mega-flujos que son difíciles de depurar - Un archivo YAML cubriendo onboarding - paywall - settings oculta qué paso falló. Arreglo: Un viaje por archivo; comparte login vía runFlow.
Aserciones de cadena exacta frágiles - "Welcome" falla cuando el texto se convierte en "Welcome!" o incluye espacio final. Arreglo: Aserciones Regex (Welcome!, Welcome.*) y testID para toques críticos.
Estado backend compartido entre flujos - Los ejecutores paralelos de CI mutan el mismo usuario de prueba. Arreglo: Inquilinos de prueba dedicados, scripts iniciales idempotentes, o cuentas por ejecución.
Sin esperar contenido asincrónico - assertVisible se ejecuta antes de que se complete la búsqueda - fallos intermitentes. Arreglo:extendedWaitUntil o assertVisible después de que desaparezca un indicador de carga estable.
Asumir que Maestro reemplaza Jest - E2E es lento y no cubre cada rama. Arreglo: Mantén pruebas de unidad/componente (Jest Setup para Expo, RNTL); usa Maestro para rutas críticas delgadas.
Sigue Instalar Maestro CLI. Necesitas un emulador/simulador iniciado con tu binario de aplicación instalado antes de maestro test.
¿Dónde viven los archivos de flujo?
Convención: .maestro/ en la raíz del proyecto (hermano de eas.json). Nombra flujos por viaje (login.yml, checkout-guest.yml), no por número de sprint.
¿Qué es el separador --- en flujos YAML?
Las líneas arriba de --- son configuración (appId, name opcional, env). Las líneas debajo son la lista de comandos ejecutada en orden.
¿Cómo ejecuto todos los flujos?
maestro test .maestro/
Ejecuta cada flujo en el directorio. En CI, lista rutas explícitas en flow_path para que borradores experimentales no se recojan accidentalmente.
¿Cómo sabe EAS qué binario de aplicación instalar?
El build_id del job maestro hace referencia al artefacto del job build en el mismo workflow. Compila con el perfil e2e-test para que la salida sea un .apk o simulador .app instalable.
¿Puedo ejecutar Maestro en iOS y Android en un workflow?
Usa archivos de workflow separados (o jobs) por plataforma - compilaciones platform: ios vs platform: android producen artefactos diferentes. Comparte flujos YAML cuando la paridad de UI es cercana; rama con flujos específicos de plataforma cuando no es así.
¿Cómo objetivo un elemento con texto duplicado?
- tapOn: id: "submit-button"
Agrega testID en React Native. Prefiere id sobre toques de coordenadas - las coordenadas se rompen entre tamaños de pantalla.
Espera la pantalla post-carga - no el spinner mismo - para que redes rápidas no hagan flake en la visibilidad del spinner.
¿Puede Maestro rellenar campos de texto seguro?
Sí - inputText funciona en campos seguros enfocados. Asegúrate de que el campo sea tocado primero. Prueba en ambas plataformas; el comportamiento del teclado difiere en el simulador iOS.
Mantén subflujos en .maestro/subflows/ y hace referencia con runFlow.
¿Qué perfil de compilación debe usar e2e-test?
withoutCredentials: true - compilaciones internas de CI sin configuración de firma de store.
Android buildType: "apk" - instalable en emulador sin danza de firma de Play.
iOS simulator: true - produce un simulador .app, no un IPA de App Store.
¿Maestro vs Detox para Expo SDK 57?
Maestro: YAML, caja negra, tipo de job EAS Workflow, configuración baja. Detox: pruebas JS, sincronización de caja gris, configuración de compilación nativa - ver Detox E2E cuando necesites IDs de prueba en aplicación e sincronización de inactividad.
¿Cómo reduzco flakes en CI?
Fija el nivel de API del emulador en CI para que coincida con dev local.
Siembra datos backend antes de flujos.
Usa extendedWaitUntil para pantallas vinculadas a la red.
Divide flujos largos; las políticas de reintento ayudan pero arregla problemas de sincronización raíz primero.
¿Debo confirmar .maestro en git?
Sí - los flujos son código fuente. Revísalos como cambios de aplicación. Excluye la salida de debug local de Maestro o grabaciones de pantalla si tu equipo las genera durante el desarrollo.
¿Cuántos flujos E2E necesito?
Cubre rutas críticas solamente - autenticación, pago, pérdida de datos, pantallas regulatorias. La cobertura de rama exhaustiva permanece en Jest. Ver Conceptos básicos de pruebas móviles para el balance de pirámide.