he trabajado en 3 grandes aplicaciones Grails, y innumera los más pequeños. Mi proyecto actual tiene una combinación de pruebas unitarias y de integración (actualmente 2110 pruebas unitarias y 493 pruebas de integración).
He pasado mucho tiempo tratando de mejorar la velocidad de las pruebas y haciendo que las pruebas sean más fáciles de mantener.
Mis pruebas de integración son a menudo un híbrido en el que si yo estoy probando un servicio, podría burlarse de algunos otros servicios/métodos que se están llamados a garantizar consigo los valores que desee, pero dejan en otras piezas de integración para ejercer HQL o integración de base de datos. Para este fin, utilizo prototype instances of what are normally singleton services para que pueda limpiar con la instancia de servicio sin contaminar las pruebas posteriores.
Creo que el plugin build-test-data es invaluable para crear pruebas de unidades que se puedan mantener, ya que me permite crear datos de prueba donde doblo explícitamente las piezas que necesito y dejo que el complemento complete los demás detalles requeridos. Crear datos de prueba en pruebas de integración es más fácil para mí que burlarlo en pruebas unitarias.
Si utiliza pruebas de integración y unidad, eventualmente la velocidad de ejecución de todas las pruebas en serie se convertirá en un impedimento. Mi equipo usa el script splitTests.groovy para derivar dos hilos separados, uno para pruebas unitarias, uno para pruebas de integración. Esto hace que nuestras pruebas sean un 40% más rápidas. Es posible una paralelización adicional, pero aún no hemos llegado allí (y los guiones de Gant actuales de grial son bastante desagradables bajo las sábanas, estoy esperando la reescritura de Gradle en Grails 2.0).
Las pruebas unitarias son agradables para golpear todos los recovecos condicionales de un método (aunque si tienes demasiados, tu complejidad ciclomática es probablemente demasiado alta y deberías refactorizar). Las pruebas de integración son útiles para ejercitar la integración de bases de datos y servicios, así como para ayudarlo a comprender lo que ha roto al cambiar una parte del código.
Creo que el valor de refactorización que obtiene de tener una alta cobertura de prueba depende en parte de que algunas de las pruebas sean pruebas de integración. Si todo lo que tiene son pruebas unitarias que no interactúan con otras piezas de código, no se le avisará de las áreas afectadas cuando se realiza un cambio de código, y dado que groovy es un lenguaje dinámico, es probable que el compilador no lo ayude a encontrar estas áreas tampoco.
Muy buena pregunta. También estoy interesado en respuestas. – fabien7474