8. Prueba y depuración de software

8.1. Las pruebas primero

Antes de empezar en tema vamos a explicar someramente la mecánica que deberías aplicar desde el primer día en tus ejercicios y programas. Aún cuando no hayas leído nada más de este tema debes aplicar el método desde el primer día.

Lo primero es tener claro qué vas a hacer. Inmediatamente después, el siguiente caso es hace una prueba, un pequeño ejemplo que permita saber si el programa que vas a hacer funciona o no. Es decir, se usa el programa antes incluso de hacerlo, Las pruebas primero.

8.2. Casos de prueba

Las pruebas que se pasan automáticamente en los ejercicios del laboratorio pueden servir de ejemplo para ayudarte a probar tus propios programas. Vemos como ejemplo el primer ejercicio del primer bloque.

Definir la función que se indica en el enunciado no es tu único trabajo. Es responsabilidad tuya probar el código antes de enviarlo. Python incluye una biblioteca para pruebas denominada unittest. El único problema es que exige definir una clase y es posible que todavía no sepas hacerlo. No te asustes, los enunciados de las prácticas tienen multitud de ejemplos que puedes usar directamente como punto de partida. Copia esta línea a continuación de tu programa.

Como primera aproximación basta añadir el código de pruebas de cualquiera de las tareas de prácticas. En el primer ejercicio se muestra lo siguiente.

Es más simple de lo que parece, pero no te preocupes si no lo entiendes de momento. Dentro de la clase Test hay una definición de una función test_my_email que debería resultarte familiar. Esa función es la prueba. Puede haber más de una de estas funciones que comienzan por test_ dentro de la clase. Cada una es una prueba, y todas ellas componen el caso de prueba (TestCase).

Dentro de la función vemos varias llamadas a funciones que comienzan por assert. Son aserciones, afirmaciones sobre lo que debe cumplirse para considerar correcto el programa. No te preocupes por el self. que aparece antes de las llamadas, ya lo entenderemos cuando veamos programación orientada a objetos.

Hay dos llamadas diferentes, assertEqual que afirma que los dos argumentos deben ser iguales y assertTrue que afirma que el argumento debe ser cierto (debe ser una expresión booleana de valor True). Vamos a explicar cada una de ellas.

La primera utiliza el método count de las cadenas de texto para asegurar que hay uno y solo un carácter @. El método count devuelve cuántas veces aparece el argumento en la cadena. Por ejemplo:

Cuidado con count, asume que lo que busca es disjunto. Por ejemplo:

En realidad hay dos 'repare' en 'reparepare', uno a partir de la posición 0 y otro a partir de la posición 4. Pero el segundo solapa con el primero, por lo que no lo tiene en cuenta.

De todas formas en nuestro caso es ideal. Una dirección de correo válida tiene que tener un carácter @ y solo uno.

La llamada assertTrue utiliza el método endswith de las cadenas para asegurar que la dirección termina en uclm.es. Cualquier dirección válida de la UCLM debe terminar en uclm.es.

Es muy posible que a estas alturas ya hayas descubierto que hubiera sido mucho más simple poner un único assert que asegurara que termina en @alu.uclm.es.

Desde luego eso habría funcionado con todos los estudiantes, pero no habría funcionado conmigo. Yo no tengo una dirección @alu.uclm.es sino @uclm.es. Puedes pensar que eso deja abierta la puerta a un montón de posibles respuestas erróneas. Por ejemplo: pepe@jefes.uclm.es o peor, chori@kkuclm.es. Es cierto, es un compromiso que deberás afrontar continuamente. Decide cuánto quieres trabajar en las pruebas para tener ciertas garantías de que tu programa es correcto.

No es lo mismo hacer un programa para un avión que para el laboratorio, calibra tu esfuerzo, se trata de que tengas cierta confianza en que el programa es correcto. Siento comunicarte que en general, salvo en los casos más simples, va a ser imposible que puedas garantizar que el programa es correcto.

Ya solo queda ejecutarlo. Es posible usar herramientas auxiliares (test runners), como nosetests para ejecutar las pruebas. Sin instalar nada lo puedes hacer tú mismo en Python.

Hay mucho más sobre pruebas, pero eso te toca a ti descubrirlo. Si en algún momento te atascas lee la documentación de unittest.

Next Section - 9. Operaciones con listas