Sobes.tech
Назад к вопросам
Junior — Middle
46

Проводили ли вы модульное тестирование API, реализованного с помощью Django?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Да, модульное тестирование API на Django проводилось. Для проверки использовались изолированные тесты контроллеров, сериализации и бизнес-логики, чтобы не зависеть от внешних сервисов и реальной БД там, где это не нужно. Обычно важно показать, что тестируются и успешные сценарии, и ошибки, и права доступа.

Определение:

Модульное тестирование API — это проверка отдельных частей backend-логики в изоляции: вьюх, сериализаторов, валидаторов, сервисных функций. В Django это обычно делают через unittest/pytest и тестовый клиент, а внешние зависимости подменяют моками. Цель — быстро и стабильно проверить поведение endpoint’ов на уровне одного модуля или компонента.

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

Например, для POST /api/orders/ можно проверить, что при валидных данных создаётся заказ, а при пустом items возвращается ошибка валидации.

from django.test import TestCase
from rest_framework.test import APIClient

class OrderAPITest(TestCase):
    def setUp(self):
        self.client = APIClient()

    def test_create_order_success(self):
        payload = {
            "items": [{"product_id": 1, "quantity": 2}]
        }

        response = self.client.post("/api/orders/", payload, format="json")

        self.assertEqual(response.status_code, 201)
        self.assertIn("id", response.data)

    def test_create_order_validation_error(self):
        payload = {"items": []}

        response = self.client.post("/api/orders/", payload, format="json")

        self.assertEqual(response.status_code, 400)
        self.assertIn("items", response.data)

Пояснение кода:

В примере используется тестовый клиент Django REST Framework, который имитирует HTTP-запросы к API. Первый тест отправляет валидный payload и проверяет, что сервер вернул 201 Created и создал объект. Второй тест отправляет некорректные данные и проверяет, что API вернуло 400 Bad Request и сообщение об ошибке по полю items.

Ключевые моменты:

  • Модульные тесты проверяют отдельные части API в изоляции, без лишних зависимостей.
  • В Django удобно тестировать через TestCase или pytest вместе с APIClient.
  • Важно покрывать не только happy path, но и ошибки валидации, авторизацию и граничные случаи.
  • Внешние сервисы и тяжёлые зависимости лучше мокать, чтобы тесты были быстрыми и стабильными.
  • Если логика сложная, полезно отдельно тестировать сервисный слой, а не только endpoint’ы.