Pruebas de caja blanca: ¿Que son y cómo implementar una en Python?

     No hace falta ser un profesional del ámbito del testing para poder comprender los conceptos sobre las pruebas de cajas blancas y las pruebas de cajas negras, sus definiciones son tan sencillas como aplicar éstas técnicas. En Python, ya existen librerías que nos pueden ayudar a complementar el estudio de bloques de código y algoritmos aplicando éstas técnicas, pero, ¿qué es una prueba de caja blanca?

        Las pruebas de caja blanca (también conocidas como pruebas de caja de cristal o pruebas estructurales) se centran en los detalles procedimentales del software, por lo que su diseño está fuertemente ligado al código fuente, lo cual, esto significa que tenemos que realizar un “estudio”, o más bien, un análisis de nuestro código, para esto, existen tres pautas fundamentales para poder realizar con éxito una prueba de caja blanca.

Pruebas de cubrimiento: Se trata básicamente de ejecutar al menos una vez cada sentencia. Pero para cumplir con las pruebas de cubrimiento se necesitan varios casos de prueba:

  • Determinar posibles «caminos» independientes.
  • Cada condición debe cumplirse en un caso y en otro no.
  • Y puede ser imposible cubrir el 100%
  • Código que nunca se ejecuta: condiciones imposibles

Pruebas de condiciones: Cumplir o no cada parte de cada condición. Se necesitan varios casos de prueba:

  • Determinar expresiones simples en las condiciones
  • Una por cada operando lógico o comparación
  • Cada expresión simple debe cumplirse en un caso y en otro no, siendo decisiva en el resultado.

Pruebas de bucles: Se trata de verificar que los ciclos o bucles, tanto como «while» (repetir mientras) como el bucle «for» (repetir para), no sean infinitos o que funcionen correctamente:

  • Conseguir números de repeticiones especiales
  • Bucles simples:
    ○ Repetir cero, una y dos veces
    ○ Repetir un número medio (típico) de veces
    ○ Repetir el máximo-1, máximo y ¡máximo +1!
  • Bucles anidados
    ○ Repetir un número medio (típico) los bucles internos, el mínimo los externos, y variar las repeticiones del bucle intermedio ensayado.
    ○ Ensayarlo con cada nivel de anidamiento

Ahora bien, una vez comprendidos éstos conceptos, vamos a ver un ejemplo básico de éste tipo de prueba:

Prueba de cubrimiento y condiciones:

Si se cumple que A>1 y B>2 y C>3:
• Se puede ejecutar S = (A+B) * (B+C) * (A+C)
• Pero nunca va se va a cumplir S = S+1, ya que nunca S será menor a 0, ya que la primera condición pide que sean números mayores a 0.
• Las pruebas de cubrimiento funcionarían únicamente en:

✔ S= (A+B) * (B+C) * (A+C)
✔ S= S/(ABC)
✘ S= S+1 (que es lo mismo que S += 1)

Si no se cumple que A>1 y B>2 y C>3:
• Nunca se ejecutaría las operaciones dentro de la condición (directamente no haría nada).
✘ S=(A+B) * (B+C) * (A+C)
✘ S=S/ABC
✘ S=S+1

Prueba de bucle:
Si N > 0:
• Puede ejecutar las instrucciones que le siguen
Si N <= 0:
• Nunca se ejecutarían las instrucciones que le siguen

A su vez, podemos trabajar con Python para obtener un porcentaje de pruebas de cubrimiento, simplemente instalando una librería llamada “Coverage”, la cual nos facilita ese porcentaje según el bloque de código que vayamos a implementar con él.
Para esto, abrimos nuestra terminal / consola y ejecutamos la siguiente instrucción:

pip install coverage

Para verificar que esté realmente instalado, vamos a ejecutar dentro de nuestra terminal o símbolo de sistema el siguiente comando:

coverage –version

¡Y listo!, ya tenemos instalada la librería Coverage, ahora para darle uso a la misma, nos dirigimos a la ruta donde se encuentra nuestro archivo o script para analizarlo desde nuestra terminal / símbolo de sistema.
Una vez ubicado nuestro script o archivo.py, dentro de nuestra terminal ejecutamos el comando: coverage run nombre_de_script.py y procedemos a realizar nuestras pruebas de cubrimiento:

Si realizamos la primer prueba (A > 1 y B > 2 y C > 3), podemos ejecutar ahora un nuevo comando: coverage report

¿Qué significa ese reporte?, fácil, “stmts” significa las líneas de código donde se ejecutaron las instrucciones, y “miss”, donde no se ejecutaron, por lo tanto, la prueba de cubrimiento fue de un 90%, ¿por qué?, porque de antemano, sabíamos que una línea de código no se iba a ejecutar:

✔ S= (A+B) * (B+C) * (A+C)
✔ S= S/(ABC)
✘ S= S+1 (que es lo mismo que S += 1)

¿Y qué hubiera pasado si N era igual a 0?:

Nos dio una prueba de cubrimiento del 20%, ya que nunca se ejecutaría lo que está dentro del ciclo, solo se ejecutó una línea de código.
Además, Coverage nos puede crear un reporte en un archivo HTML con fecha y hora de cuando realizamos nuestro test, simplemente ejecutamos: coverage html, dentro del mismo directorio nos crea una carpeta llamada “htmlcov” donde, si hacemos doble click en index.html, nos abre en nuestro navegador el reporte:

Éstas pruebas nos pueden servir y de mucho para poder ver que partes del código no se están ejecutando, la documentación oficial de Coverage la puedes encontrar en: https://coverage.readthedocs.io/en/coverage-5.1/ (sitio en inglés).

Facundo Kimbo

1 comentario de “Pruebas de caja blanca: ¿Que son y cómo implementar una en Python?”

Deja un comentario