La automatización de pruebas comenzó históricamente con la idea de aumentar la velocidad y reducir el factor humano en las verificaciones, sin embargo, pronto se descubrió que las pruebas automáticas a menudo se comportan de manera diferente en cada ejecución. La repetibilidad (repeatability) y la determinación (determinism) son uno de los requisitos básicos de calidad para las pruebas automáticas, las cuales deben ofrecer el mismo resultado bajo las mismas condiciones.
Los problemas comienzan debido a dependencias implícitas: datos de prueba inestables, entornos desincronizados, procesos paralelos o servicios externos. Esto conduce a pruebas inestables (flaky tests) — sus resultados son impredecibles.
Las soluciones se centran en un control estricto del entorno de ejecución, aislamiento de pruebas, objetos mock/stub, datos estáticos y escenarios reproducibles (por ejemplo, limpieza y preparación de la base de datos antes de cada prueba).
Características clave:
¿Qué hacer si las pruebas inestables ocurren solo en CI, mientras que localmente todo es estable?
Esto casi siempre está relacionado con diferencias en los entornos: versiones de dependencias, velocidad del trabajo de la infraestructura, paralelismo, configuraciones del sistema operativo o el orden de ejecución de las pruebas. La solución es acercar lo más posible el entorno de CI a la máquina de desarrollo (Docker, valores de semillas iguales, configuración de setUp/tearDown en las pruebas).
¿Se pueden considerar las pruebas parametrizadas completamente determinísticas si los datos provienen de una base de datos?
No. Incluso si los datos coinciden en su base, la base de datos puede cambiar entre pruebas o entre lanzamientos. Para una verdadera determinación, los datos deben ser preparados y limpiados explícitamente en cada prueba.
¿Utilizar sleep para esperar la carga de elementos resolverá el problema de inestabilidad de las pruebas de UI?
No. Sleep solo enmascara el problema y ralentiza la ejecución de las pruebas. Es correcto utilizar esperas explícitas (Explicit Waits), que esperan condiciones específicas y no un tiempo fijo.
En el proyecto se ejecutaban pruebas de UI en un entorno que nadie limpiaba después de las pruebas manuales. De vez en cuando, las pruebas fallaban con errores "aleatorios" que no estaban presentes localmente. El equipo agregó sleep a las pruebas e ignoró los problemas flaky.
Ventajas:
Desventajas:
Después de la llegada de un ingeniero DevOps maduro, el equipo implementó scripts para restablecer e inicializar los datos de prueba, agregó servicios mock para integraciones inestables y comenzó a ejecutar pruebas en contenedores. Las pruebas inestables prácticamente desaparecieron.
Ventajas:
Desventajas: