WebdriverIO — это мощный инструмент для автоматизации браузеров, который позволяет писать тесты для взаимодействия с веб-приложениями. Однако в некоторых случаях необходимо интегрировать тесты с внешними сервисами, для чего требуется использование HTTP-клиентов. Это важно, например, для работы с API, отправки запросов на сервер, получения данных и обработки различных состояний, которые не всегда видны в браузере. В этой статье рассмотрим, как интегрировать HTTP-клиенты с WebdriverIO для работы с API в тестах.
Автоматизация тестирования включает не только проверку интерфейсов, но и взаимодействие с серверной стороной. Например, проверка работы аутентификации, тестирование API, получение данных о пользователях или других сущностях — всё это можно сделать с помощью HTTP-запросов. Без использования HTTP-клиента для выполнения таких запросов, тесты станут ограниченными, и будет сложно проверить всю функциональность приложения.
Для интеграции HTTP-клиентов с WebdriverIO существует несколько популярных решений. Самыми распространёнными являются:
fetch. Однако для
использования его в Node.js потребуется подключение библиотеки
node-fetch.Для начала необходимо установить необходимый HTTP-клиент. Рассмотрим установку Axios:
npm install axios
После установки можно подключить библиотеку в тестах:
const axios = require('axios');
Теперь можно выполнять 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-запросами, например, при отправке данных на сервер, используется следующий код:
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, который должен быть сгенерирован сервером.
Для работы с 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. Например, перед выполнением теста нужно пройти аутентификацию через 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-запросами и корректно обрабатывать ошибки, чтобы тесты были стабильными и эффективными.