Escribir tests que sirven de verdad: guía práctica para equipos que despliegan los viernes

Escribir tests es una de esas tareas que todo el mundo dice valorar y muy pocos ejecutan con criterio. El resultado habitual son suites infladas, lentas y frágiles que nadie mantiene, o peor: cero cobertura y un despliegue cada dos semanas rezando para que nada explote en producción. La diferencia entre una suite útil y una que estorba no está en la cantidad de líneas, sino en las decisiones que tomas antes de escribir la primera aserción. En este tutorial vamos a pasar de la teoría a la práctica con ejemplos concretos, métricas que importan en 2026 y errores que puedes evitar desde hoy.

Define qué vas a probar antes de tocar el teclado

La mayoría de los tests malos no nacen de un framework equivocado, sino de no haber decidido qué comportamiento se está validando. Un test es una especificación ejecutable: si no puedes resumir en una frase qué garantiza, probablemente estás probando la implementación en lugar del comportamiento. La distinción importa porque probar detalles internos hace que cualquier refactor rompa veinte tests sin que nada se haya roto funcionalmente.

Antes de escribir, plantéate tres preguntas: ¿qué entrada produce qué salida?, ¿qué pasa en los bordes (valores nulos, listas vacías, números negativos, cadenas con acentos)?, y ¿qué dependencias externas entran en juego? Esa tercera pregunta determina si necesitas un mock o un contenedor real. Como regla práctica, solo simula lo que no controlas y no puedes levantar en el entorno de pruebas: APIs de terceros, pasarelas de pago, servicios de correo. La base de datos, si puedes, levántala de verdad con Testcontainers o un contenedor efímero en CI.

En cuanto a cobertura, deja de mirar el porcentaje de líneas como si fuera una nota de examen. Una cobertura del 85 % con tests que solo verifican que la función no lanza excepción vale menos que un 60 % con aserciones significativas. Lo que sí conviene medir en 2026 es la **mutation score** mediante herramientas como Stryker (JS/TS, C#), mutmut o Cosmic Ray (Python). Si tus mutaciones sobreviven en un 40 %, tus tests están decorando, no protegiendo.

Prompt
Actúa como ingeniero de calidad senior. Para la función [nombre y descripción de la función], genera una tabla con los casos de prueba que debo cubrir: camino feliz, valores límite, entradas inválidas y casos de negocio ambiguos. Para cada caso indica la entrada, la salida esperada y el riesgo que mitiga. No escribas código todavía.