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 стабільний, безпечний і готовий до роботи в продакшені.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ