GraphQL запросы в тестах

GraphQL становится всё более популярным выбором для API, благодаря своей гибкости и возможности запрашивать только необходимые данные. В контексте тестирования, интеграция GraphQL запросов в автоматизированные тесты с помощью Playwright открывает новые возможности для более детализированного взаимодействия с веб-приложением. Задача тестирования GraphQL запросов состоит не только в том, чтобы проверить правильность их выполнения, но и в том, чтобы удостовериться в корректности ответа и обеспечении нужной функциональности.

Основы работы с GraphQL запросами

GraphQL — это язык запросов, который позволяет клиенту точно указывать, какие данные ему нужны, минимизируя избыточность в запросах и ответах. В отличие от REST, где каждый запрос возвращает фиксированный набор данных, в GraphQL можно запрашивать только те поля, которые необходимы.

GraphQL запрос обычно состоит из трех частей:

  1. Query — описание того, какие данные нужно получить.
  2. Variables — переменные, которые могут быть использованы в запросах.
  3. Operation Name — имя операции, если оно предусмотрено.

Пример запроса:

query GetUser($id: ID!) {
  user(id: $id) {
    name
    email
  }
}

Этот запрос запрашивает данные о пользователе, включая его имя и email, передавая в качестве переменной идентификатор пользователя.

Взаимодействие с GraphQL через Playwright

Playwright — это инструмент для автоматизированного тестирования веб-приложений, который позволяет легко работать с веб-страницами, элементами и запросами. Одной из возможностей Playwright является выполнение HTTP-запросов непосредственно через его API, что дает возможность взаимодействовать с сервером, минуя веб-интерфейс.

Для работы с GraphQL запросами в Playwright используется метод page.request или browserContext.request, с помощью которых можно отправить POST-запросы с необходимыми данными. Метод request позволяет работать с HTTP запросами напрямую, что идеально подходит для взаимодействия с API, включая GraphQL.

Пример выполнения GraphQL запроса в Playwright:

const { test, expect } = require('@playwright/test');

test('GraphQL запрос в тестах Playwright', async ({ page }) => {
  // Определение GraphQL запроса
  const query = `
    query GetUser($id: ID!) {
      user(id: $id) {
        name
        email
      }
    }
  `;

  // Отправка запроса через HTTP
  const response = await page.request.post('https://your-api-endpoint/graphql', {
    data: {
      query,
      variables: { id: '123' }
    }
  });

  // Проверка ответа
  const responseBody = await response.json();
  expect(responseBody.data.user.name).toBe('John Doe');
  expect(responseBody.data.user.email).toBe('john.doe@example.com');
});

Обработка ошибок в GraphQL запросах

GraphQL сам по себе предоставляет отличные механизмы для обработки ошибок. Ответ на запрос может содержать поле errors, в котором будет описана информация о возникших ошибках. Поэтому важно не только проверять успешность выполнения запроса, но и проверять наличие ошибок в ответе.

Пример обработки ошибок:

test('Ошибка в GraphQL запросе', async ({ page }) => {
  const query = `
    query GetUser($id: ID!) {
      user(id: $id) {
        name
        email
      }
    }
  `;

  const response = await page.request.post('https://your-api-endpoint/graphql', {
    data: {
      query,
      variables: { id: 'invalid-id' }
    }
  });

  const responseBody = await response.json();
  expect(responseBody.errors).toBeDefined();
  expect(responseBody.errors[0].message).toBe('User not found');
});

Мокирование GraphQL запросов

В некоторых случаях для изоляции тестов от реального API необходимо использовать мокирование GraphQL запросов. Playwright предоставляет удобные механизмы для перехвата и модификации сетевых запросов, что позволяет заменить реальный ответ на заранее подготовленный.

Пример мокирования GraphQL запроса:

test('Мокирование GraphQL запроса', async ({ page }) => {
  // Мокируем запрос на получение пользователя
  await page.route('**/graphql', (route) => {
    route.fulfill({
      status: 200,
      contentType: 'application/json',
      body: JSON.stringify({
        data: {
          user: {
            name: 'Mocked User',
            email: 'mocked.user@example.com'
          }
        }
      })
    });
  });

  // Запускаем тест, который будет использовать мокированный ответ
  const response = await page.request.post('https://your-api-endpoint/graphql', {
    data: {
      query: `
        query GetUser($id: ID!) {
          user(id: $id) {
            name
            email
          }
        }
      `,
      variables: { id: '123' }
    }
  });

  const responseBody = await response.json();
  expect(responseBody.data.user.name).toBe('Mocked User');
  expect(responseBody.data.user.email).toBe('mocked.user@example.com');
});

Тестирование производительности GraphQL запросов

Когда тестирование GraphQL запросов требуется не только для проверки корректности, но и для оценки производительности, Playwright предоставляет инструменты для измерения времени выполнения запросов. Это позволяет анализировать, насколько быстро API обрабатывает запросы и выполнять нагрузочное тестирование.

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

test('Тестирование времени выполнения GraphQL запроса', async ({ page }) => {
  const query = `
    query GetUser($id: ID!) {
      user(id: $id) {
        name
        email
      }
    }
  `;

  const startTime = Date.now();
  await page.request.post('https://your-api-endpoint/graphql', {
    data: {
      query,
      variables: { id: '123' }
    }
  });
  const endTime = Date.now();

  const duration = endTime - startTime;
  expect(duration).toBeLessThan(2000); // запрос должен выполняться менее 2 секунд
});

Интеграция с другими тестами и фреймворками

Playwright может быть использован вместе с другими инструментами для тестирования, такими как Jest или Mocha. В этих случаях можно интегрировать тесты GraphQL с другими сценариями, например, проверка UI, которая зависит от данных, полученных через GraphQL запросы.

Пример интеграции с Jest:

const { test, expect } = require('@jest/globals');

test('Проверка данных с помощью GraphQL', async () => {
  const query = `
    query GetUser($id: ID!) {
      user(id: $id) {
        name
        email
      }
    }
  `;

  const response = await fetch('https://your-api-endpoint/graphql', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      query,
      variables: { id: '123' }
    })
  });

  const responseBody = await response.json();
  expect(responseBody.data.user.name).toBe('John Doe');
  expect(responseBody.data.user.email).toBe('john.doe@example.com');
});

Заключение

Интеграция GraphQL запросов в тестирование с помощью Playwright предоставляет мощные возможности для тестирования взаимодействия с API. Возможности моки, перехвата и измерения времени отклика делают Playwright идеальным инструментом для комплексных сценариев тестирования. Такие подходы позволяют не только проверять корректность работы API, но и оценивать производительность, а также изолировать тесты от реальных сервисов, ускоряя процесс тестирования.