Download Testing en Python
Document related concepts
no text concepts found
Transcript
Introducción a la Computación Testing en Python Maximiliano Geier Facultad de Ciencias Exactas y Naturales, UBA 3/06/2015 Maximiliano Geier (UBA) Testing en Python 3/06/2015 1 / 13 Testing ¿Qué era testing? Maximiliano Geier (UBA) Testing en Python 3/06/2015 2 / 13 Testing ¿Qué era testing (funcional)? Técnica dinámica de verificación de software. Busca contrastar la salida del programa con un documento que diga lo que se supone que debe hacer (por ejemplo, la especificación). Permite encontrar errores, pero no demostrar su ausencia. Tres niveles: 1 2 3 Test de sistema Test integración Test de unidad Maximiliano Geier (UBA) Testing en Python 3/06/2015 3 / 13 Testing Test de unidad Test de caja negra: no sé cómo está implementado el módulo y pruebo con entradas que me parezcan interesantes, casos borde, etc. Test de caja blanca: miro la implementación y pruebo con casos representativos para intentar cubrir todo el dominio. Maximiliano Geier (UBA) Testing en Python 3/06/2015 4 / 13 Testing Testing en Python ¿Cómo se escriben casos de test en Python? A mano unittest unittest es un módulo para hacer testing de unidad en Python, siguiendo una filosofı́a de diseño similar a la que tienen JUnit en Java y Beck’s Testing Framework en Smalltalk. Maximiliano Geier (UBA) Testing en Python 3/06/2015 5 / 13 unittest Testing usando unittest Receta 1 Elegir una unidad de código para probar 2 Importarla import mi_modulo 3 Importar el módulo unittest import unittest 4 Definir una clase que herede de la clase unittest.TestCase class TestsDeMiTAD(unittest.TestCase): ... 5 Pensar algún caso de test interesante 6 Definir un método para ese caso de test e implementarlo def test_interesante(self): ... 7 Volver a 5 mientras sea necesario 8 Terminar con el siguiente bloque de código: if __name__ == "__main__": unittest.main() Maximiliano Geier (UBA) Testing en Python 3/06/2015 6 / 13 unittest Ejemplo: clase Inversor Definimos una clase sencilla que devuelve el inverso multiplicativo de un número: class Inversor: def __init__(self, n): self.v = 1/n def valor(self): return self.v Maximiliano Geier (UBA) Testing en Python 3/06/2015 7 / 13 unittest Ejemplo: clase Inversor from inversor import Inversor import math import unittest class TestInversor(unittest.TestCase): def test_unidad(self): """Testea que el inverso de la unidad sea la unidad""" ... def test_cero(self): """Testea que falle cuando se pide el inverso de cero""" ... def test_otro(self): """Testea un valor que tiene un inverso distinto de sı́ mismo""" ... def test_doble_inversion(self): """Testea que invertir el inverso de un número dé el número original""" ... if __name__ == "__main__": unittest.main() Maximiliano Geier (UBA) Testing en Python 3/06/2015 8 / 13 unittest Métodos assert Al heredar de la clase unittest.TestCase, tenemos acceso a varios métodos que nos hacen más fácil escribir los casos de test. Método assert self.assertEqual(a, b) self.assertTrue(x) self.assertLessEqual(a, b) self.assertRaises(e, f, arg) self.assertItemsEqual(a, b) Falla a menos que... a sea igual a b x sea verdadero a sea menor o igual a b llamar a f(arg) dé una excepción de tipo e a tenga los mismos elementos que b Lista completa: http://docs.python.org/3/library/unittest.html#assert-methods Maximiliano Geier (UBA) Testing en Python 3/06/2015 9 / 13 unittest Implementando los casos de test Vamos a escribir algunos de los casos de test para ver cómo funciona esto: def test_unidad(self): """Testea que el inverso de la unidad sea la unidad""" self.assertEqual(Inversor(1).valor(), 1) def test_cero(self): """Testea que falle cuando se pide el inverso de cero""" # llama a Inversor(0) self.assertRaises(ZeroDivisionError, Inversor, 0) Maximiliano Geier (UBA) Testing en Python 3/06/2015 10 / 13 unittest Testeando los tests Para correr los tests: mgeier@ws1:~$ python3 test_de_mi_tad.py También se puede ejecutar la siguiente lı́nea: mgeier@ws1:~$ python3 -m unittest discover Esta última lı́nea busca todos los casos de test de unittest definidos en la carpeta de trabajo y los ejecuta. Maximiliano Geier (UBA) Testing en Python 3/06/2015 11 / 13 unittest Bonus Algunos otros truquitos que les pueden resultar útiles: Para que Python muestre más mensajes cuando ejecuta los casos de test if __name__ == "__main__": unittest.main(verbosity=2) Para correr los casos de test desde el intérprete de Python >>> import unittest >>> unittest.main(module=’mi_modulo_con_tests’, exit=False) Maximiliano Geier (UBA) Testing en Python 3/06/2015 12 / 13 unittest Tarea Ejercicio: Implementar casos de test para el ejercicio 1 del TP usando unittest. Ejemplos de cosas que pueden probar: 1 Ambos algoritmos calculan correctamente algún ejemplo hardcodeado (por ejemplo, el del enunciado). 2 Si hay un par de puntos con el mismo valor en ambas coordenadas, la distancia mı́nima es 0. 3 El algoritmo de ordenamiento implementado funciona correctamente para diferentes tamaños de entrada elegidos de forma aleatoria. 4 Ambos algoritmos devuelven pares que se encuentran a la misma distancia (quizás no el mismo) para distintos tamaños de entrada elegidos de forma aleatoria. 5 (Opcional) Cualquier otro caso de test que se les ocurra. Maximiliano Geier (UBA) Testing en Python 3/06/2015 13 / 13