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.
- 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.
- When: Código del test. Ejecutas las acciones que prueben las diferentes características.
- 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.
¿Me invitas a un café? ☕
Puedes hacerlo usando el terminal.
ssh customer@andros.dev -p 5555
Comentarios
Nuevo comentario
Nueva replica {{ formatEllipsisAuthor(replyComment.author) }}
Escribe el primer comentario
{{ comments.length }} comentarios