Tu pipeline de CI se pone en rojo, alguien hace clic en rerun y la compilación vuelve verde en el segundo intento. El PR se fusiona y nadie pregunta por qué falló la prueba la primera vez, porque el equipo ya tiene la respuesta preparada: “era inestable.” Si esto ocurre una vez a la semana, tienes un problema que merece ser nombrado.
Las pruebas inestables son comprobaciones automatizadas que pasan y fallan sin que nadie toque el código. Parecen inofensivas porque cada rerun individual termina en verde, pero son el momento en que tu QA deja de ser una señal de calidad y empieza a ser ruido que tu equipo aprende a ignorar. Aparecen de la misma manera que las salidas inconsistentes que erosionan la confianza de los usuarios en los sistemas de IA, y el problema subyacente es el mismo: cuando los resultados no son predecibles, la gente deja de confiar en ellos.
En este artículo, te explicaremos cuánto cuestan realmente las pruebas inestables a tu equipo, por qué ocurren, cómo solucionarlas correctamente y cómo mantenerlas fuera de tu suite desde el principio.
Cómo la Inestabilidad de las Pruebas Daña a Tu Equipo
El daño causado por la inestabilidad de las pruebas rara vez es un único fallo dramático. Se acumula lentamente y la mayoría de los equipos solo lo nota después de meses de deterioro. Según el Informe Mundial de Calidad Capgemini 2025-26, el 60% de las organizaciones tiene dificultades con datos de prueba seguros y escalables, que es uno de los fundamentos sobre los que se construye la inestabilidad.
Esto es lo que la inestabilidad le hace realmente a un equipo con el tiempo:
- Los bugs reales se ocultan detrás de los fallos ignorados. Cuando el primer instinto del equipo ante una compilación en rojo es “probablemente inestable, dale a rerun”, se están entrenando a sí mismos para ignorar los fallos, y las regresiones reales se cuelan con el mismo encogimiento de hombros.
- El reflejo de rerun reemplaza a la investigación. Los ingenieros hacen clic en rerun hasta que la compilación está en verde y fusionan, así la suite de pruebas deja de funcionar como una puerta de calidad y empieza a funcionar como un lanzamiento de moneda con pasos adicionales.
- Los lanzamientos pierden su confianza. O retrasas un lanzamiento mientras alguien desenreda si un fallo es real, o lo publicas y esperas que todo vaya bien, y ninguno de los dos enfoques escala a medida que tu producto crece. Una suite de pruebas fiable es lo que hace posible la confianza previa al lanzamiento.
- Una prueba mala infecta al resto. Una vez que tu equipo deja de confiar en una prueba, empieza a cuestionar toda la suite, y las pruebas fiables reciben el mismo encogimiento de hombros que las inestables.
- La incorporación sufre. Los nuevos ingenieros no pueden distinguir qué fallos importan, así que siguen preguntando y, peor aún, adquieren el reflejo de rerun desde el primer día y lo llevan consigo.
Una suite de pruebas solo vale lo que la confianza que tu equipo deposita en ella, y esa confianza es el activo que la inestabilidad erosiona más. Este es el problema de calidad de combustión lenta que desenredamos para equipos de ritmo rápido a través de nuestras pruebas de regresión, donde la estabilidad de la suite es todo el objetivo.
Por Qué Ocurren las Pruebas Inestables: Cinco Causas Reales
La mayoría de los fallos se deben a una de estas cinco causas. Saber a cuál te enfrentas ya es la mitad de la solución. La otra mitad consiste en resistir la tentación de volver a ejecutar la prueba con la esperanza de que dé resultado positivo. Los equipos que se saltan el diagnóstico acaban con un conjunto de pruebas en el que nadie confía y una compilación fallida que todos aprenden a ignorar.
Temporización y Sincronización
La prueba se mueve más rápido que la app. Hace clic en un botón e inmediatamente comprueba el resultado, pero la app todavía está cargando, y un mensaje de confirmación que tarda 200 milisegundos en renderizarse no estará ahí si tu prueba comprueba a los 50. La analogía de la conversación funciona bien aquí: es como preguntar “¿me has escuchado?” antes de que la otra persona haya terminado de hablar. Los problemas de temporización son la causa más común de inestabilidad en todos los frameworks y lenguajes.
Diferencias en el Entorno de Pruebas
El portátil de tu desarrollador tiene más RAM, un disco más rápido y una conexión de red estable. Tu runner de CI es compartido, más lento y está limitado en recursos, así que una prueba que se ejecuta en 2 segundos en un portátil de gama alta puede tardar 5 segundos en un pequeño contenedor de CI. El código está bien, el entorno no, y por eso el chiste de “funciona en mi máquina” nunca parece morir.
Pruebas que No Limpian Tras de Sí
Una prueba bien comportada configura sus propios datos, ejecuta su comprobación y deja el sistema tal como lo encontró. Cuando una prueba crea un registro en la base de datos y olvida borrarlo, la siguiente prueba se ejecuta contra un estado contaminado. A veces no pasa nada, pero a veces la siguiente prueba falla de maneras sutiles que parecen inestabilidad y en realidad son un problema de higiene. Esta categoría generalmente aparece solo cuando las pruebas se ejecutan en un orden diferente o en paralelo.
Pruebas que Dependen Entre Sí
Esta está estrechamente relacionada y es igual de común. La prueba B depende silenciosamente de algo que hizo la prueba A, pero nadie documentó la dependencia, así que ejecutarlas en un orden diferente hace que la prueba B falle. Los sistemas de CI modernos a menudo aleatorizan el orden de las pruebas o las ejecutan en paralelo, que es exactamente cuando emergen estas dependencias invisibles. El equipo piensa que la prueba B es inestable, pero no lo es. Solo tenía un compañero de habitación que nunca declaró.
Servicios Externos de los que Depende la Prueba
Las pruebas que golpean APIs reales, servicios de terceros o bases de datos en vivo heredan todos los problemas que tienen esos servicios. Un fallo de red, un límite de tasa o una respuesta lenta de un socio significa que tu prueba falla sin culpa tuya. La prueba no estaba realmente probando tu software, estaba probando internet un martes por la mañana. La documentación oficial de Microsoft Learn sobre Azure Pipelines señala lo mismo: las pruebas pueden ser inestables por razones que van desde simples problemas de temporización hasta dependencias complejas en entornos externos.
Si tu equipo depende mucho de la automatización, elegir qué automatizar y cuán estable mantenerlo es una decisión estratégica, no técnica. Cubrimos los principios en nuestra práctica de pruebas automatizadas.
Cómo Solucionar las Pruebas Inestables (Sin Empeorar la Situación)
Cuando finalmente abordas una prueba inestable real, el orden de las operaciones importa más que la profundidad técnica. Aquí está cómo solucionar las pruebas inestables sin empeorar accidentalmente el problema, en cinco pasos que recomendaríamos que tu equipo siga.
- Confirma que realmente es inestable. Ejecuta la prueba de 20 a 30 veces en las mismas condiciones. Si falla una vez en 30 ejecuciones, es inestable, pero si falla de forma consistente, está rota, lo cual es un problema diferente y más rápido de resolver.
- No la soluciones añadiendo más tiempo. La solución amateur más común es aumentar un timeout o añadir una espera fija. Esto generalmente enmascara el problema en lugar de resolverlo, y la prueba seguirá fallando eventualmente, solo con menos frecuencia, lo cual es el peor resultado posible porque empuja la próxima investigación más hacia el futuro.
- Encuentra la causa raíz real. Mapea el fallo a una de las cinco categorías anteriores. ¿Es un problema de temporización, una diferencia de entorno o contaminación de pruebas? Cada causa tiene una solución diferente, y aplicar la solución incorrecta desperdicia la tarde de todos.
- Soluciona la causa, no el síntoma. Una prueba inestable de temporización no necesita un timeout más largo, necesita esperar una condición específica. Una prueba contaminada no necesita mejor lógica de limpieza en esa prueba, necesita que la prueba anterior limpie tras de sí.
- Verifica la corrección. Ejecuta la prueba de 50 a 100 veces después de la corrección. Si nunca falla, la corrección es real; si todavía falla ocasionalmente, encontraste un síntoma y no una causa, así que vuelve al paso 3.
Toda la secuencia suena simple, y lo es. La razón por la que la mayoría de los equipos la omite es que las investigaciones de inestabilidad son tediosas, mientras que la presión inmediata de fusionar el PR está ahí mismo delante de todos.
Cómo Evitar las Pruebas Inestables desde el Principio
La prevención es un trabajo sin glamour. También es la razón por la que algunos equipos tienen suites estables y otros pasan los lunes por la mañana haciendo triage. Aquí está cómo evitar las pruebas inestables antes de que entren en tu base de código, enmarcado como políticas que un manager puede exigir a un equipo en lugar de consejos que un desarrollador puede ignorar.
- Trata la inestabilidad como un bug desde el primer día. El día en que una prueba se vuelve inestable es el día en que alguien la investiga, no el próximo sprint, y no “cuando tengamos tiempo.” Una vez que dejas pasar una, has señalado al equipo que la inestabilidad es aceptable.
- Haz que cada prueba sea autocontenida. Cada prueba debe configurar sus propios datos, ejecutar su comprobación y limpiar tras de sí, sin cuentas compartidas, sin registros compartidos y sin dependencias silenciosas sobre lo que se ejecutó antes. Este único principio elimina dos de las cinco causas de raíz.
- Haz que tu entorno de pruebas coincida con tu entorno de CI. Si tu equipo escribe pruebas en portátiles de gama alta y las ejecuta en runners de CI con restricciones, la inestabilidad ambiental está garantizada, y ninguna cantidad de código ingenioso lo resolverá. Incorporar esta disciplina pronto importa aún más si sigues las pruebas shift-left, donde detectar problemas en la fase correcta ahorra más tiempo.
- Usa esperas inteligentes, no esperas fijas. Las pruebas deben esperar a que suceda la condición correcta, no a una cantidad fija de tiempo; una espera de 5 segundos no es una solución. Es un fallo retrasado con una cara amigable. Este es el principio de prevención de mayor impacto, y el que la mayoría de los equipos aplica mal.
- No dejes que las pruebas toquen internet real. Las pruebas que llaman a APIs en vivo o servicios de terceros serán inestables tarde o temprano, porque los servicios caen, tienen límites de tasa o cambian su comportamiento según su propio calendario. Reemplaza esas llamadas con sustitutos controlados para que la prueba solo dependa de cosas que tu equipo pueda controlar.
- Haz de la estabilidad un criterio de revisión de código. Una prueba nueva que ya es inestable no debería poder fusionarse, porque la estabilidad no es algo secundario. Es parte de la definición de “hecho”.
¿Deberías Poner en Cuarentena, Solucionar o Eliminar?
Sacar una prueba inestable de la suite principal para que deje de bloquear lanzamientos es lo que la mayoría de los equipos llama cuarentena. Es útil como medida temporal, y no es una solución. Las pruebas en cuarentena sin propietario ni fecha límite se convierten en un cementerio que nadie lee y nadie arregla.
Antes de decidir, hazte tres preguntas honestas:
- ¿Cubre esta prueba un riesgo empresarial real? Si no, baja la prioridad y deja de pretender que es urgente.
- ¿Está el mismo escenario cubierto por otra prueba más fiable? Si es así, puede que no necesites esta en absoluto.
- ¿Costará más arreglarla que reescribirla en otra capa? A veces la respuesta correcta es eliminarla y empezar de cero.
Independientemente del proceso que elijas, el peor resultado es el terreno intermedio silencioso, donde una prueba fue puesta en cuarentena hace seis meses y todos la ignoran mientras nadie es responsable de ella. Eso no es una solución. Es una decisión aplazada disfrazada de solución, y tu suite de pruebas carga con el peso de cada una de ellas.
¿Las Pruebas se Comportan Mal?
Una suite de pruebas solo es tan útil como la confianza que tu equipo deposita en ella, y la inestabilidad de las pruebas es cómo esa confianza desaparece silenciosamente. Detectar las pruebas inestables a tiempo, y mantenerlas fuera de tu suite desde el principio, es lo que separa una función de QA útil de una ruidosa.
Hemos pasado más de dos décadas construyendo y rescatando suites de pruebas para SaaS, fintech, comercio electrónico, IA y juegos en más de 300 proyectos. Hemos tomado suites desordenadas e inestables y las hemos convertido de nuevo en algo en lo que los equipos realmente confían. Si tu equipo pasa más tiempo haciendo triage de pruebas que escribiéndolas, contáctanos o descubre cómo un equipo de QA dedicado puede quitártelo de encima.