Тепер ми переходимо до тестування ендпоінтів з використанням DRF тест-клієнта. Він надасть нам більше зручності та гнучкості у порівнянні зі стандартним тест-клієнтом Django.
Що таке DRF тест-клієнт?
Для початку, DRF тест-клієнт – це інструмент, який надає розширений функціонал для тестування REST API у Django REST Framework. На відміну від стандартного тест-клієнта Django, він уміє працювати з JSON-даними, заголовками HTTP-запитів, статусами відповідей та іншими "смаколиками", які необхідні розробнику API.
Іншими словами, DRF тест-клієнт – це ваш "бот", який буде відправляти HTTP-запити до вашого API та аналізувати відповіді. Тож, підготуйте свої ендпоінти – час їх тестувати!
Встановлення DRF тест-клієнта
Якщо ви вже працюєте з Django REST Framework, DRF тест-клієнт у вас вже є "з коробки". Основний клас, який ми будемо використовувати, називається APIClient.
Для імпорту тест-клієнта вам достатньо додати наступний рядок у ваші тести:
from rest_framework.test import APIClient
І все, клієнт готовий до використання. Тепер перейдемо до прикладів.
Приклади тестування ендпоінтів
1. Тестування HTTP-методів: GET, POST, PUT, DELETE
Почнемо з найпростішого: перевіримо, що наші ендпоінти коректно приймають запити і повертають очікувані відповіді. Припустимо, у нас є API для управління списком книг:
# models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
published_date = models.DateField()
А також просте представлення, яке дозволяє нам працювати з цими книгами:
# views.py
from rest_framework.viewsets import ModelViewSet
from .models import Book
from .serializers import BookSerializer
class BookViewSet(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
Отже, ми хочемо написати кілька тестів для перевірки роботи ендпоінтів.
# tests.py
from rest_framework.test import APIClient
from rest_framework import status
from django.test import TestCase
from .models import Book
class BookAPITestCase(TestCase):
def setUp(self):
self.client = APIClient()
self.book_data = {
"title": "Django для початківців",
"author": "William S. Vincent",
"published_date": "2023-01-01"
}
self.book = Book.objects.create(**self.book_data)
def test_get_books(self):
response = self.client.get('/api/books/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertIsInstance(response.json(), list)
def test_create_book(self):
new_book_data = {
"title": "Два черпака Django",
"author": "Audrey Roy Greenfeld",
"published_date": "2022-01-01"
}
response = self.client.post('/api/books/', new_book_data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(response.json()['title'], new_book_data['title'])
def test_update_book(self):
update_data = {"title": "Django для професіоналів"}
response = self.client.put(f'/api/books/{self.book.id}/', update_data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.json()['title'], update_data['title'])
def test_delete_book(self):
response = self.client.delete(f'/api/books/{self.book.id}/')
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
self.assertEqual(Book.objects.count(), 0)
Перевірка статусів відповіді
Для роботи REST API дуже важливо повертати правильні HTTP-коди. Наприклад:
200 OKдля успішних GET-запитів.201 Createdдля успішних POST-запитів.400 Bad Requestдля некоректних даних.404 Not Foundдля відсутніх ресурсів.
За допомогою DRF тест-клієнта ми можемо легко перевірити ці статуси:
def test_invalid_post_request(self):
invalid_data = {"title": ""}
response = self.client.post('/api/books/', invalid_data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
Перевірка вмісту JSON-відповіді
DRF тест-клієнт вміє працювати з JSON прямо "з коробки". Це означає, що ви можете легко перевіряти вміст відповіді:
def test_get_book_detail(self):
response = self.client.get(f'/api/books/{self.book.id}/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.json()['title'], self.book_data['title'])
Тестування автентифікації
Якщо ваш API вимагає авторизації, DRF тест-клієнт дозволяє легко передавати токени або куки при запитах:
from rest_framework.authtoken.models import Token
from django.contrib.auth.models import User
def setUp(self):
self.user = User.objects.create_user(username='testuser', password='testpassword')
self.token = Token.objects.create(user=self.user)
self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)
def test_authenticated_request(self):
response = self.client.get('/api/protected-endpoint/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
Особливості та типові помилки
Коли ви починаєте активно тестувати свої ендпоінти, варто пам'ятати кілька речей. По-перше, ізольованість. Кожен тест має бути незалежним і не покладатися на результат іншого тесту. Якщо ви створюєте об'єкти в тесті, завжди очищуйте їх після тесту або використовуйте вбудовані механізми Django для скидання бази даних.
По-друге, тестуйте і погані сценарії, і хороші. Наприклад, що станеться, якщо ви відправите некоректний JSON? А якщо запитаєте віддалений об'єкт?
Як це застосовується у реальному житті?
Немає нічого важливішого за тести у світі продакшен-розробки. Тестування ендпоінтів дозволяє бути впевненим, що ваш API працює коректно, навіть якщо хтось випадково змінить бізнес-логіку. Причому автоматизація цього процесу прискорює вихід нових версій продукту, що особливо важливо в Agile-командах.
Тепер ви озброєні потужним інструментом для перевірки свого API. Вперед, тестувати свої ендпоінти без страху і докорів!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ