unit - ¿Qué es una rama en la cobertura de código para pruebas de unidades javascript?
pruebas unitarias node js (3)
De Wikipedia :
¿Se ha ejecutado cada rama (también llamada ruta DD) de cada estructura de control (como en las sentencias if y case)? Por ejemplo, dada una sentencia if, ¿se han ejecutado las ramas verdadera y falsa? Otra forma de decir esto es, ¿se han ejecutado todas las ventajas del programa?
Tiene que probar para cada estructura de control todos los casos posibles (ingrese / no ingrese en sentencias if, fe y todos los casos de un interruptor). La cobertura de sucursales es una métrica que mide (generalmente en porcentaje) la cantidad total de sucursales que cubren sus pruebas.
Utilizo istanbul para la cobertura de código de pruebas unitarias en un proyecto angularjs. Hay 4 tipos de cobertura y son cobertura de declaración, sucursal, función y línea. Declaración, función y línea están bien, pero no entiendo qué es la "rama". ¿Alguien podría explicar qué rama es? Gracias
En algún lugar donde el código puede tomar más de una ruta, es decir, se ramifica. Un par de ejemplos de declaraciones de bifurcación son if
/ else
y declaraciones de switch
.
Rutas de cobertura de sucursal, cuáles de esas sucursales se han ejecutado para que pueda asegurarse de que todas las rutas se prueban correctamente.
Una rama es donde el tiempo de ejecución puede elegir si puede tomar una ruta u otra. Tomemos el siguiente ejemplo:
if(a) {
Foo();
}
if(b) {
Bar();
}
Yay();
Al llegar a la primera línea, puede decidir si quiere ir dentro del cuerpo de la declaración if(a)
. Además, puede decidir no hacer eso. En esta etapa, ya hemos visto dos caminos (una rama).
La siguiente afirmación después de eso se vuelve más interesante. Puede ir dentro del cuerpo if
y ejecutar la Bar
. Tampoco puede hacer eso. Pero recuerda que ya hemos tenido una rama antes. El resultado puede variar si Foo
fue llamado o no.
Así terminamos con cuatro caminos posibles:
- No llamar a
Foo
, tampoco llamar aBar
- Llamando a
Foo
, no llamando aBar
- No llamo a
Foo
, llamo aBar
- Llamando tanto a
Foo
como aBar
El último Yay
siempre se ejecuta, no importa si se llamó a Foo
o Bar
, por lo que no cuenta como una rama. Por lo tanto, el fragmento de código anterior contiene cuatro rutas / dos ramas (llamar a Foo()
o no, llamar a Bar()
o no).
Al igual que otras respuestas que ya se han mencionado, hay numerosas declaraciones que pueden causar una rama ( if
/ switch
). No olvide tampoco los operadores de bucles condicionales, como por ejemplo while
/ for
/ do-while
, o short circuiting (ej. &&
/ ||
).
La herramienta de cobertura de código quiere asegurarse de que haya probado todas las sucursales. Lo mejor sería si todas las rutas se hayan probado, o incluso todos los valores (caso de borde), no solo las ramas. Esto, para asegurarse de que no se ejecuta ningún comportamiento no deseado.