Ответ
Для интеграционного тестирования API в Django, особенно с использованием Django REST Framework, основным инструментом является APITestCase
из rest_framework.test
.
Он наследуется от django.test.TestCase
, но предоставляет APIClient
, который упрощает отправку HTTP-запросов (GET, POST и др.) и работу с JSON.
Основной процесс тестирования:
- Создание тестового клиента:
APITestCase
автоматически предоставляетself.client
. - Отправка запроса: Используйте методы клиента (
self.client.post()
,self.client.get()
) для обращения к эндпоинту по его URL, который удобно получать черезreverse()
. - Проверка ответа (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
для создания необходимых объектов в базе данных перед тестом. - Проверка состояния: Убедитесь, что после выполнения запроса состояние системы (например, количество объектов в БД) изменилось ожидаемым образом.