martes, 14 de enero de 2014

Pruebas Unitarias Django

Pruebas unitarias en Django

Los test en Django cubren los modelos creados de la base de datos y las apps instaladas de terceros.


Para escribir un test debe heredar de la clase TestCase, a continuación el ejemplo de un test:


from django.test import TestCase
from principal.models import Libro, Autor

class LibroTestCase(TestCase):
def setUp(self):
a1 = Autor.objects.create(nombre="J.K. Rowling")
a2 = Autor.objects.create(nombre="Miguel de Carvantes")
Libro.objects.create(titulo = "Harry Potter", autor = a1, resumen = "Resumen del libro")
Libro.objects.create(titulo = "El Quijote", autor = a2, resumen = "Resumen del libro")

def test_libros_autor(self):
libro1 = Libro.objects.get(titulo="Harry Potter")
self.assertEqual(libro1.autor.nombre, "J.K. Rowling")  

def test_libros_puntuacion(self):
libro2 = Libro.objects.get(titulo="El Quijote")
self.assertEqual(libro2.get_puntuacion_media(), 0)

Para ejecutar los test se usará el comando “python manage.py test”.

El test se construye con una clase que herede de textCase, el test debe escribirse en un archivo test.py dentro de la app, en este caso principal.
Dentro de la clase estarán el método setUp en el que se crearán los objetos que van a probar los modelos creados.
Una vez creado el método setUp y los objetos a estudiar se crean tantos métodos como se necesiten para evaluar los modelos, sabiendo que si algún método falla lo que devolverá será el nombre del método.
En el primer método se comprueba que cuando se pide el autor devuelva su autor, es una comprobación muy simple.
En el segundo método  se comprueba que cuando se pida la puntuación media sea 0, suponiendo que ese es un método que tiene el modelo libro en el cual se recorren las votaciones que tiene asignadas y hace las media de ellas.

Resultado de ejecutar el test:

Si se incluye el siguiente método provocaría un error con el consecuente mensaje de consola:

def test_libros_puntuacion2(self): libro2 = Libro.objects.get(titulo="El Quijote") self.assertEqual(libro2.get_puntuacion_media(), 1)