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