Интеграция с REST API

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

Установка Playwright и настройка окружения

Для начала необходимо установить Playwright и создать рабочее окружение. Для установки Playwright в проект используется стандартная команда npm:

npm install playwright

Далее нужно создать тестовый файл, например apiTest.spec.js, который будет использоваться для работы с API.

Основные функции для работы с API

Playwright предоставляет API для взаимодействия с сервером через объект APIRequestContext, который используется для выполнения HTTP-запросов. Этот объект позволяет отправлять запросы разных типов, таких как GET, POST, PUT, DELETE и другие, а также настраивать заголовки, параметры и тело запросов.

Создание APIRequestContext обычно выполняется в контексте браузера или через команду request.newContext(), которая создает отдельный контекст для отправки запросов.

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

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

test('GET-запрос к REST API', async ({ request }) => {
  const response = await request.get('https://jsonplaceholder.typicode.com/posts');
  
  expect(response.status()).toBe(200);
  const data = await response.json();
  expect(data.length).toBeGreaterThan(0);
});

Этот пример показывает, как выполнить GET-запрос к публичному API и проверить, что ответ имеет статус 200 и содержит данные.

Отправка данных с использованием POST-запросов

Для отправки данных на сервер используется метод post(), который позволяет передать тело запроса в формате JSON. Также можно настроить заголовки и параметры запроса для аутентификации или других целей.

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

test('POST-запрос к REST API', async ({ request }) => {
  const response = await request.post('https://jsonplaceholder.typicode.com/posts', {
    data: {
      title: 'foo',
      body: 'bar',
      userId: 1
    }
  });

  expect(response.status()).toBe(201);
  const responseBody = await response.json();
  expect(responseBody).toMatchObject({
    title: 'foo',
    body: 'bar',
    userId: 1
  });
});

В данном примере создается новый пост с помощью POST-запроса. В теле запроса отправляются данные, которые затем проверяются в ответе.

Использование аутентификации в API

Если API требует аутентификации, например с использованием токенов или сессий, Playwright позволяет настраивать заголовки запроса. Для этого можно использовать объект APIRequestContext и передавать в нем нужные данные, такие как токены или куки.

Пример отправки запроса с токеном авторизации:

test('GET-запрос с авторизацией', async ({ request }) => {
  const response = await request.get('https://api.example.com/protected-resource', {
    headers: {
      'Authorization': 'Bearer your_token_here'
    }
  });

  expect(response.status()).toBe(200);
  const data = await response.json();
  expect(data).toHaveProperty('protectedData');
});

В этом примере в заголовках запроса передается токен для авторизации, что позволяет получить доступ к защищенному ресурсу.

Проверка данных в ответах

При тестировании API важно не только проверять статус ответа, но и содержимое, которое возвращает сервер. Playwright предоставляет удобные методы для работы с JSON-ответами, включая json(), который парсит ответ в объект.

Пример проверки структуры ответа:

test('Проверка структуры ответа', async ({ request }) => {
  const response = await request.get('https://jsonplaceholder.typicode.com/posts/1');
  const data = await response.json();

  expect(data).toHaveProperty('id');
  expect(data).toHaveProperty('title');
  expect(data).toHaveProperty('body');
});

Здесь проверяется, что в ответе содержатся ожидаемые поля, такие как id, title и body.

Работа с ошибками и тайм-аутами

При тестировании API необходимо обрабатывать возможные ошибки, такие как недоступность сервера или неправильный формат данных. Playwright позволяет настроить тайм-ауты и проверку ошибок для каждого запроса.

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

test('Обработка ошибок API', async ({ request }) => {
  try {
    const response = await request.get('https://jsonplaceholder.typicode.com/invalid-endpoint', {
      timeout: 5000
    });

    if (response.status() !== 200) {
      throw new Error(`API вернул ошибку: ${response.status()}`);
    }
  } catch (error) {
    console.error('Ошибка при выполнении запроса:', error);
    expect(error).toBeInstanceOf(Error);
  }
});

В этом примере добавлен блок try-catch, который перехватывает ошибки выполнения запроса, а также настроен тайм-аут для каждого запроса.

Интеграция с базами данных через API

Иногда необходимо интегрировать API с тестами на уровне базы данных. В этом случае Playwright может быть использован для тестирования API, а базу данных можно проверить через SQL-запросы или REST API для работы с данными.

Пример создания теста, который сначала отправляет запрос через API, а затем проверяет состояние базы данных:

test('Интеграционное тестирование API и базы данных', async ({ request }) => {
  // Отправка данных через API
  const response = await request.post('https://api.example.com/users', {
    data: {
      username: 'newuser',
      email: 'newuser@example.com'
    }
  });

  expect(response.status()).toBe(201);

  // Проверка данных в базе данных
  const dbResponse = await queryDatabase('SELECT * FROM users WHERE username = "newuser"');
  expect(dbResponse.length).toBe(1);
  expect(dbResponse[0].email).toBe('newuser@example.com');
});

В этом примере после отправки данных через API выполняется SQL-запрос для проверки данных в базе.

Логирование и отладка запросов

Для отладки тестов важно видеть, какие запросы были отправлены и какие ответы получены. Playwright предоставляет возможность логирования всех запросов и ответов, что позволяет легко отслеживать работу API и выявлять проблемы.

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

test('Логирование запросов и ответов API', async ({ request }) => {
  request.on('beforeRequest', (request) => {
    console.log('Запрос:', request.url(), request.method(), request.headers());
  });

  request.on('response', (response) => {
    console.log('Ответ:', response.url(), response.status(), response.headers());
  });

  await request.get('https://jsonplaceholder.typicode.com/posts');
});

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

Запуск тестов с API в CI/CD

Интеграция с REST API позволяет использовать Playwright в автоматических тестах в системах CI/CD. В таких системах важно правильно настроить окружение, чтобы тесты запускались на чистом состоянии сервера и с актуальными данными. Для этого можно использовать мокирование запросов или симуляцию данных.

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

test('Мокирование API-запроса', async ({ page, request }) => {
  await request.route('**/posts', route => route.fulfill({
    status: 200,
    body: JSON.stringify([{ id: 1, title: 'Mocked Title' }]),
    headers: { 'Content-Type': 'application/json' }
  }));

  const response = await page.goto('https://jsonplaceholder.typicode.com/posts');
  const body = await response.body();
  
  expect(body).toContain('Mocked Title');
});

Здесь используется мокирование для замены реального API-запроса фиктивным ответом.

Заключение

Playwright позволяет эффективно тестировать взаимодействие с REST API, обеспечивая гибкость при настройке запросов и проверке ответов. Работая с Playwright, можно интегрировать API-тесты с остальной частью автоматизированных тестов, что повышает надежность веб-приложений.