JavaRush /Курсы /Модуль 3: Django /Использование DRF тест-клиента для тестирования эндпоинто...

Использование DRF тест-клиента для тестирования эндпоинтов

Модуль 3: Django
22 уровень , 4 лекция
Открыта

Теперь мы переходим к тестированию эндпоинтов с использованием 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. Вперёд, тестировать свои эндпоинты без страха и упрёков!

1
Задача
Модуль 3: Django, 22 уровень, 4 лекция
Недоступна
Тестирование POST-запроса
Тестирование POST-запроса
1
Задача
Модуль 3: Django, 22 уровень, 4 лекция
Недоступна
Комплексное тестирование CRUD-операций
Комплексное тестирование CRUD-операций
3
Опрос
Введение в тестирование API, 22 уровень, 4 лекция
Недоступен
Введение в тестирование API
Введение в тестирование API
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ