El autor seleccionó a Open Internet/Free Speech Fund para recibir una donación como parte del programa Write for DOnations.
Es casi imposible crear sitios web que desde el principio funcionen a la perfección y no tengan errores. Por ese motivo, debe probar su aplicación web para encontrar esos errores y trabajar en ellos de forma proactiva. Para mejorar la eficiencia de las pruebas, es común desglosarlas en unidades que prueben funcionalidades específicas de la aplicación web. Esta práctica se denomina prueba de unidades. Hace que sea más fácil detectar errores, dado que las pruebas se centran en pequeñas partes (unidades) de su proyecto independientemente de otras.
Probar un sitio web puede ser una tarea compleja, ya que consta de varias capas de lógica, como la gestión de solicitudes HTTP, la validación de formularios y la representación de plantillas. Sin embargo, Django ofrece un conjunto de herramientas que le permite probar su aplicación web sin problemas. Aunque es posible utilizar otros marcos de pruebas, la opción preferida para escribir pruebas en Django es usar el módulo unittest
de Python.
A través de este tutorial, configurará un conjunto de pruebas en su proyecto de Django y escribirá pruebas de unidades para los modelos y vistas de su aplicación. Ejecutará estas pruebas, analizará sus resultados y aprenderá a encontrar las causas de errores en las pruebas que fallan.
Antes de iniciar este tutorial, necesitará lo siguiente:
Un conjunto de pruebas en Django es una colección de todos los casos de prueba en todas las aplicaciones de su proyecto. Para lograr que la utilidad de prueba de Django descubra los casos de prueba que tiene, se escriben los casos de prueba en secuencias de comandos cuyos nombres comiencen con test
. En este paso, creará la estructura del directorio y los archivos para su conjunto de pruebas, y creará un caso de prueba vacío dentro de él.
Si siguió la serie de tutoriales Desarrollo en Django, tendrá una aplicación de Django denominada blogsite
.
Crearemos una carpeta para contener todos nuestros scripts de prueba. Primero, active el entorno virtual:
- cd ~/my_blog_app
- . env/bin/activate
Luego, diríjase al directorio de la aplicación blogsite
, la carpeta que contiene los archivos models.py
y views.py
, y luego cree una carpeta nueva llamada tests
:
- cd ~/my_blog_app/blog/blogsite
- mkdir tests
A continuación, convertirá esta carpeta en un paquete Python; agregue un archivo __init__.py
:
- cd ~/my_blog_app/blog/blogsite/tests
- touch __init__.py
Ahora, agregue un archivo para probar sus modelos y otro para probar sus vistas:
- touch test_models.py
- touch test_views.py
Por último, creará un caso de prueba vacío en test_models.py
. Deberá importar la clase TestCase
de Django y hacer que sea una súper clase de su propia clase de caso de prueba. Más adelante, añadirá métodos a este caso de prueba para probar la lógica en sus modelos. Abra el archivo test_models.py
1:
- nano test_models.py
Luego, añada el siguiente código al archivo:
from django.test import TestCase
class ModelsTestCase(TestCase):
pass
De esta manera, habrá añadido correctamente un conjunto de pruebas a la aplicación blogsite
. Luego, completará los detalles del caso de prueba de modelo vacío que creó aquí.
En este paso, probará la lógica del código escrito en el archivo models.py
. En particular, probará el método save
del modelo Post
para asegurarse de que cree el slug correcto del título de una entrada cuando se invoque.
En este caso, comenzaremos observando el código que ya tiene en su archivo models.py
para ver el método save
del modelo Post
:
- cd ~/my_blog_app/blog/blogsite
- nano models.py
Observará lo siguiente:
class Post(models.Model):
...
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super(Post, self).save(*args, **kwargs)
...
Podemos ver que verifica si la entrada que está a punto de guardar tiene un valor slug, y, si no, invoca a slugify
a fin de crear un valor slug para la misma. Este es el tipo de lógica que tal vez quiera probar para asegurarse de que los slugs se creen en realidad cuando se guarde una entrada.
Cierre el archivo.
Para probar esto, regrese a test_models.py
:
- nano test_models.py
Luego, actualícelo para que se vea como a continuación y agregue las porciones resaltadas:
from django.test import TestCase
from django.template.defaultfilters import slugify
from blogsite.models import Post
class ModelsTestCase(TestCase):
def test_post_has_slug(self):
"""Posts are given slugs correctly when saving"""
post = Post.objects.create(title="My first post")
post.author = "John Doe"
post.save()
self.assertEqual(post.slug, slugify(post.title))
Este nuevo método test_post_has_slug
crea una nueva entrada con el título "My first post"
y, luego, atribuye a esta un autor y la guarda. Después de esto, usando el método assertEqual
del módulo unittest
de Python, se comprueba si el slug de la entrada es correcto. El método assertEqual
verifica si los dos argumentos que se le pasan son iguales, como lo determina el operador "=="
, y genera un error si no lo son.
Guarde y cierre test_models.py
.
Este es un ejemplo de lo que se puede probar. Cuanta más lógica añada a su proyecto, habrá más por probar. Si añade más lógica al método save
o crea nuevos métodos para el modelo Post
, querrá añadir más pruebas aquí. Usted puede añadirlas al método test_post_has_slug
o crear nuevos métodos de prueba, pero sus nombres deben comenzar con test
.
Creó con éxito un caso de prueba para el modelo Post
, en el que validó que los slugs se crean correctamente después del guardado. En el siguiente paso, escribirá un caso de prueba para probar las vistas.
En este paso, escribirá un caso de prueba que probará una vista utilizando el cliente de prueba de Django. El cliente de prueba es una clase de Python que funciona como navegador web ficticio, le permite probar sus vistas e interactuar con su aplicación Django como un usuario lo haría. Puede acceder al cliente de prueba haciendo referencia a self.client
en sus métodos de prueba. Por ejemplo, crearemos un caso de prueba en test_views.py
. Primero, abra el archivo test_views.py
:
- nano test_views.py
Luego, agregue lo siguiente:
from django.test import TestCase
class ViewsTestCase(TestCase):
def test_index_loads_properly(self):
"""The index page loads properly"""
response = self.client.get('your_server_ip:8000')
self.assertEqual(response.status_code, 200)
El ViewsTestCase
contiene un método test_index_loads_properly
que utiliza el cliente de prueba de Django para visitar la página principal del sitio web (http://your_server_ip:8000
, donde your_server_ip
es la dirección IP del servidor que utiliza). Luego, el método de prueba comprueba si la respuesta tiene un código de estado 200
, lo cual significa que la página respondió sin errores. Como resultado, puede estar seguro de que cuando el usuario visite la página también responderá sin errores.
Además del código de estado, puede leer sobre otras propiedades de la respuesta del cliente de prueba que puede probar en la página de documentación de respuestas de prueba de Django.
En este paso, creó un caso de prueba para probar la vista que genera la página principal y verificar que funcione sin errores. Ahora, hay dos casos de prueba en su conjunto de pruebas. En el siguiente paso, los ejecutará para ver sus resultados.
Ahora que terminó de crear un conjunto de pruebas para el proyecto, es el momento de ejecutar estas pruebas y ver sus resultados. Para ejecutar las pruebas, diríjase a la carpeta blog
(que contiene el archivo manage.py
de la aplicación):
- cd ~/my_blog_app/blog
Luego, ejecútelas con lo siguiente:
- python manage.py test
Verá un resultado similar al siguiente en su terminal:
OutputCreating test database for alias 'default'...
System check identified no issues (0 silenced).
..
----------------------------------------------------------------------
Ran 2 tests in 0.007s
OK
Destroying test database for alias 'default'...
En este resultado, hay dos puntos ..
, cada uno de los cuales representa un caso de prueba aprobado. Ahora, modificará test_views.py
para activar una prueba que falle. Abra el archivo con lo siguiente:
- nano test_views.py
Luego, cambie el código resaltado para ver lo siguiente:
from django.test import TestCase
class ViewsTestCase(TestCase):
def test_index_loads_properly(self):
"""The index page loads properly"""
response = self.client.get('your_server_ip:8000')
self.assertEqual(response.status_code, 404)
Aquí, cambió el código de estado de 200
a 404
. Ahora, ejecute la prueba de nuevo desde su directorio con manage.py
:
- python manage.py test
Verá el siguiente resultado:
OutputCreating test database for alias 'default'...
System check identified no issues (0 silenced).
.F
======================================================================
FAIL: test_index_loads_properly (blogsite.tests.test_views.ViewsTestCase)
The index page loads properly
----------------------------------------------------------------------
Traceback (most recent call last):
File "~/my_blog_app/blog/blogsite/tests/test_views.py", line 8, in test_index_loads_properly
self.assertEqual(response.status_code, 404)
AssertionError: 200 != 404
----------------------------------------------------------------------
Ran 2 tests in 0.007s
FAILED (failures=1)
Destroying test database for alias 'default'...
Verá aparecer un mensaje de error descriptivo en el que se indicará la secuencia de comandos, el caso de prueba y el método que falló. También se mostrará la causa de la falla, con un código de estado que no es igual al 404
en este caso, con el mensaje AssertionError: 200 ! = 404
. El AssertionError
aquí se genera en la línea de código resaltada en el archivo test_views.py
:
from django.test import TestCase
class ViewsTestCase(TestCase):
def test_index_loads_properly(self):
"""The index page loads properly"""
response = self.client.get('your_server_ip:8000')
self.assertEqual(response.status_code, 404)
Le indica que la afirmación es falsa, es decir, el código de estado de respuesta (200
) no es lo que se esperaba (404
). Precediendo el mensaje de error, puede ver que los dos puntos ..
pasaron a ser . F
, lo cual indica que el primer caso de prueba se aprobó mientras que el segundo no.
A través de este tutorial, creó un conjunto de pruebas en su proyecto de Django, añadió casos de prueba para probar el modelo y la lógica de visualización, aprendió a ejecutar pruebas y analizó el resultado de una prueba. Como siguiente paso, puede crear nuevas secuencias de comandos para código Python que no estén en models.py
y views.py
.
A continuación, consulte algunos artículos que pueden ser útiles al crear y probar sitios web con Django:
También puede consultar nuestra página de temas de Django para ver tutoriales y proyectos adicionales.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!