La idea del testeo unitario es evitar los programitas "main()" ya que
Entonces la idea del testeo unitario es:
En general cuando testeamos algo (incluso dentro de un main()) realizamos una serie de pasos:
Entonces, si pudimos encontrarle un forma o patrón a la idea de testear, también la podemos codificar. Y para eso existen herramientas o frameworks útiles para simplificarnos un poco la vida.
La idea original surgió para Java con la herramienta JUnit (o era para Smalltalk la original ?). Como nosotros trabajamos en Python vamos a utilizar un módulo especial llamado unittest.
Pero en general los conceptos son iguales para todas las herramientas, varían algunas cositas nada más.
Un testcase es una clase que agrupa varios Test Methods (o funciones de test). Y se puede ejecutar con una herramienta del IDE. La idea es que nosotros creamos nuestros propios tescases. Es decir clases que "son" TestCases. Para eso existe una particularidad relacionada con la programación orientada objetos. Y es que las clases a diferencia de los Structs de C, pueden heredar. Así como decimos que un Perro es un Animal, y por lo tal comparte ciertas características de todos los animales, así podemos definir que una clase "es un" o, mejor dicho hereda de otra clase, con lo cual tendrá todas las propiedades y atributos de ésta.
En fin, no hace falta comprender esto del todo, podrían aprenderse la sintaxis de memoria y listo.
Veamos entonces como escribo un TestCase:
from prog2.py.collections.pilaycola.pila import *
import unittest
class TestPila(unittest.TestCase):
pass
Acá este test no está haciendo nada todavía, pero es para ir de a poco.
Entonces lo que notamos es que:
Por ahora no pasa nada. Sin embargo la idea es dentro de esta clase escribir funciones pequeñas que sean las que se van a ejecutar y testear algo. Estos son los test methods..
Veamos cómo haríamos nuestro test para apilar en una pila:
class TestPila(unittest.TestCase):
def test_apilar(self):
pila = Pila()
elemento = "unElemento"
apilar(pila, elemento)
self.assertEquals(tope(pila), elemento, "La pila no inserto' bien")
self.assertFalse(vacia(pila))
Veamos entonces hay un par de cosas a saber:
Ahora sí, que definimos qué hacer y de qué asegurarnos podemos ejecutar el Test.
Dependiendo del IDE en que trabajen esto va a variar. En eclipse con PyDev, símplemente pueden hacer botón derecho sobre el código y "Run As...> Python Unit Test".
Esto ejecutará todas las funciones de test que ustedes tengan en esa clase (Como dijimos un TestCase puede tener muchos test methods dentro).
Y luego pueden ir a la vista PyUnit donde verán una barra:
Si quieren leer más o ver más ejemplos recomendamos:
Por otro lado el test de nuestra pila está acá: http://xp-dev.com/svn/uqbar/examples/prog2/unidad1-python/prog2/py/collections/pilaycola/pilaTest.py