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 для початківців",
            "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. Вперед, тестувати свої ендпоінти без страху і докорів!

3
Опитування
Вступ до тестування API, рівень 22, лекція 4
Недоступний
Вступ до тестування API
Вступ до тестування API
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ