Lección 4: Simple GET

Para esta lección no vamos a utilizar Django REST Framework (o DRF), tan solo Django. Ello se debe a que en ciertos Endpoints (rutas que podemos invocar) son tan sencillas que es contraproducente darle la complejidad que sí nos ofrece DRF.

Crearemos el clásico ping-pong para comprobar que el servidor esta vivo.

Realizamos la vista con la respuesta.

# app/libros/views.py

from django.http import JsonResponse

def ping(request):
    data = {"ping": "pong!"}
    return JsonResponse(data)

Añadimos la ruta.

# proyecto/urls.py

from django.contrib import admin
from django.urls import path

from app.libros.views import ping # nuevo

urlpatterns = [
    path('admin/', admin.site.urls),
    path('ping/', ping, name="ping"), # nuevo
]

Levantamos el servidor.

python3 manage.py runserver

Y lanzamos una petición HTTP desde el terminal con curl para comprobar que nos da una respuesta esperada.

curl http://localhost:8000/ping/

Nos devolverá el siguiente JSON.

{"ping": "pong!"}

Es el momento de crear un nuevo test. Creamos test_ping.py.

tests
    └── libros
            └── test_ejemplo.py
                test_ping.py
# tests/libros/test_ping.py

import json
from django.urls import reverse

def test_ping(client):
		# Obtenemos la ruta de "ping"
    url = reverse("ping")
		# Hacemos una peticion GET con el cliente de Django test
    response = client.get(url)
		# Recibo un JSON que convierto a un diccionario para tratarlo
    content = json.loads(response.content)
		# Los asset me ayuda hacer las comprobaciones. 
		# ¿Recibo el código 200?
    assert response.status_code == 200
		# ¿El contenido de Ping es Pong?> {"ping": "pong!"}
    assert content["ping"] == "pong!"

client es un fixture de ayuda de pytest-django que proporciona una instancia de django.test.Client . Básicamente es un cliente HTTP que podemos utilizar dentro de los testings.

Ya puedes ejecutar el test.

pytest
=================================================== test session starts ===================================================
platform linux -- Python 3.9.2, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
django: settings: proyecto.settings (from ini)
plugins: django-4.4.0
collected 2 items                                                                                                         

tests/libros/test_ejemplo.py .                                                                                      [ 50%]
tests/libros/test_ping.py .                                                                                         [100%]

==================================================== 2 passed in 0.05s ====================================================

Lo ha pasado todo, ¡genial!

Para hacer diferentes tests, un buen patrón es Given-When-Then. Una estructura de 3 bloques informales de comentarios para dividir el código.

  1. Given: Estado antes del código. Preparas el escenario y las condiciones del test, como información en la base de datos, estados u herramientas.
  2. When: Código del test. Ejecutas las acciones que prueben las diferentes características.
  3. Then: Comprobaciones o asserts para verificar que se ha cumplido los casos esperados.

En anterior código quedaría de la siguiente forma.

# tests/libros/test_ping.py

import json
from django.urls import reverse

def test_ping(client):

		## Given
		# Nada que manipular en la base de datos

		## When
    url = reverse("ping")
    response = client.get(url)
    content = json.loads(response.content)

		## Then
    assert response.status_code == 200
    assert content["ping"] == "pong!"

Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional.

Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Internacional

¿Me ayudas?

Comprame un café
Pulsa sobre la imagen

No te sientas obligado a realizar una donación, pero cada aportación mantiene el sitio en activo logrando que continúe existiendo y sea accesible para otras personas. Además me motiva a crear nuevo contenido.

Comentarios

{{ comments.length }} comentarios

Nuevo comentario

Nueva replica  {{ formatEllipsisAuthor(replyComment.author) }}

Acepto la política de Protección de Datos.

Escribe el primer comentario