JavaRush /Курсы /Модуль 3: Django /Тестирование GraphQL API

Тестирование GraphQL API

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

Давайте попробуем автоматизировать тестирование GraphQL API. Времена, когда программисты проверяли API «вручную», ушли. Сегодня мы разберёмся, как писать тесты для GraphQL API и делать это грамотно.

Подготовка к тестированию GraphQL API

Перед началом тестирования убедитесь, что ваш проект интегрирован с нужной библиотекой для тестов. В случае Django это pytest и pytest-django. Если вы ещё не установили их, это можно сделать через pip:

pip install pytest pytest-django

Теперь добавьте pytest в ваш проект. Для этого создайте файл pytest.ini в корневой директории:

[pytest]
DJANGO_SETTINGS_MODULE = myproject.settings

Не забудьте заменить myproject.settings на название вашего модуля настроек.

Подготовка тестовой базы данных

Django автоматически создаёт тестовую базу данных для запуска тестов. Всё, что вам нужно сделать, это запустить тесты, и база данных будет подготовлена:

pytest

Тестовые данные

Чтобы избежать повторения одного и того же кода для создания тестовых данных, используйте фикстуры. Вот пример фикстуры для создания двух пользователей:

import pytest
from django.contrib.auth.models import User

@pytest.fixture
def create_test_users(db):
    User.objects.create_user(username="user1", password="password123")
    User.objects.create_user(username="user2", password="password123")

Написание тестов для GraphQL API

Для тестирования GraphQL запросов и мутаций используется Django тестовый клиент. Его преимуществом является простота использования и возможность тестировать эндпоинты как в реальных условиях.

Пример создания тестового клиента:

from django.test import Client

client = Client()

Теперь здесь начинается часть, где вы на самом деле тестируете запросы.

Пример теста для запросов (Queries)

Возьмём простой пример запроса, который возвращает список пользователей:

query {
  users {
    id
    username
  }
}

Тест для этого запроса на Python может выглядеть так:

def test_users_query(create_test_users):
    query = '''
    query {
        users {
            id
            username
        }
    }
    '''

    response = client.post("/graphql/", {"query": query}, content_type="application/json")

    # Проверяем статус-код
    assert response.status_code == 200

    # Проверяем правильность данных
    data = response.json()["data"]["users"]
    assert len(data) == 2
    assert data[0]["username"] == "user1"
    assert data[1]["username"] == "user2"

Здесь мы:

  1. Пишем сам запрос в формате строки.
  2. Отправляем запрос к graphql/ эндпоинту через client.post.
  3. Проверяем, что API отвечает с кодом 200.
  4. Убедились, что список пользователей содержит правильные данные.

Пример теста для мутаций (Mutations)

Теперь рассмотрим тест для мутации, которая создаёт нового пользователя:

mutation {
  createUser(username: "newuser", password: "password123") {
    user {
      id
      username
    }
  }
}

Тест для этой мутации:

def test_create_user_mutation(db):
    mutation = '''
    mutation {
        createUser(username: "newuser", password: "password123") {
            user {
                id
                username
            }
        }
    }
    '''

    response = client.post("/graphql/", {"query": mutation}, content_type="application/json")

    # Проверяем статус-код
    assert response.status_code == 200

    # Проверяем правильность данных
    data = response.json()["data"]["createUser"]["user"]
    assert data["username"] == "newuser"

    # Проверяем, что пользователь создан в базе данных
    from django.contrib.auth.models import User
    assert User.objects.filter(username="newuser").exists()

Тестируем:

  • Что API возвращает корректный статус.
  • Что пользователь действительно сохранён в базе данных.

Инструменты для тестирования GraphQL

Мы уже разобрались с использованием Django Test Client, но есть ещё несколько «вкусностей»:

  • GraphQL Playground: идеален для ручного тестирования запросов.
  • Fixtures: используйте их для создания сложных предварительных данных. Это сэкономит вам время.
  • Mocking: если ваше API взаимодействует с внешними сервисами (например, платёжными системами), мок-тестирование спасёт вас от неожиданных запросов к этим системам.

Использование pytest с pytest-graphql

Если вам нужно более специфичное тестирование запросов, библиотека pytest-graphql может быть очень полезна. Она позволяет быстро писать тесты и интегрироваться с pytest.

Установка:

pip install pytest-graphql

Теперь вы можете использовать её для более сложных тестов, если хотите вывести свои навыки тестирования на новый уровень.

Чек-лист

Вот что нужно проверять всякий раз при тестировании:

  1. Покрытие всех типов запросов: убедитесь, что вы тестируете все основные типы запросов — получение данных (query), создание (mutation), обновление и удаление.
  2. Граничные значения: тесты должны проверять не только корректные данные, но и ситуации, когда запросы содержат ошибки.
  3. Безопасность: не забудьте протестировать ваши разрешения. Убедитесь, что неавторизованные пользователи не могут получить доступ к защищённым данным.
  4. Документация: хорошо комментируйте тесты. Убедитесь, что ваши коллеги или вы сами через полгода поймёте, что проверяется в тесте.

Теперь вы вооружены знаниями для тестирования GraphQL API. Заключительное практическое задание: напишите тесты для вашего собственного проекта или учебного примера. Убедитесь, что ваш API стабилен, безопасен и готов к работе в продакшене.

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