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
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:
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
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.
Quiero pensar que esta clase está mal colocada y debería ir al inicio 🤔 el titulo dice testing pero solo nos muestran cómo iniciar un proyecto en Django que para estas alturas no creo que sea necesario.
Gracias por reportarlo, lo vamos a arreglar.
Adrian, ya quedó resuelto!
no me parece buena practica dejar URL fijas en un test, porque si el dia de ma;ana cambia el path, te va a dar error el test, es mejor dejarlo todo amarrado con los names de las rutas
No se porque pero estos últimos videos se escuchan con un volumen muy bajo.
Sería necesario corregir esto con la mayor brevedad posible.
Está todo genial, aunque siento que la ejecución de las pruebas es algo lento
Y para ser pruebas tan sencillas...
El **unit testing** en Django es una herramienta poderosa para probar de manera automatizada las funcionalidades de tu aplicación. Django ofrece una integración directa con el módulo unittest de Python a través de su framework de pruebas. Aquí te explico cómo empezar a utilizar unit testing en Django:
### 1. **Configurar un entorno de prueba**
Django crea automáticamente un entorno de prueba al ejecutar pruebas, incluyendo la creación de una base de datos temporal, lo que asegura que las pruebas no afecten los datos reales.
### 2. **Estructura básica de una prueba en Django**
Las pruebas se suelen colocar en un archivo llamado tests.py dentro de cada aplicación de Django. El archivo básico tiene el siguiente formato:
from django.test import TestCase
from.models import MiModelo
classMiModeloTestCase(TestCase):  def setUp(self):  \# Esta función se ejecuta antes de cada test. Aquí puedes preparar datos de prueba.  MiModelo.objects.create(campo1="dato1", campo2="dato2")  def test\_campo1\_valor(self):  \# Prueba para verificar si el valor del campo1 es correcto.  objeto = MiModelo.objects.get(campo1="dato1")  self.assertEqual(objeto.campo1, "dato1")
### 3. **Métodos de prueba comunes**
- setUp(): Se ejecuta antes de cada prueba individual y es útil para preparar datos que serán utilizados en cada test.
- tearDown(): Se ejecuta después de cada prueba, y puedes usarlo para limpiar los datos si es necesario (aunque Django lo hace automáticamente al final de cada prueba).
- Métodos de unittest como assertEqual, assertTrue, assertFalse, etc., son usados para realizar las verificaciones.
### 4. **Ejecutar pruebas**
Para ejecutar las pruebas de tu proyecto Django, usa el comando:
python manage.py test
Esto ejecutará todas las pruebas en los archivos tests.py de todas las aplicaciones del proyecto.
### 5. **Pruebas para modelos**
Puedes probar la lógica de negocio y las relaciones de tus modelos de esta manera:
from django.test import TestCase
from.models import MiModelo
classMiModeloTestCase(TestCase):  def setUp(self):  \# Crea un objeto para probar  self.objeto = MiModelo.objects.create(campo1="prueba", campo2="valor")  def test\_campo1\_valor(self):  \# Verifica que el campo1 tiene el valor correcto  self.assertEqual(self.objeto.campo1, "prueba")  def test\_string\_representation(self):  \# Prueba el método \_\_str\_\_ del modelo  self.assertEqual(str(self.objeto), "prueba")
### 6. **Pruebas para vistas**
Puedes usar el cliente de pruebas que Django ofrece para probar tus vistas:
from django.test import TestCase
from django.urls import reverse
classMiVistaTestCase(TestCase):  def test\_vista\_principal(self):  \# Utiliza el cliente de pruebas para simular una solicitud GET  response = self.client.get(reverse('nombre\_de\_la\_vista'))  \# Verifica que la respuesta es 200 OK  self.assertEqual(response.status\_code, 200)  \# Verifica si el contenido contiene algún texto específico  self.assertContains(response, "Texto esperado")
### 7. **Pruebas para formularios**
Puedes probar la lógica de validación y envío de formularios de la siguiente manera:
from django.test import TestCase
from.forms import MiFormulario
classMiFormularioTestCase(TestCase):  def test\_formulario\_valido(self):  form = MiFormulario(data={'campo1': 'valor válido'})  self.assertTrue(form.is\_valid())  def test\_formulario\_invalido(self):  form = MiFormulario(data={'campo1': ''})  self.assertFalse(form.is\_valid())
### 8. **Pruebas para URLs**
Asegúrate de que las rutas de tus vistas están configuradas correctamente:
from django.test import SimpleTestCase
from django.urls import reverse, resolve
from.views import mi\_vista
classURLTestCase(SimpleTestCase):  def test\_url\_resuelve\_a\_vista(self):  \# Verifica que la URL resuelve a la vista correcta  url = reverse('nombre\_de\_la\_vista')  self.assertEqual(resolve(url).func, mi\_vista)
### 9. **Pruebas para API (si usas Django REST Framework)**
Si trabajas con una API, también puedes hacer pruebas para verificar el comportamiento de tus endpoints:
from rest\_framework.test import APITestCase
from rest\_framework import status
from django.urls import reverse
from.models import MiModelo
classMiAPITestCase(APITestCase):  def test\_api\_lista(self):  url = reverse('mi\_api\_lista')  response = self.client.get(url)  self.assertEqual(response.status\_code, status.HTTP\_200\_OK)
### 10. **Estrategia para pruebas unitarias**
- **Cubre la lógica de negocio**: Asegúrate de probar cualquier cálculo, reglas de negocio y flujos de datos en los modelos.
- **Prueba todas las vistas críticas**: Asegúrate de que las vistas devuelvan la respuesta adecuada.
- **Prueba formularios y validaciones**: La lógica de validación en formularios debe ser robusta y a prueba de errores.
- **Prueba integraciones y APIs**: Si usas APIs, verifica que los endpoints funcionen como se espera.