Давайте попробуем автоматизировать тестирование 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"
Здесь мы:
- Пишем сам запрос в формате строки.
- Отправляем запрос к
graphql/эндпоинту черезclient.post. - Проверяем, что API отвечает с кодом 200.
- Убедились, что список пользователей содержит правильные данные.
Пример теста для мутаций (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
Теперь вы можете использовать её для более сложных тестов, если хотите вывести свои навыки тестирования на новый уровень.
Чек-лист
Вот что нужно проверять всякий раз при тестировании:
- Покрытие всех типов запросов: убедитесь, что вы тестируете все основные типы запросов — получение данных (query), создание (mutation), обновление и удаление.
- Граничные значения: тесты должны проверять не только корректные данные, но и ситуации, когда запросы содержат ошибки.
- Безопасность: не забудьте протестировать ваши разрешения. Убедитесь, что неавторизованные пользователи не могут получить доступ к защищённым данным.
- Документация: хорошо комментируйте тесты. Убедитесь, что ваши коллеги или вы сами через полгода поймёте, что проверяется в тесте.
Теперь вы вооружены знаниями для тестирования GraphQL API. Заключительное практическое задание: напишите тесты для вашего собственного проекта или учебного примера. Убедитесь, что ваш API стабилен, безопасен и готов к работе в продакшене.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ