Un cien por cien que engaña
La cobertura de código es el porcentaje de líneas o de caminos del programa que ejecutan tus pruebas. Te dice qué partes nunca ha mirado ninguna prueba.
Un equipo presume de un 100 % de cobertura. Aun así, entrega un descuento mal calculado. La cobertura mide lo que se ejecutó, no lo que se comprobó.
Al final de esta lección
Nota
Puedo leer una cobertura y decir qué deja sin comprobar.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Cobertura | la parte del código que las pruebas ejecutan | |
| Cobertura de líneas | el porcentaje de líneas que se ejecutaron | |
| Rama | uno de los dos caminos de un if | si y no |
| Cobertura de ramas | el porcentaje de caminos que se recorrieron | |
| Traza | la lista de líneas que se ejecutaron |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La cobertura de líneas cuenta líneas ejecutadas
Una herramienta apunta qué líneas se ejecutan mientras corren las pruebas. Esa lista es la traza.
La cobertura de líneas es las líneas ejecutadas entre las líneas totales, por cien. Si de 4 líneas se ejecutan 3, la cobertura es del 75 %.
Ejemplo: una función con una línea sin cubrir
| Línea | Código | Ejecutada con 50 euros |
|---|---|---|
| 1 | def descuento(total): | Sí |
| 2 | if total >= 100: | Sí |
| 3 | return total - 10 | No |
| 4 | return total | Sí |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Contar la cobertura de líneas
# Un descuento con dos caminos.
lineas = [1, 2, 3, 4] # las cuatro líneas del cuerpo de la función
ejecutadas = [1, 2, 4] # lo que una prueba con 50 euros recorrió
cubiertas = 0
for linea in lineas:
if linea in ejecutadas:
cubiertas = cubiertas + 1
print(cubiertas, "de", len(lineas))
print(cubiertas * 100 // len(lineas), "por ciento")
# Añade el 3 a ejecutadas y vuelve a ejecutar.
Entra en la carpeta de trabajo
mkdir -p ~/pruebas && cd ~/pruebasSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe un programa con dos caminos
printf 'def descuento(total):\n if total >= 100:\n return total - 10\n return total\n\nprint(descuento(50))\n' > desc.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecútalo midiendo la cobertura
python3 -m trace --count --missing -C cob desc.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Mira qué línea no se ejecutó
grep ">>>>>>" cob/desc.coverSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Las marcas señalan lo que ninguna prueba tocó
La primera orden imprime 50, que es lo que calcula el programa, y escribe un informe en la carpeta cob. La segunda busca en el informe las líneas marcadas con >>>>>>, que son las que nunca se ejecutaron.
Sale la línea return total - 10. Nadie ha probado un pedido de 100 euros o más.
Un error frecuente
Advertencia
Mucha gente cree que un 100 % de cobertura significa que el programa está bien probado. Solo significa que cada línea se ejecutó alguna vez. Una prueba sin aserción ejecuta código y no comprueba nada. Mira también que las pruebas comparen resultados.
La cobertura de ramas mira los dos caminos
Un if sin else tiene dos ramas: cuando la condición es verdadera y cuando es falsa. Una prueba puede ejecutar la línea del if y recorrer solo una rama.
La cobertura de ramas cuenta los caminos recorridos entre los posibles. Es más exigente que la de líneas.
Ejemplo: líneas y ramas con una sola prueba
| Prueba | Líneas cubiertas | Ramas cubiertas |
|---|---|---|
| Solo 50 euros | 3 de 4, un 75 % | 1 de 2, un 50 % |
| Solo 150 euros | 3 de 4, un 75 % | 1 de 2, un 50 % |
| 50 y 150 euros | 4 de 4, un 100 % | 2 de 2, un 100 % |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.