Calidad
Código generado que trae tests de verdad
“Tested” es fácil de afirmar y fácil de falsear con tests vacíos de camino feliz. Aquí significa una pirámide de cuatro capas, caminos de éxito y error, y una cobertura que puedes inspeccionar, medida con JaCoCo, no afirmada en una diapositiva.
La pirámide de tests de cuatro capas
Cuatro capas, cada una su propio perfil de Maven, cada una cazando una clase distinta de bug. De la base hacia arriba:
- Unit — cada clase en aislamiento, con sus colaboradores mockeados. Rápido y determinista; caza errores de lógica y validación.
- Integration — los adaptadores de persistencia contra un PostgreSQL, MongoDB y Redis reales levantados con Testcontainers, no un sustituto en memoria; caza fallos de mapeo, SQL y tipos.
- Component — el servicio entero arrancado en un puerto aleatorio y manejado por su frontera HTTP; caza errores de contrato, códigos de estado y validación.
- End-to-end — un flujo de usuario completo con cada colaborador real, incluida la propagación por outbox y la verificación por email; caza el cableado entre las partes.
Cobertura medida, no afirmada
Métodos, líneas y ramas, medido con JaCoCo. Cada camino ejecutado y aserto, no solo recorrido. Los caminos de error también: 400, 401, 404, 415, no solo el 200. No hay, a propósito, capa de contract de consumidor, porque el spec OpenAPI/Swagger es el contrato y la capa component lo verifica.
Prueba de que los tests cazan bugs
Una línea que se ejecuta no es lo mismo que una línea cuyo comportamiento se comprueba, así que el número de cobertura se presiona con mutation testing (PIT): inyecta fallos en el código y exige que algún test falle. Un recuento de líneas alto con un mutation score bajo significa que los tests recorren el código sin asertarlo. Aquí el mutation score se mantiene en el 95%+.
La arquitectura también se testea
El hexágono no es solo una convención de carpetas; se verifica. Reglas ArchUnit corren dentro de la suite y hacen fallar el build si el dominio tira del framework, o una capa importa algo que no debería. La estructura no puede degradarse en silencio a un MVC en capas con nombres de carpeta hexagonales.
Una consulta, no N+1
Las operaciones en lote se mantienen en un único viaje a la base de datos. Un create-many o un update masivo es una sola sentencia por lotes, nunca un bucle de N+1 consultas escondido tras una API limpia. Es una propiedad que la suite vigila, no una esperanza.
Inspecciónalo tú mismo
Cada demo expone los artefactos reales tras el número: Swagger en vivo, el dashboard de Allure, la cobertura JaCoCo y los ficheros de tests crudos. La cobertura deja de ser una afirmación y pasa a ser algo que puedes abrir.