Volver a la página principal
miércoles 16 octubre 2024
23

Cómo hacer tests en Django

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.

¿Qué es el framework de testing en Django?

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.

Tipos de pruebas en Django

  • Pruebas unitarias: Verifican la funcionalidad de partes individuales del código, como funciones o métodos.
  • Pruebas de integración: Verifican cómo interactúan entre sí varias partes del sistema.
  • Pruebas de vistas: Aseguran que las vistas respondan con los datos o las plantillas correctas.
  • Pruebas de modelos: Verifican que los modelos y sus métodos funcionen correctamente.
  • Pruebas de formularios: Evalúan que los formularios validen y procesen los datos de manera adecuada.

Configuración inicial para pruebas en Django

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.

Cómo crear tests en Django

1. Crear una clase de pruebas

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)

2. Ejecutar pruebas

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.

Pruebas de vistas en Django

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")

Pruebas de formularios en Django

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())

Pruebas de modelos en Django

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)

Utilización de 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()

Uso del cliente de pruebas

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')

Algunos ejemplos

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())

Buenas prácticas

  • Crea pruebas unitarias para todas las funcionalidades críticas de tu aplicación.
  • Escribe pruebas antes de implementar nuevas funcionalidades (desarrollo guiado por pruebas o TDD).
  • Asegúrate de que las pruebas se ejecuten automáticamente como parte del proceso de integración continua (CI).

Referencia oficial

Para más detalles sobre el framework de testing en Django, consulta la documentación oficial de Django.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer