Как выполнять интеграционное тестирование API в Django?

Ответ

Для интеграционного тестирования API в Django, особенно с использованием Django REST Framework, основным инструментом является APITestCase из rest_framework.test.

Он наследуется от django.test.TestCase, но предоставляет APIClient, который упрощает отправку HTTP-запросов (GET, POST и др.) и работу с JSON.

Основной процесс тестирования:

  1. Создание тестового клиента: APITestCase автоматически предоставляет self.client.
  2. Отправка запроса: Используйте методы клиента (self.client.post(), self.client.get()) для обращения к эндпоинту по его URL, который удобно получать через reverse().
  3. Проверка ответа (Assertions): Проверяется HTTP-статус ответа (например, status.HTTP_201_CREATED) и содержимое тела ответа (response.data).

Пример теста для эндпоинта создания пользователя:

from django.urls import reverse
from rest_framework.test import APITestCase
from rest_framework import status
from django.contrib.auth.models import User

class UserAPITests(APITestCase):
    def test_create_user(self):
        """Убедимся, что мы можем создать нового пользователя."""
        url = reverse('user-list') # Предполагается, что URL-имя 'user-list'
        data = {'username': 'testuser', 'password': 'password123'}

        response = self.client.post(url, data, format='json')

        # 1. Проверяем успешный статус-код
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

        # 2. Проверяем, что пользователь действительно создан в БД
        self.assertEqual(User.objects.count(), 1)

        # 3. Проверяем данные в ответе
        self.assertEqual(User.objects.get().username, 'testuser')

Best practices:

  • Изоляция тестов: Каждый тест выполняется в изолированной транзакции, которая откатывается после его завершения. APITestCase делает это по умолчанию.
  • Подготовка данных: Используйте setUp или setUpTestData для создания необходимых объектов в базе данных перед тестом.
  • Проверка состояния: Убедитесь, что после выполнения запроса состояние системы (например, количество объектов в БД) изменилось ожидаемым образом.