Un debate reciente dentro de mi equipo me hizo preguntarme. El tema básico es cuánto y qué cubriremos con las pruebas funcionales / de integración (claro, no son lo mismo, pero el ejemplo es falso donde no importa).
Digamos que tiene una clase de "controlador" algo como:
public class SomeController {
@Autowired Validator val;
@Autowired DataAccess da;
@Autowired SomeTransformer tr;
@Autowired Calculator calc;
public boolean doCheck(Input input) {
if (val.validate(input)) {
return false;
}
List<Stuff> stuffs = da.loadStuffs(input);
if (stuffs.isEmpty()) {
return false;
}
BusinessStuff businessStuff = tr.transform(stuffs);
if (null == businessStuff) {
return false;
}
return calc.check(businessStuff);
}
}
Necesitamos muchas pruebas unitarias para estar seguros (por ejemplo, si la validación falla o no hay datos en la base de datos, ...), eso está fuera de discusión.
Nuestro problema principal y en lo que no podemos estar de acuerdo es en la cantidad de pruebas de integración que lo cubrirán :-)
Estoy del lado de que apuntaremos a menos pruebas de integración (pirámide de prueba). Lo que cubriría de esto es solo un camino feliz e infeliz donde la ejecución regresa de la última línea, solo para ver si reúno estas cosas, no explotará.
El problema es que no es tan fácil decir por qué la prueba resultó falsa, y eso hace que algunos de los muchachos se sientan incómodos al respecto (por ejemplo, si simplemente verificamos solo el valor de retorno, se oculta que la prueba es verde porque alguien cambió la validación y devuelve falso). Claro, sí, podemos cubrir todos los casos, pero eso sería una gran exageración en mi humilde opinión.
¿Alguien tiene una buena regla general para este tipo de problemas? O una recomendación? ¿Leyendo? ¿Hablar? ¿Entrada en el blog? ¿Algo sobre el tema?
¡Muchas gracias por adelantado!
PD: Sry por el feo ejemplo, pero es bastante difícil traducir una parte de código específica a un ejemplo. Sí, uno puede discutir sobre lanzar excepciones / usar un tipo de retorno diferente / etc. pero nuestra mano está más o menos atada debido a dependencias externas.
PS2: moví este tema de SO aquí (pregunta original, marcada en espera )
Contrariamente a esta respuesta , considero que las pruebas en diferentes niveles son parte importante del proceso de prueba de software. Las pruebas unitarias, funcionales, de integración, de humo, de aceptación y de otro tipo están probando cosas diferentes, y cuanto más, mejor.
Y si logra automatizarlos, entonces pueden ejecutarse como un trabajo de su integración continua (como jenkins). Nadie necesita ejecutarlos para ver si se rompieron, ya que todos pueden ver si las pruebas fallaron.
En mis pruebas de integración, no entro en detalles: los detalles y los casos de esquina son para pruebas unitarias. Lo que pruebo es solo la funcionalidad principal, pasando todos los parámetros correctos. Eso significa que, en su ejemplo, en las pruebas de integración, no cubriría rutas falsas.
fuente