Capturas de pantalla automáticas de iOS con XCTestplan y Xcode 11

Raiffeisenbank tiene varias aplicaciones móviles que deberían ejecutarse en una amplia variedad de dispositivos y sistemas operativos, por lo que intentamos automatizar los procesos de rutina en las pruebas. Este artículo nos pareció útil y decidimos traducirlo. foto fuente: unsplash.com Si su aplicación es multilingüe, universal y está diseñada para diferentes dispositivos, entonces puede pasar mucho tiempo creando capturas de pantalla para cada configuración. Imagina que tienes cuatro idiomas, soporte para iPad y iPhone y necesitas guardar 4 pantallas cada uno, estas son 32 capturas de pantalla. El proceso debe automatizarse para no perder tiempo cada vez que se actualizan las interfaces.






La herramienta XCTestPlan, que apareció en Xcode 11, nos permite crear varias configuraciones para las pruebas. Hoy en día, las configuraciones se utilizan con mayor frecuencia para determinar cómo se ejecutarán las pruebas, incluida la elección del idioma para la aplicación. En este artículo, aprenderá a usar XCTestPlan para automatizar capturas de pantalla.

Lanzar XCTestplan


Configuremos un objetivo separado de UITests para automatizar la creación de capturas de pantalla, lo cual es especialmente útil si no planea ejecutar sus pruebas principales con estas configuraciones. Para crear un nuevo objetivo, seleccione Archivo -> Nuevo -> Objetivo y cree un nuevo Paquete de prueba de IU . Después de eso, debe agregar un nuevo XCTestplan a este objetivo. Para hacer esto, puede usar el menú Producto -> Plan de prueba -> Nuevo plan de prueba , o en el Editor de esquemas seleccionar Convertir para usar Planes de prueba . Si hace esto a través del menú, debe asegurarse de que el nuevo objetivo esté en la pestaña `Prueba`.

Dado que queremos configurar solo la configuración de idioma, podemos dejar la Configuración compartida sin cambios y simplemente agregar una nueva configuración para cada idioma que admitamos. Así es como se ve la configuración de una aplicación que admite inglés, alemán y francés:

imagen

esta es toda la configuración y el lanzamiento necesarios de XCTestplan.

Captura de pantalla de automatización


Sus pruebas de IU al crear capturas de pantalla prácticamente no diferirán de sus pruebas habituales, excepto que crearán archivos adjuntos. También puede agregar comprobaciones XCTAssert para que las pruebas fallen si algo sale mal.

Otro punto importante: puede que tenga que esperar ForExpectations en caso de que su IU no esté lista para cuando se tome la captura de pantalla ( mostrar / ocultar teclado, finalizar animación).

A continuación se muestra un ejemplo con todos los métodos auxiliares:

func testScreenshots() {
    let app = XCUIApplication()
    let searchButton = app.buttons["search"]
    searchButton.tap()
    
    let keyboard = app.keyboards.firstMatch
    waitForExistence(of: keyboard)
    app.typeText("Cupertino")
    add(takePromoShot(name: "Search"))
    
    let firstResult = app.cells.firstMatch
    firstResult.tap()
    waitForDisappearance(of: keyboard)
    add(takePromoShot(name: "Result"))
}

func waitForExistence(of element: XCUIElement) {
    let predicate = NSPredicate(format: "exists == TRUE")
    expectation(for: predicate, evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: 5.0, handler: nil)
}

func waitForDisappearance(of element: XCUIElement) {
    let predicate = NSPredicate(format: "exists == FALSE")
    expectation(for: predicate, evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: 5.0, handler: nil)
}

func takePromoShot(name: String) -> XCTAttachment {
    let lang = Locale.preferredLanguages[0]
    let screenshot = XCUIScreen.main.screenshot()
    let attachment = XCTAttachment(screenshot: screenshot)
    attachment.lifetime = .keepAlways
    attachment.name = "\(lang)-\(name)"
    return attachment
}

Presta atención a la última característica. Toma el nombre de la instantánea, agrega el identificador de idioma, toma una captura de pantalla y devuelve un XCTAttachment con el valor del parámetro .keepAlways . Esto es importante porque de forma predeterminada, las capturas de pantalla tomadas durante las pruebas se eliminan si las pruebas tienen éxito. Lifiteme es un parámetro importante porque garantiza que la captura de pantalla se guarde una vez completada la prueba. Durante las pruebas de IU, las capturas de pantalla se toman constantemente. Son muy útiles cuando necesita determinar por qué y cuándo cayó la prueba; pero de forma predeterminada, las capturas de pantalla se eliminarán si las pruebas tuvieron éxito. Por lo tanto, cuando testScreenshots () tenga éxito, solo tendrá las capturas de pantalla necesarias.

Barra de estado habitual


La mayoría de los desarrolladores prefieren ver en sus capturas de pantalla una barra de estado con el momento adecuado, una señal de red completa y otros detalles. En Xcode 11, esto se hace aún más fácil. Hay una utilidad xcrun simctl status_bar , que le permite especificar esta configuración. Esto se puede agregar como Fase de construcción :

xcrun simctl status_bar booted override --time 9:41 --operatorName ' ' --cellularMode active --cellularBar 4 --wifiBars 3 --batteryState charged

Después de este comando, la barra de estado se verá igual que en los materiales de marketing de Apple. Desafortunadamente, el equipo no funcionará en un dispositivo real, solo en un simulador. También debe tenerse en cuenta que el simulador que use debe estar ejecutándose antes de comenzar las pruebas para recopilar capturas de pantalla.

Recolectando las capturas de pantalla resultantes


Ahora podemos ejecutar nuestras pruebas de IU. Cuando pasen, veremos los resultados en Report Navigator en Xcode. También habrá pruebas que contengan procedimientos agrupados por configuraciones de idioma. Los procedimientos que tienen archivos adjuntos están marcados con un clip para papel. Las imágenes mismas se pueden abrir en QuickLook .

imagen

Recolectar por separado todas las imágenes resultantes puede llevar mucho tiempo, especialmente si su aplicación admite muchos idiomas. Desafortunadamente, estos archivos adjuntos no aparecen como png o jpg entre los resultados de la prueba (otro cambio en Xcode 11). Pero puede analizar los resultados de la prueba y encontrar el JSON que apunta a los archivos adjuntos reales y los recopila. Esto se puede hacer usando la utilidad xcparse.. Se instala usando Homebrew y se inicia con el comando:

xcparse screenshots /path/to/Test.xcresult /path/to/outputDirectory

Las banderas adicionales agruparán los archivos por dispositivo, sistema operativo o configuración. Los nombres de nuestros archivos contienen un identificador de idioma, por lo que simplemente puede ordenarlos por nombre.

Conclusión


El enfoque descrito ya nos ha permitido ahorrar suficiente tiempo, especialmente en situaciones en las que hubo un requisito para admitir el dispositivo con una nueva resolución o la interfaz se actualizó significativamente. En WWDC20, me gustaría ver la elección de dispositivos como parte de la configuración de XCTestplan, pero por ahora, debe elegir manualmente o utilizar un script que recopile las capturas de pantalla necesarias en la AppStore.

All Articles