Apuntes DAM
    Tema 8 de 9DI · 2º DAM

    Desarrollo de Interfaces

    Pruebas de Interfaces

    Pruebas funcionales, de regresión, de volumen, de usabilidad y de accesibilidad: TestFX, Compose Testing y Playwright, test con usuarios, cuestionario SUS y plan de pruebas.

    55 min lecturaIntermedio

    1. Por qué y qué probar en una interfaz

    La interfaz es lo único que el usuario ve de la aplicación: si un botón no responde, un formulario acepta datos erróneos o nadie encuentra la opción que busca, la aplicación ha fallado aunque el resto funcione. Las pruebas comprueban que la interfaz funciona, que es usable y que es accesible, y que sigue siéndolo después de cada cambio.

    Probar una interfaz es como probar un coche nuevo 🚗

    🔧
    Funcionales
    ¿Frenan los frenos y se encienden las luces? Cada control hace lo que debe.
    🛣️
    De uso
    ¿Es cómodo conducirlo? Personas reales lo usan y se mide su experiencia.
    ♿
    De accesibilidad
    ¿Lo puede usar cualquiera? Teclado, lector de pantalla, contraste.
    Tipo de pruebaCompruebaCómo
    UnitariasLa lógica detrás de la interfaz (validaciones, cálculos, controladores)JUnit, sin interfaz
    De componentes / interfazQue cada pantalla y control se comporta bienTestFX (JavaFX), Espresso y Compose Testing (Android), Testing Library (web)
    De integración y extremo a extremo (E2E)Un flujo completo: iniciar sesión → comprar → recibir confirmaciónPlaywright, Selenium, Cypress, Appium
    De regresiónQue lo que funcionaba sigue funcionando tras un cambioAutomatizadas en integración continua; pruebas de captura (screenshot)
    De volumen y rendimientoTiempos de respuesta con muchos datos (una tabla de 100 000 filas)Medir y perfilar; JMeter para la parte servidor
    De usabilidadSi los usuarios consiguen sus objetivos con facilidadTest con usuarios, cuestionarios (SUS), analítica
    De accesibilidadQue cumple las pautas WCAG 2.2 AAaxe, Lighthouse, WAVE, lector de pantalla, teclado
    De seguridadValidación de entradas, datos sensibles, permisosPruebas manuales, OWASP ZAP
    De aceptaciónQue cumple lo acordado con el clienteEl cliente valida en un entorno de pruebas

    2. Pruebas automatizadas de interfaz

    Un robot manipula la interfaz como lo haría un usuario (escribir, pulsar, esperar) y comprueba el resultado. Para que las pruebas sean estables, los controles se localizan por identificadores o por su rol accesible, no por su posición en pantalla.

    LoginTest.java (TestFX + JUnit 5)
    1@ExtendWith(ApplicationExtension.class)
    2class LoginTest {
    3
    4    @Start
    5    void start(Stage stage) throws IOException {
    6        Parent raiz = FXMLLoader.load(getClass().getResource("/login.fxml"));
    7        stage.setScene(new Scene(raiz));
    8        stage.show();
    9    }
    10
    11    @Test
    12    void credencialesIncorrectasMuestranError(FxRobot robot) {
    13        robot.clickOn("#usuario").write("ana");
    14        robot.clickOn("#clave").write("mal");
    15        robot.clickOn("#entrar");
    16        FxAssert.verifyThat("#mensaje", LabeledMatchers.hasText("Usuario o contraseña incorrectos"));
    17    }
    18
    19    @Test
    20    void botonDesactivadoSinDatos(FxRobot robot) {
    21        FxAssert.verifyThat("#entrar", NodeMatchers.isDisabled());
    22    }
    23}
    LoginScreenTest.kt (Jetpack Compose)
    1class LoginScreenTest {
    2    @get:Rule val compose = createComposeRule()
    3
    4    @Test
    5    fun muestraErrorConEmailInvalido() {
    6        compose.setContent { LoginScreen() }
    7        compose.onNodeWithText("Email").performTextInput("ana")
    8        compose.onNodeWithText("Entrar").performClick()
    9        compose.onNodeWithText("Introduce un email válido").assertIsDisplayed()
    10    }
    11}
    suscripcion.spec.js (Playwright)
    1import { test, expect } from "@playwright/test";
    2
    3test("suscripción con correo válido", async ({ page }) => {
    4  await page.goto("http://localhost:5173/");
    5  await page.getByLabel("Correo electrónico").fill("ana@mail.com");
    6  await page.getByRole("button", { name: "Suscribirme" }).click();
    7  await expect(page.getByText("Suscripción completada")).toBeVisible();
    8});
    9// npx playwright test --headed      (ejecuta en Chromium, Firefox y WebKit)

    La pirámide de pruebas

    Muchas pruebas unitarias (rápidas y baratas), bastantes de integración y pocas de extremo a extremo (lentas y frágiles). Si la lógica está separada de la interfaz (patrón MVC o MVVM), casi todo se prueba sin abrir ninguna ventana.
    Cómo hacer Testing automatizado usando Playwright — Garaje de ideas | Tech

    3. Pruebas de usabilidad

    Las pruebas automáticas dicen si la interfaz funciona; solo las personas dicen si es fácil de usar. Con 5 usuarios se detectan la mayoría de los problemas importantes (Jakob Nielsen).

    1. Objetivos: qué se quiere averiguar («¿encuentran cómo devolver un pedido?»).
    2. Participantes: 5–8 personas del perfil real de usuario (no los desarrolladores).
    3. Tareas: escenarios realistas sin pistas («Quieres devolver las zapatillas que compraste ayer»).
    4. Sesión: el usuario piensa en voz alta; el moderador observa y no ayuda. Se graba la pantalla.
    5. Métricas: tasa de éxito, tiempo por tarea, errores, clics, satisfacción (cuestionario SUS).
    6. Informe: problemas encontrados, gravedad, evidencias y propuestas de mejora priorizadas.
    TécnicaDescripción
    Test moderado / no moderadoCon un observador presente o a distancia con herramientas como Maze o Lookback
    Evaluación heurísticaExpertos revisan la interfaz con las 10 heurísticas de Nielsen (visto en el tema de usabilidad)
    Test A/BDos versiones a grupos distintos de usuarios reales; gana la que mejor cumple el objetivo
    Card sortingLos usuarios agrupan las opciones: ayuda a organizar menús
    Mapas de calor y analíticaDónde hacen clic y dónde abandonan (Hotjar, Microsoft Clarity)

    El cuestionario SUS

    El System Usability Scale son 10 afirmaciones que el usuario puntúa del 1 al 5 tras usar el sistema. Las impares son positivas (se resta 1) y las pares negativas (se resta de 5); la suma se multiplica por 2,5 y da una nota de 0 a 100. La media de la industria es 68.

    Cuestionario SUS (System Usability Scale)

    1 = totalmente en desacuerdo · 5 = totalmente de acuerdo

    1. Creo que me gustaría usar este sistema con frecuencia.
    2. Encontré el sistema innecesariamente complejo.
    3. Pensé que el sistema era fácil de usar.
    4. Creo que necesitaría ayuda de un técnico para poder usarlo.
    5. Las distintas funciones del sistema estaban bien integradas.
    6. Pensé que había demasiadas incoherencias en el sistema.
    7. Imagino que la mayoría de la gente aprendería a usarlo muy rápido.
    8. El sistema me pareció muy engorroso de usar.
    9. Me sentí muy seguro/a usando el sistema.
    10. Necesité aprender muchas cosas antes de poder usarlo.

    50.0

    sobre 100 · usabilidad Mala

    Test de Usabilidad vs Prueba de Aceptación de Usuario (UAT) — UXTips

    4. Pruebas de accesibilidad

    • Automáticas: axe DevTools, Lighthouse (pestaña de Chrome), WAVE. Detectan alrededor de un tercio de los problemas: falta de texto alternativo, contraste, etiquetas, roles.
    • Teclado: recorrer toda la interfaz con Tab, Mayús+Tab, Enter, Espacio y flechas; el foco siempre visible y en un orden lógico.
    • Lector de pantalla: NVDA (Windows), VoiceOver (macOS/iOS), TalkBack (Android). ¿Se entiende qué es cada control?
    • Zoom y contraste: al 200 % no se pierde contenido; contraste mínimo 4,5:1 en texto normal.
    • En Android, Accessibility Scanner; en JavaFX, probar con el lector de pantalla del sistema y setAccessibleText.
    accesibilidad.spec.js
    1// Prueba automática de accesibilidad con Playwright + axe
    2import AxeBuilder from "@axe-core/playwright";
    3
    4test("la página de inicio no tiene errores de accesibilidad", async ({ page }) => {
    5  await page.goto("/");
    6  const resultados = await new AxeBuilder({ page }).withTags(["wcag2a", "wcag2aa"]).analyze();
    7  expect(resultados.violations).toEqual([]);
    8});
    🧩JS · DOMArregla la interfaz: accesibilidad y validaciónDifícil

    Esta interfaz no supera las pruebas de accesibilidad y usabilidad. Sin tocar el HTML, corrígela desde JavaScript: 1. El «botón» #enviar es un <div>: dale role="button" y tabindex="0", y haz que Enter y Espacio hagan lo mismo que el clic. 2. El campo #email no tiene etiqueta: añádele aria-label="Correo electrónico". 3. Al enviar, si el email no contiene «@» y «.», marca el campo con aria-invalid="true" y escribe «Introduce un correo válido» en #error (que debe tener role="alert"); si es válido, aria-invalid="false", vacía #error y escribe «Suscripción completada» en #estado.

    index.htmlsolo lectura
    script.js
    Vista previa

    5. Plan de pruebas y documentación

    Las pruebas se planifican y sus resultados se documentan para poder repetirlas y demostrar la calidad.

    IDCaso de pruebaPasosResultado esperadoResultadoEstado
    CP-01Login correctoUsuario «ana», clave válida, pulsar EntrarSe abre la pantalla principalCorrecto✅
    CP-02Login sin claveUsuario «ana», clave vacíaBotón Entrar desactivadoEl botón se puede pulsar❌ INC-31
    CP-03Navegación con tecladoRecorrer el formulario con TabOrden: usuario, clave, recordar, EntrarCorrecto✅
    CP-04Tabla con 50 000 clientesAbrir el listadoCarga en menos de 2 s y desplazamiento fluido3,8 s⚠️
    • Plan de pruebas: alcance, tipos de prueba, entornos (sistemas, resoluciones, navegadores, dispositivos), responsables, criterios de aceptación.
    • Casos de prueba con datos concretos y resultado esperado, trazados a los requisitos.
    • Informe de resultados con las incidencias abiertas (con capturas y pasos para reproducirlas) y su gravedad.
    • Automatizar la ejecución en integración continua (GitHub Actions) para que cada cambio pase las pruebas antes de publicarse.

    6. Ejercicios

    Ejercicio Práctico
    Medio

    Plan de pruebas de un formulario de registro

    Una aplicación tiene un formulario de registro con nombre, email, contraseña (mínimo 8 caracteres con un número), repetir contraseña, fecha de nacimiento (mayor de 16) y aceptación de condiciones. Diseña al menos 10 casos de prueba que cubran pruebas funcionales (incluidos valores límite), de usabilidad y de accesibilidad, con el formato ID / caso / pasos / resultado esperado.

    Ejercicio Práctico
    Fácil

    Calcula la puntuación SUS

    Un usuario responde al cuestionario SUS: 4, 2, 5, 1, 4, 2, 4, 2, 3, 3. Calcula su puntuación paso a paso e interpreta el resultado. Compruébalo con la calculadora del tema.

    ¿Has terminado este tema?

    Crea una cuenta gratis para guardar qué temas has terminado, subir de nivel y ganar medallas.

    Guardar mi progreso