Screenshot Test es una verificación automatizada de la interfaz de usuario mediante la captura y comparación de capturas de pantalla de las pantallas de la aplicación con imágenes de referencia. A diferencia de las golden tests, las screenshot tests se ejecutan en dispositivos reales o emuladores, capturan pantallas completas con navegación, elementos del sistema y animaciones, y utilizan UI Automator (Android) o XCUITest (iOS) para interactuar con la aplicación. Más detalles en la documentación de Android UI Automator.
Puntos clave
Screenshot Test es una prueba de interfaz de usuario end-to-end donde el test abre una pantalla de la aplicación, realiza acciones (toques, entrada de texto, desplazamiento) y toma una captura de pantalla del estado resultante. La captura se compara con una referencia (baseline) almacenada en el repositorio. Si las capturas difieren — la prueba falla. Las screenshot tests detectan regresiones visuales que las unit tests no pueden ver: márgenes incorrectos, elementos superpuestos, colores equivocados.
¿Por qué necesitamos screenshot tests si tenemos golden tests? — las golden tests verifican componentes de forma aislada: un botón, una tarjeta, un texto. Las screenshot tests verifican una pantalla completa en un entorno lo más cercano posible a producción: navegación real, datos reales (o mocks lo más realistas posible), fuentes del sistema reales, barra de estado real. Solo una screenshot test mostrará que un botón se superpone con otro elemento en un dispositivo real.
Valor empresarial — según Google (2023), los bugs visuales representan el 15-25% de todos los bugs en aplicaciones móviles. Las screenshot tests automatizan la verificación de calidad visual que antes realizaban manualmente los ingenieros de QA. Una screenshot test reemplaza 5-10 minutos de pruebas manuales de una pantalla. Para una aplicación con 50 pantallas, ahorro: 4-8 horas-persona por ejecución de regresión. Las screenshot tests se amortizan en 2-3 ciclos de lanzamiento.
Las golden tests son más rápidas y simples: renderizar un componente en un buffer fuera de pantalla toma milisegundos, no requiere dispositivo y es estable en CI. Las screenshot tests son más realistas: capturan una pantalla real con elementos del sistema, soportan animaciones y navegación, y funcionan en dispositivos reales. La elección depende del objetivo: retroalimentación rápida para el desarrollador (golden) o máximo realismo antes del lanzamiento (screenshot).
| Característica | Screenshot Test | Golden Test |
|---|---|---|
| Velocidad | 2-30 segundos | 50-200 ms |
| Realismo | Máximo (dispositivo real) | Limitado (fuera de pantalla) |
| Requiere dispositivo | Sí (emulador/físico) | No (JVM, XCTest) |
| Animaciones | Soporta | No soporta |
| Navegación | Escenarios de múltiples pasos | Un solo componente |
| Inestabilidad | Alta (red, tiempos) | Media (GPU, fuentes) |
| Paralelismo | Device Farm (Firebase, AWS) | JVM/XCTest multihilo |
Golden + Screenshot — use golden tests para cada componente de IU en la biblioteca de componentes (Design System). El 80% de las regresiones visuales se detectan a nivel de componentes. Screenshot tests — para rutas críticas de usuario: onboarding, inicio de sesión, flujo de pago, carrito de compras. El 20% de las regresiones relacionadas con la integración de componentes en una pantalla real solo se detectan con screenshot tests. En IT Sectr usamos una proporción 80/20: 400 golden + 100 screenshot.
Cuándo no se necesita una screenshot test — si la pantalla consiste en contenido estático sin interactividad, una golden test del componente proporciona el mismo nivel de verificación a un menor costo. Si la pantalla cambia dinámicamente (feed, chat), una screenshot test requiere una configuración compleja de datos y tiempos de espera. En tales casos, use screenshot para el estado base (lista vacía, carga) y golden para tarjetas individuales en la lista.
UI Automator es un framework de Android para pruebas de IU entre aplicaciones. Permite tomar capturas de pantalla mediante UiDevice.takeScreenshot(). A diferencia de Espresso (funciona dentro de una sola aplicación), UI Automator puede interactuar con diálogos del sistema (permisos, notificaciones) y otras aplicaciones. Una screenshot test con UI Automator: abrir la app, esperar la carga, tomar captura, comparar con referencia.
class LoginScreenScreenshotTest {
@get:Rule
val rule = ComposeTestRule.createAndroidComposeRule<MainActivity>()
@Test
fun login_screen_default() {
val device = UiDevice.getInstance(
InstrumentationRegistry.getInstrumentation()
)
// Esperamos a que cargue la pantalla
IdlingRegistry.getInstance().waitForIdle()
// Tomamos una captura de pantalla
val screenshot = device.takeScreenshot()
val golden = loadGolden("login_default.png")
// Comparamos con la referencia
val diff = ImageComparator.compare(screenshot, golden)
assertTrue(diff.similarity > 0.98)
}
}
Firebase Test Lab es un servicio de Google Cloud para ejecutar pruebas instrumentadas en cientos de dispositivos reales en paralelo. Las screenshot tests en Firebase Test Lab capturan pantallas en diferentes dispositivos (Pixel 7, Galaxy S24, Xiaomi 14) y las comparan con referencias. Ventaja: una prueba verifica la IU en 20 dispositivos en 10-15 minutos. Desventaja: costo ($1-5 por prueba en 20 dispositivos). Firebase Test Lab se integra con CI mediante gcloud CLI o el plugin de Gradle.
Shot es una biblioteca para screenshot testing en Android que facilita la creación y comparación de capturas. Shot funciona sobre Espresso y UI Automator, añadiendo gestión de golden (crear, actualizar, eliminar), comparación con umbral (píxeles o porcentajes) y generación de informes HTML. Shot es adecuado para proyectos que quieren implementar rápidamente screenshot testing sin escribir su propia infraestructura de comparación de imágenes.
XCUITest es el framework de Apple para pruebas de IU de aplicaciones iOS, iPadOS y tvOS. Las screenshot tests en XCUITest usan XCUIScreen.main.screenshot() para capturar la pantalla y XCAttachment para guardar las capturas. XCUITest simula acciones de usuario: tap, swipe, typeText, y toma capturas después de cada paso. En Xcode 16+ se ha añadido soporte integrado para comparación de capturas con referencias mediante XCTAttachment.
final class LoginScreenScreenshotTests: XCTestCase {
var app: XCUIApplication!
override func setUp() {
super.setUp()
app = XCUIApplication()
app.launch()
}
func test_login_initial_state() {
let loginButton = app.buttons["login_button"]
XCTAssertTrue(loginButton.exists)
// Tomamos una captura de pantalla
let screenshot = app.screenshot()
let attachment = XCTAttachment(screenshot: screenshot)
attachment.name = "Login-Screen-Initial"
attachment.lifetime = .keepAlways
add(attachment)
// Comparación con la referencia (requiere XCTAttachment + golden)
assertScreenshot(
screenshot: screenshot,
goldenName: "login_initial_state"
)
}
}
Xcode Cloud es el CI en la nube de Apple para compilar y probar aplicaciones iOS. Xcode Cloud admite la ejecución de tests XCUITest en simuladores. Las screenshot tests pueden ejecutarse en múltiples simuladores en paralelo (iPhone 15, iPhone 15 Pro Max, iPad Pro). Resultados: XCResult Bundle con adjuntos. Xcode Cloud no está integrado en GitHub/GitLab — use Xcode Cloud Webhooks para la integración. Alternativa: GitHub Actions con macos-14 y xcodebuild.
Frameworks de comparación — iOSSnapshotTestCase (Uber) también funciona para screenshot tests si se ejecuta en un simulador. SwiftSnapshotTesting (pointfree) está más orientado a golden tests de componentes. Para screenshot tests en iOS, use las herramientas integradas de XCUITest + XCTAttachment + un ImageComparator personalizado (Pixelmator o AImage). En CI use simulador — en dispositivos reales las screenshot tests solo funcionan a través de Device Farm (AWS Device Farm).
Gestión de baselines — las capturas de referencia se almacenan en el repositorio (Git LFS) o en S3. Cada captura se nombra según la plantilla: {testName}_{device}_{orientation}_{locale}.png. Ejemplo: loginScreenPixel7PortraitRu.png. Al añadir un nuevo dispositivo o configuración regional, se crea una nueva referencia. Al cambiar la IU, las referencias antiguas se reemplazan por nuevas después de la revisión de código. La referencia es parte de la base de código, como los fuentes de las pruebas.
Pipeline CI — (1) Compilar la aplicación. (2) Ejecutar screenshot tests en emuladores/simuladores. (3) Comparar capturas con referencias. (4) En caso de discrepancia — generar imagen diff. (5) Subir artefactos diff (actual, esperado, diff — tres archivos). (6) Publicar informe HTML con tabla de resultados. (7) Si se supera el umbral — la prueba falla. (8) El revisor examina los artefactos diff y toma una decisión: aprobar (actualizar referencia) o rechazar (corregir código).
Umbral y tolerancia — la comparación absoluta píxel a píxel es demasiado estricta. Use SSIM (Índice de Similitud Estructural) o MSE (Error Cuadrático Medio). SSIM 0.98 = 98% de similitud estructural — un buen umbral. Diferentes pantallas pueden requerir diferentes umbrales: tema oscuro (más negro — mayor precisión), degradados (más ruido — menor precisión). Configure el umbral por prueba mediante el parámetro: @ScreenshotTest(threshold = 0.99).
Device Farm vs Simulador — las pruebas en dispositivos reales (Firebase Test Lab, AWS Device Farm) ofrecen máximo realismo pero son lentas y de pago. Las pruebas en simuladores/emuladores son rápidas y gratuitas pero no muestran características de dispositivos reales (diferentes GPUs, reproducción de color de pantalla, densidad de píxeles). Estrategia: simulador para verificación pre-merge (5 minutos), Device Farm para nocturnas (30 minutos, 20 dispositivos). En IT Sectr usamos Firebase Test Lab para ejecuciones nocturnas en los 10 dispositivos Android principales.
Preguntas frecuentes
Golden Test — para verificación rápida de componentes de IU individuales en cada commit (50-200 ms). Screenshot Test — para verificación E2E de pantallas completas en dispositivos reales antes del lanzamiento (2-30 segundos). Use ambos: golden para componentes del Design System, screenshot para rutas críticas de usuario. Una proporción 80/20 es óptima para la mayoría de proyectos.
SSIM 0.98 es un buen umbral inicial para la mayoría de pantallas. Para tema oscuro, puede usar 0.99 (mayor contraste — comparación más precisa). Para pantallas con degradados e imágenes — 0.95-0.97. No use comparación absoluta píxel a píxel (MSE = 0) — produce 20-30% de falsos positivos debido al anti-aliasing y diferencias de GPU. Configure el umbral individualmente para cada prueba.
Con cada cambio intencional de IU — cambio de colores, fuentes, márgenes, iconos, adición/eliminación de elementos. No actualice las referencias cuando cambie el entorno (versión del SO, fuentes en CI) — esto es un signo de test inestable. Las referencias se actualizan solo localmente por el desarrollador después de la revisión de código: eliminar referencias antiguas, ejecutar pruebas con record=true, verificar nuevas capturas, confirmar.
Sí — mediante Espresso en Android y XCUITest en iOS. Espresso funciona dentro del proceso de la aplicación y no requiere Accessibility Service (como UI Automator). XCUITest es el framework estándar de Apple para pruebas de IU. Para screenshot tests la diferencia es mínima: XCUITest es ligeramente más estable (API nativa de Apple), UI Automator es ligeramente más flexible (interacción entre procesos).
Si están configuradas correctamente — no. Pre-merge: ejecute solo screenshot tests en las pantallas modificadas (30-60 segundos). Nocturnas: ejecución completa en Device Farm (30 minutos, 20 dispositivos). Tiempo de ejecución de screenshot tests en emulador: 2-10 segundos por pantalla. 20 pantallas = 40-200 segundos. Esto es menos que el tiempo de pruebas manuales de una sola pantalla (5-10 minutos).
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también