Django proporciona un robusto framework de testing integrado que permite a los desarrolladores crear pruebas automatizadas para verificar el funcionamiento correcto de su aplicación. Estas pruebas ayudan a garantizar que el código sea confiable, evitando que nuevas funcionalidades o cambios rompan las ya existentes.
El testing framework de Django está basado en las pruebas unitarias de Python (el módulo unittest
) y permite realizar pruebas automatizadas en todo el proyecto, incluyendo modelos, vistas, formularios y más. Estas pruebas se ejecutan en una base de datos temporal para asegurar que las interacciones con la base de datos no afecten los datos reales.
Django ejecuta las pruebas en una base de datos temporal que se crea automáticamente al ejecutar las pruebas. El archivo settings.py
debe estar correctamente configurado para trabajar con el entorno de pruebas.
Para comenzar a realizar pruebas, asegúrate de que django.test
esté disponible importando las clases necesarias.
Los tests en Django se escriben creando una subclase de django.test.TestCase
. Cada método dentro de esta clase que comience con test_
será reconocido como una prueba.
Ejemplo de un test básico:
from django.test import TestCase
from .models import Persona
class PersonaModelTest(TestCase):
def setUp(self):
# Este método se ejecuta antes de cada test
Persona.objects.create(nombre="Juan", edad=30)
def test_nombre_persona(self):
# Prueba para verificar que el nombre sea correcto
persona = Persona.objects.get(nombre="Juan")
self.assertEqual(persona.nombre, "Juan")
def test_edad_persona(self):
# Prueba para verificar que la edad sea correcta
persona = Persona.objects.get(nombre="Juan")
self.assertEqual(persona.edad, 30)
Para ejecutar todas las pruebas en tu proyecto, usa el comando:
python manage.py test
Django buscará automáticamente archivos llamados tests.py
en cada aplicación y ejecutará las pruebas definidas en ellos.
Puedes escribir pruebas para asegurarte de que tus vistas funcionen correctamente, verificando las respuestas HTTP o el contenido devuelto.
Ejemplo de prueba de una vista:
from django.test import TestCase
from django.urls import reverse
class VistaInicioTest(TestCase):
def test_respuesta_vista_inicio(self):
# Verifica que la vista de inicio responda correctamente (código 200)
response = self.client.get(reverse('inicio'))
self.assertEqual(response.status_code, 200)
def test_contenido_vista_inicio(self):
# Verifica que el contenido "Bienvenido" esté en la respuesta
response = self.client.get(reverse('inicio'))
self.assertContains(response, "Bienvenido")
Puedes probar formularios verificando si los datos se validan correctamente o si se devuelven los errores apropiados.
Ejemplo de prueba de un formulario:
from django.test import TestCase
from .forms import PersonaForm
class PersonaFormTest(TestCase):
def test_form_valido(self):
form_data = {'nombre': 'Juan', 'edad': 30}
form = PersonaForm(data=form_data)
self.assertTrue(form.is_valid())
def test_form_invalido(self):
form_data = {'nombre': '', 'edad': 30} # Falta el nombre
form = PersonaForm(data=form_data)
self.assertFalse(form.is_valid())
Los métodos de los modelos también pueden ser probados para asegurarse de que los datos se manipulen como se espera.
Ejemplo de prueba de un modelo:
from django.test import TestCase
from .models import Persona
class PersonaModelTest(TestCase):
def test_creacion_persona(self):
persona = Persona.objects.create(nombre="Ana", edad=25)
self.assertEqual(persona.nombre, "Ana")
self.assertEqual(persona.edad, 25)
setUp
y tearDown
El método setUp()
se utiliza para preparar el entorno antes de ejecutar cada prueba, como la creación de datos de prueba. También puedes usar tearDown()
si necesitas limpiar recursos o datos después de cada prueba.
Ejemplo:
from django.test import TestCase
from .models import Persona
class PersonaModelTest(TestCase):
def setUp(self):
# Se ejecuta antes de cada test
Persona.objects.create(nombre="Juan", edad=30)
def tearDown(self):
# Se ejecuta después de cada test
Persona.objects.all().delete()
El cliente de pruebas (self.client
) es una herramienta que te permite simular solicitudes HTTP en tus pruebas, como GET
o POST
, y verificar las respuestas.
Ejemplo de prueba simulando una solicitud POST
:
from django.test import TestCase
from django.urls import reverse
class CrearPersonaTest(TestCase):
def test_crear_persona(self):
response = self.client.post(reverse('crear_persona'), {
'nombre': 'Carlos',
'edad': 40
})
self.assertEqual(response.status_code, 302) # Redirige después de crear
self.assertEqual(Persona.objects.last().nombre, 'Carlos')
1. Prueba de modelo:
from django.test import TestCase
from .models import Persona
class PersonaModelTest(TestCase):
def test_crear_persona(self):
persona = Persona.objects.create(nombre="Ana", edad=28)
self.assertEqual(persona.nombre, "Ana")
self.assertEqual(persona.edad, 28)
2. Prueba de vista que devuelve un código de estado 200:
from django.test import TestCase
from django.urls import reverse
class VistaTest(TestCase):
def test_acceso_vista_inicio(self):
response = self.client.get(reverse('inicio'))
self.assertEqual(response.status_code, 200)
3. Prueba de formulario:
from django.test import TestCase
from .forms import PersonaForm
class PersonaFormTest(TestCase):
def test_form_valido(self):
form_data = {'nombre': 'Pedro', 'edad': 35}
form = PersonaForm(data=form_data)
self.assertTrue(form.is_valid())
Para más detalles sobre el framework de testing en Django, consulta la documentación oficial de Django.
Jorge García
Fullstack developer