Estoy a favor de las pruebas aleatorias y las escribo. Sin embargo, si son apropiadas en un entorno de compilación particular y en qué conjuntos de pruebas deberían incluirse es una pregunta más detallada.
Ejecutar localmente (por ejemplo, durante la noche en su caja de desarrollo) las pruebas aleatorias han encontrado errores obvios y oscuros. Los oscuros son lo suficientemente arcanos que creo que las pruebas aleatorias fueron realmente las únicas realistas para eliminarlas. Como prueba, tomé un error difícil de encontrar descubierto a través de pruebas aleatorias e hice que media docena de desarrolladores de crack revisaran la función (aproximadamente una docena de líneas de código) donde ocurrió. Ninguno pudo detectarlo.
Muchos de sus argumentos en contra de datos aleatorios son sabores de "la prueba no es reproducible". Sin embargo, una prueba aleatoria bien escrita capturará la semilla utilizada para iniciar la semilla aleatoria y la generará en caso de falla. Además de permitirle repetir la prueba a mano, esto le permite crear trivialmente una nueva prueba que prueba el problema específico al codificar la semilla para esa prueba. Por supuesto, probablemente sea mejor codificar a mano una prueba explícita que cubra ese caso, pero la pereza tiene sus virtudes, y esto incluso le permite generar automáticamente nuevos casos de prueba a partir de una semilla que falla.
Sin embargo, el único punto que haces que no puedo debatir es que rompe los sistemas de compilación. La mayoría de las pruebas de integración continua y de compilación esperan que las pruebas hagan lo mismo siempre. Por lo tanto, una prueba que falla aleatoriamente creará caos, fallando aleatoriamente y señalando con el dedo los cambios que son inofensivos.
Entonces, una solución es ejecutar sus pruebas aleatorias como parte de las pruebas de compilación y CI, pero ejecutarlo con una semilla fija, para un número fijo de iteraciones . Por lo tanto, la prueba siempre hace lo mismo, pero aún explora un montón del espacio de entrada (si lo ejecuta para varias iteraciones).
Localmente, por ejemplo, al cambiar la clase en cuestión, puede ejecutarla para más iteraciones o con otras semillas. Si las pruebas aleatorias alguna vez se vuelven más populares, incluso podría imaginar un conjunto específico de pruebas que se sabe que son aleatorias, que podrían ejecutarse con diferentes semillas (por lo tanto, con una mayor cobertura a lo largo del tiempo), y donde las fallas no significarían lo mismo como sistemas de CI deterministas (es decir, las ejecuciones no están asociadas 1: 1 con cambios de código y, por lo tanto, no señala con el dedo un cambio particular cuando las cosas fallan).
Hay mucho que decir sobre las pruebas aleatorias, especialmente las bien escritas, ¡así que no se apresure a descartarlas!