En el desarrollo Frontend, la calidad y la fiabilidad del código son esenciales para garantizar una experiencia de usuario óptima. A medida que las aplicaciones web se vuelven más complejas y dinámicas, el testing se convierte en una parte integral del proceso de desarrollo. En este post veremos la importancia del testing en el desarrollo, los diferentes tipos de pruebas y estrategias de testing, las herramientas más populares y las mejores prácticas para implementarlas.

La importancia del testing en el desarrollo Frontend

El testing es crucial para detectar errores y problemas antes de que el software llegue a los usuarios finales. En el Frontend, debido a que la interfaz de usuario es el primer punto de contacto del usuario con la aplicación, cualquier fallo puede afectar negativamente la experiencia del usuario y la reputación de la marca. Las pruebas permiten:

Estrategias de testing en desarrollo Frontend

En la búsqueda de una estrategia de testing efectiva, es crucial comprender los objetivos y necesidades específicas de tu aplicación. Antes de crear pruebas, es fundamental definir claramente el propósito de las mismas y establecer criterios para considerar que la aplicación ha sido probada adecuadamente.

Enfoque en el usuario

A menudo se piensa que alcanzar una amplia cobertura de pruebas es la meta final para los desarrolladores, pero este enfoque no siempre es el más adecuado. Es esencial tener en cuenta otro factor crucial al definir tu estrategia de pruebas: satisfacer las necesidades de los usuarios/as. Esperan que las aplicaciones funcionen correctamente, y como desarrolladores/as, debemos esforzarnos por cumplir con esas expectativas.

La elección de la estrategia de testing adecuada dependerá de la naturaleza y los requisitos de nuestra aplicación, así como del equilibrio entre cobertura y la satisfacción de las expectativas de los usuarios/as. A continuación, se describen diferentes tipos de estrategias de testing.

Test Pyramid

El test pyramid o pirámide de pruebas es un concepto en el desarrollo de software que visualiza cómo estructurar las pruebas automatizadas de manera eficiente. La pirámide está dividida en varios niveles que representan diferentes tipos de pruebas, cada uno con una frecuencia y enfoque distintos.

Estructura de test pyramid. De abajo a arriba: unit, integration, E2E

Capas de la pirámide de pruebas

  1. Pruebas unitarias. Estas pruebas se centran en componentes individuales o funciones específicas del código. Son rápidas y fáciles de ejecutar, y ayudan a garantizar que cada parte del código funcione de manera independiente.
// Ejemplo de prueba unitaria con Jest
import { suma } from './math';

test('suma 1 + 2 para obtener 3', () => {
 expect(suma(1, 2)).toBe(3);
});
  1. Pruebas de integración. Estas pruebas verifican cómo interactúan diferentes partes del sistema. Aseguran que los componentes funcionan juntos como se espera.
import React from 'react';
import { render, screen } from '@testing-library/react';
import App from './App';

test('renderiza el título correctamente', () => {
 render(<App />);
 const titulo = screen.getByText(/Bienvenido a la App/i);
 expect(titulo).toBeInTheDocument();
});
  1. Pruebas funcionales o End-to-End (E2E). Estas pruebas simulan el comportamiento del usuario/a para verificar que todo el sistema funciona desde su punto de vista. Las herramientas más populares para este tipo de pruebas son Cypress y Selenium.
// Ejemplo de prueba E2E con Cypress
describe('Prueba de inicio de sesión', () => {
 it('debería permitir al usuario iniciar sesión', () => {
 cy.visit('/login');
 cy.get('input[name=username]').type('usuario');
 cy.get('input[name=password]').type('contraseña');
 cy.get('button[type=submit]').click();
 cy.url().should('include', '/dashboard');
 });
});
  1. Pruebas de rendimiento. Estas pruebas se centran en la velocidad y la capacidad de respuesta de la aplicación. Lighthouse de Google es una herramienta común para medir y mejorar el rendimiento.
# Ejecutar una auditoría de Lighthouse desde la línea de comandos
lighthouse https://tusitio.com --output html --output-path reporte.html

Confianza vs Recursos

Estructura de test pyramid con una relación entre la confianza y los recursos. La gráfica de costes crece de abajo a arriba en la pirámide y la gráfica de tests crece de izquierda a derecha. De abajo a arriba dentro de la pirámide: unit, integration, E2E

El orden de las capas no es casualidad; refleja las prioridades y costos. Las pruebas E2E, aunque brindan la mayor confianza, requieren más recursos. La estrategia de la pirámide de pruebas sugiere centrarse más en las pruebas unitarias y priorizar los casos más críticos para las pruebas E2E.

Adaptaciones de la pirámide de pruebas

Testing Diamond

En esta adaptación, se reduce la cantidad de pruebas unitarias y se pone mayor énfasis en las pruebas de integración, creando una forma de diamante:

Estructura de test diamond. De abajo a arriba: unit, integration, E2E. Las esquinas de unit, en la parte baja de la pirámide, desaparecen. De esta forma, la imagen de pirámide se transforma en una imagen de diamante.
  1. Pruebas unitarias: solo las más críticas.
  2. Pruebas de integración: enfocadas en la combinación de unidades.
  3. Pruebas E2E: solo para los casos más críticos.

Testing Honeycomb

Inspirado por Spotify, este enfoque es adecuado para entornos de microservicios, destacando la importancia de las pruebas de integración:

Estructura con forma de panal de avispa. De abajo a arriba: implementation detail, integration, integrated.
  1. Pruebas integradas: evalúan la corrección de un sistema dependiendo de otro.
  2. Pruebas de integración: verifican la interacción entre servicios.
  3. Pruebas de detalles de implementación: similar a las pruebas unitarias, pero en partes aisladas del código.

Testing Trophy

Esta estrategia, desarrollada por Kent C. Dodds, incluye el análisis estático y se enfoca en las pruebas de integración:

Estructura con forma de trofeo. De abajo a arriba: static, unit, integration, ui
  1. Análisis estático: detecta errores tipográficos y de estilo.
  2. Pruebas unitarias: menos énfasis que en la pirámide de pruebas.
  3. Pruebas de integración: mayor enfoque, equilibrando coste y confianza.
  4. Pruebas de interfaz de usuario: incluye pruebas E2E y visuales.

Enfoques centrados en la interfaz de usuario

Aunque la automatización de pruebas es valiosa, las pruebas manuales siguen siendo esenciales. La automatización debe complementar, no reemplazar, las pruebas manuales.

Testing Ice Cone

Estructura con forma de helado de cono. De abajo a arriba: unit, integration, E2E, manual

Similar a una pirámide invertida, pero con un mayor enfoque en las pruebas manuales y de interfaz de usuario. Esta estrategia es costosa en términos de recursos y trabajo manual.

Testing Crab

Estructura con forma de pirámide y 3 pirámides invertidas, una al lado de la otra, en su base. En las pirámides invertidas de la base, de izquierda a derecha: component tests, unit tests, API test. En la pirámide grande principal sobre estas 3 pirámides invertidas: functional and visual E2E test.

Enfatiza más en las pruebas E2E y visuales, asegurando que la aplicación funcione bien y se vea bien. Es más adecuada para proyectos más pequeños con menos pruebas y menor complejidad.

Herramientas populares para testing en Frontend

Mejores prácticas para implementar testing en Frontend

Escribir pruebas desde el inicio. Integrar las pruebas desde el principio del desarrollo para identificar y corregir errores.
Automatización de pruebas. Automatizar las pruebas para garantizar que se ejecuten sin intervención manual, especialmente en procesos de integración y entrega continua.
Cobertura de pruebas. Asegurarse de que una porción significativa del código esté cubierta por pruebas para minimizar la posibilidad de errores.
Pruebas simples y mantenibles. Mantener las pruebas simples y evitar dependencias innecesarias para facilitar el mantenimiento a largo plazo.
Revisiones y refactorización. Revisar y actualizar las pruebas regularmente, especialmente después de cambios importantes en el código base.

Conclusión

El testing es un componente esencial en el desarrollo Frontend, asegurando que las aplicaciones funcionen correctamente y ofreciendo una experiencia de usuario de alta calidad. A través de diversas estrategias, como la pirámide de pruebas y sus adaptaciones, podemos encontrar el equilibrio adecuado entre la cobertura de pruebas y los recursos disponibles. Las herramientas como Jest, React Testing Library, Cypress y Selenium facilitan la implementación de pruebas efectivas, mientras que las mejores prácticas garantizan la mantenibilidad y eficacia de las pruebas. En última instancia, una estrategia de testing bien definida y ejecutada no solo mejora la calidad del código, sino que también fortalece la confianza del usuario/a en la aplicación.

Referencias

Charla de Jesús Lopez en la Commit Conf de 2024: La pirámide del testing.

Cuéntanos qué te parece.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.

Suscríbete