Теперь мы переходим к тестированию эндпоинтов с использованием 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 for Beginners",
"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": "Two Scoops of 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 for Professionals"}
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. Вперёд, тестировать свои эндпоинты без страха и упрёков!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ