unittest
, también llamado PyUnit, forma parte de una familia de herramientas conocida colectivamente como xUnit, un conjunto de frameworks basados en el software SUnit para Smalltalk, creado por Kent Beck, uno de los padres de la eXtreme Programming. Otros ejemplos de herramientas que forman parte de esta familia son JUnit para Java, creada por el propio Kent Beck junto a Erich Gamma, o NUnit, para .NET.El uso de
unittest
es muy sencillo. Para cada grupo de pruebas tenemos que crear una clase que herede de unittest.TestCase
, y añadir una serie de métodos que comiencen con test
, que serán cada una de las pruebas que queremos ejecutar dentro de esa batería de pruebas.Para ejecutar las pruebas, basta llamar a la función
main()
del módulo, con lo que se ejecutarán todos los métodos cuyo nombre comience con test
, en orden alfanumérico. Al ejecutar cada una de las pruebas el resultado puede ser:- OK: La prueba ha pasado con éxito.
- FAIL: La prueba no ha pasado con éxito. Se lanza una excepción
AssertionError
para indicarlo. - ERROR: Al ejecutar la prueba se lanzó una excepción distinta de
AssertionError
En el siguiente ejemplo, dado que el método que modela nuestra prueba no lanza ninguna excepción, la prueba pasaría con éxito.
- import unittest
- class EjemploPruebas(unittest.TestCase):
- def test(self):
- pass
- if __name__ == "__main__":
- unittest.main()
En este otro, sin embargo, fallaría:
- import unittest
- class EjemploPruebas(unittest.TestCase):
- def test(self):
- raise AssertionError()
- if __name__ == "__main__":
- unittest.main()
Nada nos impide utilizar cláusulas
if
para evaluar las condiciones que nos interesen y lanzar una excepción de tipo AssertionError
cuando no sea así, pero la claseTestCase
cuenta con varios métodos que nos pueden facilitar la tarea de realizar comprobaciones sencillas. Son los siguientes:assertAlmostEqual(first, second, places=7, msg=None)
: Comprueba que los objetos pasados como parámetros sean iguales hasta el séptimo decimal (o el número de decimales indicado porplaces
).assertEqual(first, second, msg=None)
: Comprueba que los objetos pasados como parámetros sean iguales.assertFalse(expr, msg=None)
: Comprueba que la expresión sea falsa.assertNotAlmostEqual(first, second, places=7, msg=None)
: Comprueba que los objetos pasados como parámetros no sean iguales hasta el séptimo decimal (o hasta el número de decimales indicado porplaces
).assertNotEqual(first, second, msg=None)
: Comprueba que los objetos pasados como parámetros no sean iguales.assertRaises(excClass, callableObj, *args, **kwargs)
: Comprueba que al llamar al objetocallableObj
con los parámetros definidos por*args
y**kwargs
se lanza una excepción de tipoexcClass
.assertTrue(expr, msg=None)
: Comprueba que la expresión sea cierta.assert_(expr, msg=None)
: Comprueba que la expresión sea cierta.fail(msg=None)
: Falla inmediatamente.failIf(expr, msg=None)
: Falla si la expresión es cierta.failIfAlmostEqual(first, second, places=7, msg=None)
: Falla si los objetos pasados como parámetros son iguales hasta el séptimo decimal (o hasta el número de decimales indicado porplaces
).failIfEqual(first, second, msg=None)
: Falla si los objetos pasados como parámetros son iguales.failUnless(expr, msg=None)
: Falla a menos que la expresión sea cierta.failUnlessAlmostEqual(first, second, places=7, msg=None)
: Falla a menos que los objetos pasados como parámetros sean iguales hasta el séptimo decimal (o hasta el número de decimales indicado porplaces
).failUnlessEqual(first, second, msg=None)
: Falla a menos que los objetos pasados como parámetros sean iguales.failUnlessRaises(excClass, callableObj, *args, **kwargs)
: Falla a menos que al llamar al objetocallableObj
con los parámetros definidos por*args
y**kwargs
se lance una excepción de tipoexcClass
.
Como vemos todos los métodos cuentan con un parámetro opcional
msg
con un mensaje a mostrar cuando dicha comprobación falle.Retomemos nuestra pequeña función para calcular el cuadrado de un número. Para probar el funcionamiento de la función podríamos hacer, por ejemplo, algo así:
- import unittest
- def cuadrado(num):
- """Calcula el cuadrado de un numero."""
- return num ** 2
- class EjemploPruebas(unittest.TestCase):
- def test(self):
- l = [0, 1, 2, 3]
- r = [cuadrado(n) for n in l]
- self.assertEqual(r, [0, 1, 4, 9])
- if __name__ == "__main__":
- unittest.main()
No hay comentarios:
Publicar un comentario