En el desarrollo de software, el testing es una de las tareas más importantes, pero también es compleja y no siempre adoptada correctamente.
Las Prueba unitaria, de carga, integración y funcionales son distintos tipos de testing, cada uno con objetivos diferentes y aplicados en diferentes etapas del desarrollo del software.
Buscando ampliar el ámbito de las pruebas de unidad, se han aplicado diversas técnicas que van desde la automatización de pasos o caminos de ejecución, con valores fijos o componentes predefinidos (hard-coded) o estáticos, y condiciones específicas, hasta los enfoques basados en la generación de objetos de manera aleatoria,[1] aplicados a la Programación Orientada a Objetos.
El fundamento básico de este enfoque propuesto es el testing aleatorio.
Por ej., en el paradigma funcional existe una herramienta para probar especificaciones sobre funciones llamada QuickCheck.