code-coverage - unit - testing con jest
Una diferencia entre la declaraciĆ³n y la cobertura de la decisiĆ³n (4)
Buena pregunta. La explicación que uso a menudo es que una instrucción if sin una rama else todavía tiene una instrucción else "vacía" invisible:
La cobertura de declaraciones simples solo insiste en que todas las declaraciones que en realidad están allí realmente se ejecutan.
La cobertura de la rama insiste en que incluso las demás ramas invisibles son ejecutadas.
Se producen situaciones similares con sentencias de conmutación sin un caso predeterminado, y repetición hasta bucles. La cobertura de sucursal requiere que se ejecute un caso predeterminado, y que se repita hasta que se ejecute al menos dos veces.
Un ejemplo de código:
if (passwordEnteredOK()) {
enterSystem();
}
/* Invisible else part
else {
// do nothing
}
*/
Con la cobertura de estados de cuenta, simplemente verifica que con una contraseña correcta pueda usar el sistema. Con la cobertura de la sucursal también prueba que con una contraseña incorrecta no ingresará al sistema.
Se dice que la cobertura de la declaración se asegura de que cada declaración en el código se ejecute al menos una vez.
Se dice que la cobertura de la decisión / rama prueba que cada rama / salida de una decisión se prueba, es decir, se ejecutarán todas las declaraciones en ambas ramas falsa / verdadera.
¿Pero no es lo mismo? En la cobertura de estados de cuenta, necesito ejecutar todos los estados, así que supongo que solo se puede hacer ejecutando todas las formas posibles. Sé que me estoy perdiendo algo aquí ..
La respuesta de Paul no es correcta, al menos eso creo (según las definiciones de ISTQB). Hay una diferencia bastante significativa entre la cobertura de la declaración, la decisión / rama y la condición. Usaré la muestra de la otra respuesta, pero la modificaré un poco, para poder mostrar los tres ejemplos de cobertura de prueba. Las pruebas escritas aquí dan una cobertura de prueba del 100% para cada tipo.
if(a || b)) {
test1 = true;
}
else {
if(c) {
test2 = true
}
}
Tenemos dos declaraciones aquí: if (a || b) y if (c), para explicar completamente esas diferencias de cobertura:
- la cobertura de la declaración debe probar cada declaración al menos una vez, por lo que solo necesitamos dos pruebas:
- a = verdadero b = falso - eso nos da la ruta si (a || b) verdadero -> prueba1 = verdadero
- a = falso, b = falso y c = verdadero - eso nos da la ruta: if (a || b) falso -> else -> if (c) -> test2 = true.
De esta manera ejecutamos todas y cada una de las afirmaciones.
La cobertura de la sucursal / decisión necesita una prueba más:
- a = falso, b = falso, c = falso - eso nos lleva a ese segundo si, pero estamos ejecutando una rama falsa desde esa declaración, eso no se ejecutó en la cobertura de la declaración
De esa manera, hemos probado todas las ramas, lo que significa que recorrimos todos los caminos.
condición de cobertura necesita otra prueba:
- a = falso, b = verdadero - que conduce a través de la misma ruta que la primera prueba, pero ejecuta la otra decisión en la sentencia OR (a || b) para pasar por ella.
De esa manera, hemos probado todas las condiciones, lo que significa que pasamos por todas las rutas (ramas) y las activamos con cada condición que pudimos. La primera instrucción ''if'' fue verdadera en la primera prueba debido a que = true la activó y en la última prueba porque b = verdadero lo activó. Por supuesto, alguien puede argumentar que el caso con a = true y b = true también debe probarse, pero cuando verifiquemos cómo ''o'' funciona, podemos ver que no es necesario y que la variable c puede tener cualquier valor como En esas pruebas no se evalúa.
Al menos lo interpreté de esta manera. Si alguien sigue interesado :)
EDITAR: En la mayoría de las fuentes que encontré últimamente, los términos de cobertura de decisión / sucursal son equivalentes y el término que describí como cobertura de decisión es en realidad condición de cobertura, por lo tanto, esa actualización de la respuesta.
Puede tener una declaración como:
if(a || b || (c && d && !e)) {
test1 = true;
} else {
test2 = false;
}
Si la cobertura de su código indica que tanto las líneas de prueba1 como las de prueba2 se encuentran afectadas, entonces usted tiene cobertura de estado de cuenta, pero para obtener la cobertura de sucursal completa, deberá realizar la prueba cuando a es verdadero, cuando a es falso pero b es verdadero, cuando ayb son falsos pero c y d son verdaderas y e es falsa, etc.
La cobertura de sucursales cubre todas las combinaciones posibles de opciones de sucursales y, por lo tanto, es más difícil lograr una cobertura del 100%.
Si las pruebas tienen cobertura de sucursal completa, entonces podemos decir que también tiene cobertura de estado de cuenta completa , pero no a la inversa.
100% de cobertura de sucursal => 100% de cobertura de estado de cuenta
La cobertura del estado de cuenta del 100% no implica una cobertura de sucursal del 100%.
La razón está en la cobertura de la rama, además de ejecutar todas las declaraciones, también deberíamos verificar si las pruebas ejecutan todas las ramas, lo que puede interpretarse como que cubre todos los bordes en la rama de flujo de control.
if(a){
if(b){
bool statement1 = true;
}
}
a = verdadero, b = verdadero dará una cobertura del 100%, pero no la cobertura de sucursal
En la cobertura de la rama necesitamos cubrir todos los bordes , que faltamos en la cobertura del estado de cuenta que se muestra como líneas rojas en la imagen de arriba.