Ambos.
Las pruebas deterministas y no deterministas tienen diferentes casos de uso y diferentes valores para su suite. En general, las no deterministas no pueden proporcionar la misma precisión que las pruebas deterministas, que lentamente se han convertido en "las pruebas no deterministas no aportan ningún valor". Esto es falso Pueden ser menos precisos, pero también pueden ser mucho más amplios, lo que tiene sus propios beneficios.
Tomemos un ejemplo: escribe una función que ordena una lista de enteros. ¿Cuáles serían algunas de las pruebas unitarias deterministas que encontrarías útiles?
- Una lista vacia
- Una lista con solo un elemento
- Una lista con todos los mismos elementos.
- Una lista con múltiples elementos únicos.
- Una lista con múltiples elementos, algunos de los cuales son duplicados.
- Una lista con
NaN
, INT_MIN
yINT_MAX
- Una lista que ya está parcialmente ordenada
- Una lista con 10,000,000 elementos
¡Y eso es solo una función de clasificación! Claro, podría argumentar que algunos de estos son innecesarios, o que algunos de estos pueden descartarse con un razonamiento informal. Pero somos ingenieros y hemos visto explotar el razonamiento informal en nuestra cara. Sabemos que no somos lo suficientemente inteligentes como para comprender completamente los sistemas que hemos construido o mantener la complejidad en nuestras cabezas. Es por eso que escribimos pruebas en primer lugar. Agregar pruebas no deterministas solo dice que no necesariamente debemos ser lo suficientemente inteligentes como para conocer todas las buenas pruebas a priori. Al incluir datos semialeatorios en su función, es mucho más probable que encuentre un caso límite que se haya perdido.
Por supuesto, eso tampoco descarta las pruebas deterministas. Las pruebas no deterministas ayudan a encontrar errores en grandes extensiones del programa. Sin embargo, una vez que haya encontrado los errores, necesita una forma reproducible de mostrar que lo solucionó. Entonces:
- Use pruebas no deterministas para encontrar errores en su código.
- Use pruebas deterministas para verificar las correcciones en su código.
Tenga en cuenta que esto significa que muchos consejos sólidos sobre las pruebas unitarias no se aplican necesariamente a las pruebas no deterministas. Por ejemplo, que deben ser rápidos. Las pruebas de propiedad de bajo nivel deben ser rápidas, pero una prueba no determinista como "simular un usuario haciendo clic al azar en los botones de su sitio web y asegurarse de que nunca obtenga un error 500" debería favorecer la exhaustividad sobre la velocidad. Simplemente haga que una prueba como esa se ejecute independientemente de su proceso de compilación para que no ralentice el desarrollo. Por ejemplo, ejecútelo en su propio cuadro de ensayo privado.