Testing de Aplicaciones Django con Unit Tests

Clase 31 de 33Curso de Django

Contenido del curso

Desarrollo de Aplicaciones en Django

Resumen

Trabajar en equipos de desarrollo implica modificar código de otras personas constantemente. Sin pruebas automatizadas, cada cambio puede romper funcionalidades que ya estaban operando correctamente. Django incluye un conjunto completo de herramientas para testing que te permiten verificar que tu aplicación sigue funcionando después de cada modificación.

¿Por qué es fundamental el testing en proyectos Django?

El testing cumple un rol esencial: validar que los cambios que introduces agregan funcionalidades sin dañar lo que ya existía. En una aplicación como un coffee shop, donde listar productos y gestionar órdenes son operaciones críticas, las pruebas unitarias (unit tests) garantizan estabilidad en cada iteración del código.

Django genera automáticamente una base de datos de prueba cada vez que ejecutas los tests. Esto significa que tus datos reales nunca se ven afectados, y cada ejecución parte desde un estado limpio.

¿Cómo crear unit tests para vistas de productos?

Dentro de la aplicación de productos, Django genera un archivo llamado test.py. Ahí es donde se construyen las pruebas [01:17].

¿Cómo verificar que una página carga correctamente?

Se crea una clase que hereda de TestCase y se le asigna el nombre de la vista con el posfijo Test:

python from django.test import TestCase from django.urls import reverse from .models import Product

class ProductListTest(TestCase): def test_should_return_200(self): url = reverse('list_product') response = self.client.get(url) self.assertEqual(response.status_code, 200)

La clase TestCase proporciona self.client, un cliente HTTP que permite realizar peticiones get, post y otras sin levantar un servidor real [02:15]. Los asserts son métodos que validan si el resultado esperado coincide con el obtenido: igual, diferente, verdadero, falso, entre otros.

Para ejecutar las pruebas se usa el comando python manage.py test [03:00]. Django crea la base de datos de prueba, ejecuta los tests y muestra los resultados.

¿Cómo validar el contexto y los datos de la respuesta?

Una herramienta poderosa de Python para inspeccionar variables durante la ejecución son los breakpoints [04:00]. Al colocar breakpoint() en el código, la ejecución se detiene y abre una shell interactiva llamada PDB (Python Debugger) donde puedes consultar variables:

python breakpoint()

En PDB puedes escribir:

response.context

response.context['products']

Desde el contexto puedes acceder a la llave products y verificar que el query set esté vacío cuando no se han creado productos [04:45]. Con esta información se construye una prueba más completa:

python def test_should_return_200_with_products(self): Product.objects.create( name='test', description='Description', price=100, available=True ) url = reverse('list_product') response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(response.context['products'].count(), 1)

  • Sin productos creados, el count debe ser cero.
  • Después de crear un producto con objects.create, el count debe ser uno [05:50].

¿Cómo probar autenticación y redirecciones en Django?

Otra funcionalidad crítica es verificar que las vistas protegidas redirijan a usuarios no autenticados [06:30]. En la aplicación de órdenes se crea una nueva clase de prueba:

python from django.test import TestCase from django.urls import reverse from django.contrib.auth import get_user_model

class MyOrderViewTest(TestCase): def test_no_logged_user_should_redirect(self): url = reverse('my_order') response = self.client.get(url) self.assertEqual(response.status_code, 302)

def test_logged_user_should_return_200(self): User = get_user_model() user = User.objects.create(username='testuser') self.client.force_login(user) url = reverse('my_order') response = self.client.get(url) self.assertEqual(response.status_code, 200)
  • get_user_model() es un método de Django que obtiene el modelo de usuario configurado globalmente, especialmente útil cuando se customiza el modelo de usuario [07:50].
  • self.client.force_login(user) permite autenticar un usuario sin necesidad de contraseña, ideal para pruebas [08:10].
  • Un usuario no logueado recibe un código 302 (redirección).
  • Un usuario autenticado recibe un código 200 (página cargada correctamente).

Al ejecutar todas las pruebas con python manage.py test, las cuatro pasan correctamente [09:25], confirmando que tanto el listado de productos como la autenticación funcionan según lo esperado.

Las pruebas unitarias son la red de seguridad que todo proyecto necesita. Te permiten verificar que los cambios no están rompiendo funcionalidades previas y Django facilita este proceso con herramientas integradas desde el primer momento. ¿Ya estás escribiendo pruebas en tus proyectos? Comparte tu experiencia en los comentarios.