Python Tema7 Parte4 Unittest v1
Python Tema7 Parte4 Unittest v1
1
IBM SkillsBuild | Introducción a Python
Índice
Introducción 3
Un proceso de automatización de verificación 4
Ejemplos de uso 7
Testing con excepciones 9
Verificación de tipos 11
Buenas prácticas en testing unitario 14
Códigos usados en los ejemplos 14
2
IBM SkillsBuild | Introducción a Python
Introducción
3
IBM SkillsBuild | Introducción a Python
automatización de 'hola']
verificación
Viendo el comportamiento de la función al pasarle los
parámetros sabremos si la función está trabajando
Con unittest vamos a hacer un proceso de
correctamente, aunque nosotros le estemos pasando
automatización de la verificación de nuestro código.
valores erróneos.
def area(r):
areaC = pi*(r**2)
return areaC Recorremos nuestra función pasándole los
parámetros de nuestra lista:
4
IBM SkillsBuild | Introducción a Python
Vemos que:
5
IBM SkillsBuild | Introducción a Python
Ya sabemos que nuestra función está bien realizada, Entonces, debemos nombrar nuestros archivos de
hace su trabajo, pero dependiendo de los valores que prueba con la palabra clave test en el arranque.
le pasemos, puede dar problemas. Hace cálculos que
Importamos unittest:
no se deberían llevar a cabo e incluso da error
cuando le pasamos una cadena de texto.
import unittest
Este es un test muy primitivo. Haciendo uso de
unittest podemos automatizar el proceso de prueba
de nuestro código.
Importamos la función sobre la cual se van a ejecutar
Para usar unittest tenemos que seguir un protocolo,
los test:
vamos a tener que crear otro archivo en el que se va
a encontrar el propio código de unittest.
from testing01 import area
Deberemos crear un archivo con el siguiente nombre:
test_nombreArchivo.py
Y en nuestro caso tendremos que importar también
El nombre deberá empezar por la palabra test_
PI:
seguido del nombre del archivo sobre el que vamos a
realizar las pruebas. De tal forma que, si nuestro
archivo se llama, por ejemplo, funcionRadio.py, el from math import pi
archivo de testing se debería llamar
test_funcionRadio.py.
En nuestro caso el archivo a probar se va a llamar Lo siguiente será crear una clase que herede de la
testing01.py y el archivo de pruebas clase TestCase:
test_testing01.py
Nota: Podemos ejecutar automáticamente las Ahora, dependiendo del tipo de test que queramos
pruebas usando el comando: hacer, deberemos invocar un método de la clase
TestCase. Los más usados son:
python -m unittest discover
assertTrue() o assertFalse() para verificar una
Con esta sintaxis no necesitamos mencionar el condición.
nombre de archivo de la prueba. Unittest encontrará
las pruebas utilizando la convención de
nomenclatura que seguimos.
6
IBM SkillsBuild | Introducción a Python
7
IBM SkillsBuild | Introducción a Python
Y el resultado:
8
IBM SkillsBuild | Introducción a Python
9
IBM SkillsBuild | Introducción a Python
Ejecutamos el test:
10
IBM SkillsBuild | Introducción a Python
Verificación de tipos
def test_tipos(self):
print('-----Test de tipos no
compatibles-----')
self.assertRaises(TypeError,
area, True)
self.assertRaises(TypeError,
area, 'hola')
self.assertRaises(TypeError,
area, 2+3j)
11
IBM SkillsBuild | Introducción a Python
El resultado:
12
IBM SkillsBuild | Introducción a Python
def area(r):
areaC = pi*(r**2)
return areaC
13
IBM SkillsBuild | Introducción a Python
Ahora sí tenemos el test sin fallos. Lo que significa • Las pruebas deben producir mensajes
que ya tenemos tratados los casos en los que los significativos cuando fallan. Intenta hacer que la
valores de entrada no sean números enteros prueba falle y ver si el motivo del fallo se puede
positivos o números de coma flotante positivos. determinar leyendo el resultado del caso de
prueba.
Como podemos ver los unittest son una herramienta
• Las pruebas deben ser pequeñas y probar solo #Verificamos los tipos correctos
if type(r) not in [float, int]:
una cosa.
raise TypeError("Solo números
• Las pruebas deben ejecutarse rápido. Esto es
enteros o de coma flotante.")
esencial para la inclusión en un entorno de CI.
• Las pruebas unitarias deben ser completamente if r<0:
independientes. Las pruebas no deben depender raise ValueError("No se permiten
unas de otras y pueden ejecutarse en cualquier valores negativos")
orden cualquier número de veces.
• Las pruebas deben estar completamente areaC = pi*(r**2)
automatizadas y no requerir interacción manual o return areaC
verificaciones para determinar si pasan o fallan.
• Las pruebas no deben incluir afirmaciones
innecesarias como "puntos de control" en la
prueba. Afirma solo lo que la prueba está
probando.
• Las pruebas deben ser portátiles y ejecutarse
fácilmente en diferentes entornos.
• Las pruebas deben configurar lo que necesitan
para ejecutarse. Las pruebas no deben hacer
suposiciones sobre recursos particulares
existentes.
• Las pruebas deben limpiar los recursos creados
después.
• Los nombres de las pruebas deben describir
claramente lo que están probando.
14
IBM SkillsBuild | Introducción a Python
Archivo test_testing01.py:
import unittest
from testing01 import area
from math import pi
class TestArea(unittest.TestCase):
def test_area(self):
print('-----Test valores de
resultado conocido-----')
self.assertAlmostEqual(area(1),
pi)
self.assertAlmostEqual(area(0), -
1)
self.assertAlmostEqual(area(3),
pi*(3**2))
def test_tipos(self):
print('-----Test de tipos no
compatibles-----')
self.assertRaises(TypeError,
area, True)
self.assertRaises(TypeError,
area, 'hola')
self.assertRaises(TypeError,
area, 2+3j)
15