Pruebas automatizadas con JavaFX

Pruebas automatizadas con JavaFX

Prueba LogoRRR con TestFX

LogoRRR usa TestFX para ejecutar pruebas de integración sobre su interfaz de usuario JavaFX. Estas pruebas garantizan que los flujos de trabajo principales sobrevivan a nuevas funcionalidades, refactorizaciones y actualizaciones de dependencias — y detectan regresiones que las pruebas unitarias simplemente no pueden ver.

Por qué ahora

Tras más de 20 versiones, LogoRRR había crecido lo suficiente como para que las pruebas manuales por sí solas ya no fueran suficientes. El código base necesitaba una red de seguridad. TestFX permite controlar la ventana real de la aplicación — hacer clic en botones, abrir archivos, inspeccionar el estado de la interfaz — desde métodos de prueba JUnit.

La decisión de cuándo invertir en pruebas de extremo a extremo siempre implica un equilibrio. Al principio de un proyecto, las interfaces cambian demasiado rápido para que las pruebas puedan seguirles el ritmo. Pero una vez que los flujos principales se estabilizan, las pruebas se convierten en un acelerador en lugar de una carga. Ese punto de inflexión llegó con la versión 24.3.0.

Implementación

La sintaxis concisa de Scala se adapta de forma natural a la construcción de un pequeño DSL de pruebas. Cada acción atómica — abrir un archivo, hacer clic en el botón de cierre, verificar que el panel de pestañas está vacío — se convierte en un bloque legible y reutilizable:

@Test def openAndCloseTab(): Unit = {
    checkForEmptyTabPane()
    openFile(path)
    checkForNonEmptyTabPane()
    clickOn(lookup(UiNodes.LogFileHeaderTabs).query[StackPane](), MouseButton.SECONDARY)
    waitAndClickVisibleItem(CloseTabMenuItem.uiNode(fileId))
    checkForEmptyTabPane()
}

Escribir pruebas de interfaz también impulsó mejoras en el código de producción. Se añadió una nueva capa de servicio para abstraer la E/S de archivos y las llamadas a procesos externos — cambios que mejoraron la arquitectura independientemente de cualquier beneficio derivado de las pruebas.

Lo que detectaron las pruebas

  • Comportamiento al cerrar la aplicación — los recursos que nunca se liberaban correctamente quedaron al descubierto durante las pruebas
  • Aislamiento de pruebas — cada prueba debe configurar y limpiar su propio estado, lo que expuso varias suposiciones sutiles sobre el estado compartido de la interfaz
  • Línea base de rendimiento — vigilar el tiempo de ejecución de las pruebas evita la acumulación gradual de pruebas lentas
TestFX ejecutando la suite de pruebas de LogoRRR — las mismas interacciones que realizaría un usuario, ejecutadas de forma automática

Foto de portada por Sora Shimazaki en Pexels.