Интеграция HTTP клиентов

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

Зачем нужен HTTP-клиент в тестах?

Автоматизация тестирования включает не только проверку интерфейсов, но и взаимодействие с серверной стороной. Например, проверка работы аутентификации, тестирование API, получение данных о пользователях или других сущностях — всё это можно сделать с помощью HTTP-запросов. Без использования HTTP-клиента для выполнения таких запросов, тесты станут ограниченными, и будет сложно проверить всю функциональность приложения.

Популярные HTTP-клиенты для WebdriverIO

Для интеграции HTTP-клиентов с WebdriverIO существует несколько популярных решений. Самыми распространёнными являются:

  • Axios: Это один из самых популярных клиентов для выполнения HTTP-запросов. Он поддерживает все стандартные HTTP-методы (GET, POST, PUT, DELETE и другие) и имеет удобный интерфейс для работы с асинхронными запросами.
  • SuperTest: Этот клиент предназначен для тестирования RESTful API. Он предоставляет удобные методы для выполнения HTTP-запросов и проверки ответов, что делает его отличным выбором для API-тестирования.
  • Fetch: Стандартный HTTP-клиент для браузеров, доступный через глобальный объект fetch. Однако для использования его в Node.js потребуется подключение библиотеки node-fetch.

Настройка и использование HTTP-клиента с WebdriverIO

Установка зависимостей

Для начала необходимо установить необходимый HTTP-клиент. Рассмотрим установку Axios:

npm install axios

После установки можно подключить библиотеку в тестах:

const axios = require('axios');

Использование HTTP-клиента в тестах

Теперь можно выполнять HTTP-запросы в тестах с помощью установленного клиента. Пример использования Axios для выполнения GET-запроса:

describe('API Tests', () => {
  it('should fetch user data', async () => {
    const response = await axios.get('https://api.example.com/users/1');
    expect(response.status).toBe(200);
    expect(response.data).toHaveProperty('id');
  });
});

В этом примере выполняется GET-запрос по указанному URL, и затем проверяется статус ответа и наличие ожидаемого свойства в данных.

Тестирование POST-запросов

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

describe('API Tests', () => {
  it('should create a new user', async () => {
    const newUser = {
      name: 'John Doe',
      email: 'john@example.com',
    };
    
    const response = await axios.post('https://api.example.com/users', newUser);
    expect(response.status).toBe(201);
    expect(response.data).toHaveProperty('id');
  });
});

Здесь отправляется POST-запрос с данными нового пользователя. После этого проверяется статус ответа и наличие ID, который должен быть сгенерирован сервером.

Использование тестов с SuperTest

Для работы с RESTful API можно использовать SuperTest, который удобен для интеграционного тестирования. Его настройка аналогична Axios, но SuperTest имеет дополнительные удобства для работы с ответами и заголовками.

Для установки SuperTest:

npm install supertest

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

const request = require('supertest');
const app = 'https://api.example.com';

describe('API Tests', () => {
  it('should fetch user data', async () => {
    const response = await request(app)
      .get('/users/1')
      .expect('Content-Type', /json/)
      .expect(200);

    expect(response.body).toHaveProperty('id');
  });
});

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

Обработка ошибок и исключений

При работе с HTTP-клиентами важно корректно обрабатывать ошибки. Например, если запрос не удался или сервер вернул ошибку, нужно поймать исключение и правильно обработать его.

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

describe('API Tests', () => {
  it('should handle errors correctly', async () => {
    try {
      const response = await axios.get('https://api.example.com/invalid-endpoint');
    } catch (error) {
      expect(error.response.status).toBe(404);
    }
  });
});

Здесь при запросе по несуществующему адресу отлавливается ошибка, и проверяется, что статус ответа равен 404.

Интеграция HTTP-запросов с тестами WebdriverIO

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

Пример выполнения HTTP-запроса для получения токена перед тестом:

describe('Login Tests', () => {
  let token;

  beforeAll(async () => {
    const response = await axios.post('https://api.example.com/login', {
      username: 'user',
      password: 'password',
    });
    token = response.data.token;
  });

  it('should access protected page', async () => {
    await browser.url('https://example.com/protected-page');
    await browser.setCookies({
      name: 'auth_token',
      value: token,
      path: '/',
    });
    const title = await browser.getTitle();
    expect(title).toBe('Protected Page');
  });
});

В данном примере перед выполнением теста выполняется запрос на получение токена аутентификации, который затем используется для установки cookie в браузер, чтобы пройти авторизацию.

Заключение

Интеграция HTTP-клиентов в тесты с WebdriverIO открывает дополнительные возможности для комплексного тестирования приложений. Возможность взаимодействовать с серверной стороной, выполнять запросы к API и обрабатывать ответы позволяет более точно и полно тестировать приложения. Важно выбрать подходящий инструмент для работы с HTTP-запросами и корректно обрабатывать ошибки, чтобы тесты были стабильными и эффективными.