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 🚗
| Tipo de prueba | Comprueba | Cómo |
|---|---|---|
| Unitarias | La lógica detrás de la interfaz (validaciones, cálculos, controladores) | JUnit, sin interfaz |
| De componentes / interfaz | Que cada pantalla y control se comporta bien | TestFX (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ón | Playwright, Selenium, Cypress, Appium |
| De regresión | Que lo que funcionaba sigue funcionando tras un cambio | Automatizadas en integración continua; pruebas de captura (screenshot) |
| De volumen y rendimiento | Tiempos de respuesta con muchos datos (una tabla de 100 000 filas) | Medir y perfilar; JMeter para la parte servidor |
| De usabilidad | Si los usuarios consiguen sus objetivos con facilidad | Test con usuarios, cuestionarios (SUS), analítica |
| De accesibilidad | Que cumple las pautas WCAG 2.2 AA | axe, Lighthouse, WAVE, lector de pantalla, teclado |
| De seguridad | Validación de entradas, datos sensibles, permisos | Pruebas manuales, OWASP ZAP |
| De aceptación | Que cumple lo acordado con el cliente | El 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.
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}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}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
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).
- Objetivos: qué se quiere averiguar («¿encuentran cómo devolver un pedido?»).
- Participantes: 5–8 personas del perfil real de usuario (no los desarrolladores).
- Tareas: escenarios realistas sin pistas («Quieres devolver las zapatillas que compraste ayer»).
- Sesión: el usuario piensa en voz alta; el moderador observa y no ayuda. Se graba la pantalla.
- Métricas: tasa de éxito, tiempo por tarea, errores, clics, satisfacción (cuestionario SUS).
- Informe: problemas encontrados, gravedad, evidencias y propuestas de mejora priorizadas.
| Técnica | Descripción |
|---|---|
| Test moderado / no moderado | Con un observador presente o a distancia con herramientas como Maze o Lookback |
| Evaluación heurística | Expertos revisan la interfaz con las 10 heurísticas de Nielsen (visto en el tema de usabilidad) |
| Test A/B | Dos versiones a grupos distintos de usuarios reales; gana la que mejor cumple el objetivo |
| Card sorting | Los usuarios agrupan las opciones: ayuda a organizar menús |
| Mapas de calor y analítica | Dó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.
1 = totalmente en desacuerdo · 5 = totalmente de acuerdo
50.0
sobre 100 · usabilidad Mala
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.
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});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.
5. Plan de pruebas y documentación
Las pruebas se planifican y sus resultados se documentan para poder repetirlas y demostrar la calidad.
| ID | Caso de prueba | Pasos | Resultado esperado | Resultado | Estado |
|---|---|---|---|---|---|
| CP-01 | Login correcto | Usuario «ana», clave válida, pulsar Entrar | Se abre la pantalla principal | Correcto | ✅ |
| CP-02 | Login sin clave | Usuario «ana», clave vacía | Botón Entrar desactivado | El botón se puede pulsar | ❌ INC-31 |
| CP-03 | Navegación con teclado | Recorrer el formulario con Tab | Orden: usuario, clave, recordar, Entrar | Correcto | ✅ |
| CP-04 | Tabla con 50 000 clientes | Abrir el listado | Carga en menos de 2 s y desplazamiento fluido | 3,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
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.
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.