XCUITest: qué es, cómo funciona y pruebas de UI iOS

Autor: IT Sectr Publicado: 2026-04-09 Tiempo de lectura: 8 min

XCUITest es un framework de Apple para pruebas de UI en aplicaciones iOS, iPadOS y macOS, integrado directamente en XCTest y Xcode. Permite simular acciones del usuario: toques, entrada de texto, deslizamientos, scroll y gestos — con acceso al estado interno de los elementos de la interfaz. Según Apple Developer Documentation, 2025, XCUIApplication es el punto de entrada para todas las pruebas de UI y proporciona acceso a la jerarquía de elementos de la pantalla.

Puntos clave

  • XCUITest es el framework nativo de Apple para pruebas de UI integrado en Xcode
  • Enfoque de caja blanca proporciona acceso a los atributos de accesibilidad y a la jerarquía de elementos
  • Las pruebas se escriben en Swift u Objective-C integradas con XCTest
  • La grabación de pruebas está disponible mediante el grabador integrado en Xcode
  • La ejecución se realiza en el simulador de iOS o en un dispositivo real sin servidores adicionales

Qué es XCUITest

XCUITest es un framework de pruebas de UI lanzado por Apple en Xcode 7 (2015). Reemplazó a UI Automation (UIA) y se convirtió en la herramienta estándar para pruebas automatizadas de interfaz en plataformas Apple. XCUITest está completamente integrado en XCTest, el framework de pruebas unificado de Apple.

Diferencia con las pruebas unitarias de XCTest

A diferencia de las pruebas unitarias, que verifican la lógica a nivel de clases y métodos, XCUITest prueba la interfaz de usuario mediante la simulación de acciones. Las pruebas se ejecutan en un proceso separado de la aplicación e interactúan con ella a través de la API de accesibilidad, lo que garantiza aislamiento y fiabilidad.

Ventajas del enfoque nativo

XCUITest no requiere instalar servidores de terceros (a diferencia de Appium) ni bibliotecas adicionales para la interacción con el dispositivo. Todo lo necesario ya está incluido en Xcode. Esto garantiza la mejor compatibilidad con las nuevas versiones de iOS y acceso instantáneo a nuevos gestos y controles.

Arquitectura de XCUITest y XCTest

La arquitectura de XCUITest se basa en dos clases clave: XCUIApplication — la aplicación bajo prueba lanzada, y XCUIElement — el elemento de interfaz. El ejecutor de pruebas XCTest gestiona el ciclo de vida de las pruebas: setUp, métodos de prueba, tearDown. XCUITest se ejecuta como un proceso separado que controla la aplicación a través del puente de accesibilidad.

Jerarquía de elementos

Cada elemento de la UI está representado por un objeto XCUIElement que contiene métodos para consultar el estado (exists, isHittable, label, value) y acciones (tap, pressForDuration, swipeUp, typeText). Los elementos se organizan en una jerarquía mediante cadenas de consulta: app.buttons[].staticTexts[].tables[]. Esto permite encontrar cualquier elemento en la pantalla de forma flexible.

Accesibilidad y localizadores

XCUITest utiliza atributos de accesibilidad para identificar elementos: accessibilityIdentifier — un identificador programático, y accessibilityLabel — una descripción para VoiceOver. Se recomienda establecer accessibilityIdentifier en el código de la aplicación — esto hace que las pruebas sean estables independientemente de la localización y el diseño.

Cómo escribir pruebas de UI con XCUITest

Las pruebas de XCUITest se escriben en Swift utilizando la sintaxis de XCTest. Cada clase de prueba hereda de XCTestCase y contiene métodos que comienzan con test. En el método setUp se lanza la aplicación con la configuración necesaria, y en tearDown se realiza la limpieza y finalización de la sesión.

Escenario de prueba básico

Una prueba típica: encontrar un elemento → realizar una acción → verificar el resultado. La búsqueda de elementos se realiza mediante consultas secundarias de XCUIElementQuery: app.buttons["loginButton"], app.textFields["email"]. Acciones: .tap(), .typeText("text"), .swipeUp(). Verificaciones: XCTAssertTrue(element.exists) o XCTAssertEqual(element.label, "expected").

swift
import XCTest

class LoginTests: XCTestCase {
    let app = XCUIApplication()

    override func setUp() {
        continueAfterFailure = false
        app.launch()
    }

    func testLoginWithValidCredentials() {
        let emailField = app.textFields["emailInput"]
        emailField.tap()
        emailField.typeText("user@test.com")

        let passwordField = app.secureTextFields["passwordInput"]
        passwordField.tap()
        passwordField.typeText("password123")

        app.buttons["loginButton"].tap()

        let homeLabel = app.staticTexts["homeTitle"]
        XCTAssertTrue(homeLabel.exists)
    }
}

Esperas y sincronización

XCUITest admite esperas explícitas mediante XCTWaiter y predicados NSPredicate. Por ejemplo, esperar a que aparezca un elemento en 5 segundos: XCTWaiter().wait(for: [expectation], timeout: 5). A diferencia de Detox, XCUITest no tiene sincronización automática con solicitudes de red.

swift
// Esperando a que aparezca el elemento con tiempo de espera
let expectedElement = app.staticTexts["welcomeMessage"]
let existsPredicate = NSPredicate(format: "exists == true")
let expectation = XCTNSNotificationExpectation(object: expectedElement)
let result = XCTWaiter().wait(
    for: [expectation], timeout: 5
)
XCTAssertEqual(result, .completed)

Funciones avanzadas de XCUITest

XCUITest admite pruebas de escenarios complejos: gestos multitáctiles, notificaciones push, Deep Links, SFSafariViewController e interacción entre aplicaciones. Los intents de Siri también se pueden probar mediante XCUITest con la simulación de Siri Remote.

Pruebas de gestos

XCUITest admite todos los gestos populares: tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap. Para escenarios complejos se utiliza XCUIGesture con coordenadas y duración personalizadas. Esto permite probar gestos personalizados como dibujo o arrastrar y soltar.

Intercepción de solicitudes de red

A partir de Xcode 12, XCUITest admite la intercepción de solicitudes de red mediante XCTestExpectation y URLProtocol. Esto permite probar la aplicación en modo sin conexión o con respuestas de servidor simuladas sin modificar el código de la aplicación.

XCUITest en CI/CD

XCUITest se ejecuta en entornos CI mediante xcodebuild con el flag test. Para la ejecución paralela en varios simuladores se utiliza xcodebuild -testPlan con configuración de ejecución paralela en el esquema de Xcode. GitHub Actions, Bitrise y Jenkins tienen soporte integrado para XCUITest.

Configuración para CI

Para CI es necesario configurar el code signing, los provisioning profiles y especificar el destino (simulador o dispositivo). Las pruebas de iOS en simulador no requieren certificados. Para dispositivos reales se necesita firma automática mediante Xcode Cloud o Fastlane.

bash
# Ejecutar XCUITest en el simulador mediante xcodebuild
xcodebuild test \
  -project MyApp.xcodeproj \
  -scheme MyApp \
  -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.5' \
  -resultBundlePath ./TestResults \
  -parallel-testing-enabled YES \
  -parallel-testing-worker-count 4

Pruebas de accesibilidad con XCUITest

XCUITest está estrechamente vinculado con la API de accesibilidad de Apple, ya que la búsqueda de elementos se basa en atributos de accesibilidad. Las pruebas de accesibilidad no solo son una forma de encontrar elementos, sino también de verificar la accesibilidad de la aplicación para personas con discapacidades. XCUITest puede verificar accessibilityLabel, traits y hints.

Verificación de VoiceOver

VoiceOver es el lector de pantalla de Apple para usuarios con discapacidad visual. XCUITest permite verificar: accessibilityLabel — si el elemento está descrito con texto claro, accessibilityTraits — si el tipo de elemento coincide (botón, encabezado, imagen), y accessibilityHint — si proporciona una pista sobre el resultado de la acción. Estas verificaciones son obligatorias para publicar en App Store, y XCUITest las automatiza como parte de las ejecuciones de regresión.

Verificación automática de accesibilidad

A partir de Xcode 15, XCUITest admite la verificación integrada de accesibilidad mediante XCTAttachment con el tipo accessibilityAudit. La prueba informa automáticamente sobre elementos con contraste insuficiente, imágenes sin etiquetar y traits incorrectos. Esto reemplaza al Inspector de accesibilidad manual.

swift
// Auditoría de accesibilidad en XCUITest
func testAccessibilityAudit() {
    let app = XCUIApplication()
    app.launch()

    let audit = XCTAttachment(accessibilityAudit: app)
    add(audit)

    // Verificar un elemento específico
    let button = app.buttons["submitButton"]
    XCTAssertTrue(button.label.count > 0)
    XCTAssertTrue(button.isAccessibilityElement)
}

Pruebas de rendimiento en XCUITest

XCUITest admite la medición del rendimiento de la UI mediante XCTOSSignpostMetric y XCUIApplication.metrics. Se puede medir el tiempo de inicio de la aplicación, la velocidad de navegación y el tiempo de respuesta a gestos. Las pruebas de rendimiento se ejecutan con medición de referencia y fallan automáticamente cuando se supera el umbral. Esto ayuda a prevenir regresiones de rendimiento antes de que lleguen a los usuarios en una versión de lanzamiento.

Configuración de referencia

La referencia (baseline) es el tiempo de ejecución estándar de una prueba. Xcode recuerda la referencia para cada prueba en un modelo de dispositivo y versión de iOS específicos. Si una nueva ejecución supera la referencia en un porcentaje determinado (por defecto 10%), la prueba se considera fallida. Para actualizar la referencia, se usa el comando Edit Baseline en el informe de pruebas. Es importante recalcular la referencia al actualizar la versión de iOS o cambiar el modelo de dispositivo en el parque de CI.

Monitoreo de estabilidad de pruebas

Para monitorear la estabilidad de las pruebas de XCUITest se utilizan flags: continueAfterFailure (si continuar la prueba después del primer fallo) y planes de prueba de Xcode con configuraciones de reintentos. Se recomienda configurar el reinicio automático de pruebas fallidas (retry) — hasta 3 intentos para pruebas inestables relacionadas con tiempos de animación o retrasos de red.

Pruebas de notificaciones push y Deep Links

XCUITest admite pruebas de notificaciones push y Deep Links mediante springboard y launchArguments. Para notificaciones push se utiliza XCUIApplication().launchArguments con el parámetro -UNUserNotificationCenter y envío a través de XCTest. Los Deep Links se prueban mediante open URL con un esquema personalizado — XCUITest intercepta el diálogo del sistema y verifica si la aplicación se abrió con la pantalla correcta. Para probar el escenario de respuesta a notificaciones se utiliza XCUIApplication().springboard, que simula tocar el banner de notificación en el centro de notificaciones de iOS. Estos escenarios son críticos para aplicaciones con deep links y campañas push, donde es necesario verificar el manejo correcto de llamadas externas.

Integración con Instruments

Para la creación de perfiles de rendimiento detallados, XCUITest se integra con Instruments. Durante la prueba se puede lanzar la creación de perfiles de Time Profiler, Core Animation o Leaks mediante XCTMetric. Los resultados de la creación de perfiles se guardan en el informe y están disponibles para análisis en Xcode. Esto es especialmente útil para optimizar el tiempo de inicio de la aplicación, la navegación entre pantallas y el rendimiento de las animaciones — cuellos de botella típicos en aplicaciones iOS.

Preguntas frecuentes

¿Cuál es la diferencia entre XCUITest y XCTest?

XCTest es el framework general para todos los tipos de pruebas de Apple, incluyendo pruebas unitarias y de rendimiento. XCUITest es una extensión sobre XCTest para pruebas de UI que añade las clases XCUIApplication, XCUIElement y XCUIElementQuery para interactuar con la interfaz.

¿Se puede usar XCUITest con Objective-C?

Sí, XCUITest admite tanto Swift como Objective-C. Sin embargo, la mayoría de los ejemplos y la documentación de Apple están escritos en Swift. Los proyectos en Objective-C pueden usar XCUITest sin configuración adicional — el framework está disponible mediante @import XCTest.

¿Cómo encuentra XCUITest los elementos en la pantalla?

XCUITest utiliza la API de accesibilidad de Apple. Los elementos se encuentran por accessibilityIdentifier, accessibilityLabel, tipo (button, textField, staticText) o posición en la jerarquía. Cuanto más precisos sean los atributos de accesibilidad en el código de la aplicación, más estables serán las pruebas.

¿XCUITest admite la grabación de pruebas?

Sí, Xcode incluye un grabador integrado de pruebas de UI. Al ejecutar una prueba en modo de grabación, Xcode captura todas las interacciones con la interfaz y genera código Swift. El código grabado se puede refinar: añadir verificaciones, extraer en Page Objects y parametrizar.

¿Cómo ejecutar XCUITest en un dispositivo real?

Para ejecutar en un dispositivo real es necesario: conectar el dispositivo a un Mac, añadirlo al Apple Developer Program, configurar un provisioning profile, firmar la aplicación con un certificado de desarrollo y seleccionar el dispositivo como destino en xcodebuild.

Resumen

  • XCUITest es el framework nativo de Apple para pruebas de UI en aplicaciones iOS, iPadOS y macOS
  • La integración con Xcode proporciona grabación de pruebas, ejecución paralela e informes integrados
  • XCUIApplication y XCUIElement son las clases clave para interactuar con la aplicación
  • Los atributos de accesibilidad se utilizan como localizadores fiables, estables ante cambios de diseño
  • Las esperas se implementan mediante XCTWaiter y NSPredicate — no hay sincronización automática
  • CI/CD es compatible mediante xcodebuild con ejecución paralela en simuladores
  • Escenarios avanzados incluyen multitáctil, Siri Intents, intercepción de solicitudes de red y Deep Links

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.

Discutir el proyecto

Lea también