В автоматизированном тестировании часто возникает необходимость подготовить данные для тестов, особенно если приложение использует API для обмена данными с сервером. Один из способов решения этой задачи — использование WebdriverIO для взаимодействия с API до или во время тестов. Подготовка данных через API позволяет обеспечить точность и повторяемость тестов, а также ускорить тестирование, избавляя от необходимости вручную изменять состояние приложения.
Подготовка данных через API имеет несколько ключевых преимуществ:
Для работы с API в рамках тестов на WebdriverIO можно использовать
встроенную поддержку запросов HTTP, а также подключать сторонние
библиотеки, такие как axios или node-fetch,
для более удобного выполнения запросов.
WebdriverIO поддерживает работу с API через свои собственные команды,
но чаще всего для этого используют сторонние библиотеки. Рассмотрим
пример с использованием axios.
Установите библиотеку axios:
npm install axiosЗатем настройте запросы в тестах. В WebdriverIO тестах удобно использовать асинхронные функции для выполнения запросов и ожидания результатов.
В этом примере мы создадим тест, который взаимодействует с API для получения данных о пользователе, а затем выполняет проверку, что данные отображаются корректно в UI.
const axios = require('axios');
describe('Подготовка данных через API', () => {
let userData;
before(async () => {
// Получаем данные пользователя через API
const response = await axios.get('https://api.example.com/users/1');
userData = response.data;
});
it('Данные пользователя отображаются на странице', async () => {
// Открываем страницу с данными
await browser.url('/user-profile');
// Проверяем, что имя пользователя на странице совпадает с тем, что пришло через API
const name = await $('#user-name').getText();
assert.strictEqual(name, userData.name);
// Дополнительные проверки
const email = await $('#user-email').getText();
assert.strictEqual(email, userData.email);
});
});
Многие API требуют аутентификацию перед тем, как запросить или изменить данные. Это может быть сделано с помощью токенов авторизации, JWT или других методов. Важно, чтобы WebdriverIO тесты могли работать с этими механизмами.
Пример авторизации через API с использованием JWT:
const axios = require('axios');
describe('API авторизация', () => {
let authToken;
before(async () => {
// Получаем токен авторизации через API
const response = await axios.post('https://api.example.com/login', {
username: 'user',
password: 'password123'
});
authToken = response.data.token;
});
it('Доступ к защищенному ресурсу с токеном', async () => {
// Запрос с авторизацией через Bearer token
const response = await axios.get('https://api.example.com/protected-data', {
headers: { Authorization: `Bearer ${authToken}` }
});
assert.strictEqual(response.status, 200);
assert.ok(response.data);
});
});
В реальных тестах может быть необходимо подготовить приложение для
различных состояний: например, создать нового пользователя, удалить
объект, обновить данные и т.д. API позволяет делать это с помощью
методов POST, PUT, DELETE, что
значительно упрощает тестирование.
Пример создания данных через API перед тестом:
const axios = require('axios');
describe('Создание данных через API', () => {
let newUserId;
before(async () => {
// Создаем нового пользователя через API
const response = await axios.post('https://api.example.com/users', {
name: 'Test User',
email: 'testuser@example.com'
});
newUserId = response.data.id;
});
it('Пользователь создан успешно', async () => {
// Проверяем, что пользователь был создан
const response = await axios.get(`https://api.example.com/users/${newUserId}`);
assert.strictEqual(response.data.name, 'Test User');
assert.strictEqual(response.data.email, 'testuser@example.com');
});
after(async () => {
// Удаляем созданного пользователя после теста
await axios.delete(`https://api.example.com/users/${newUserId}`);
});
});
В некоторых случаях данные в UI и данные, полученные через API, могут отличаться, что создает проблему синхронизации. В таких случаях важно удостовериться, что состояние приложения после выполнения API-запроса соответствует ожидаемому результату в UI.
Один из способов синхронизации — это добавление явных ожиданий, чтобы тесты проверяли, что данные на странице обновляются после выполнения API-запроса. Это может быть полезно в случаях, когда данные обновляются асинхронно, и нужно дождаться их появления.
Пример синхронизации UI с данными API:
describe('Синхронизация данных', () => {
it('Проверка обновления данных через API и UI', async () => {
// Открываем страницу с данными
await browser.url('/user-profile');
// Выполняем запрос к API для обновления данных
await axios.put('https://api.example.com/users/1', {
name: 'Updated User'
});
// Ждем, пока данные обновятся на странице
const updatedName = await $('#user-name').waitForExist({ timeout: 5000 });
assert.strictEqual(await $('#user-name').getText(), 'Updated User');
});
});
Работа с API часто требует корректной обработки ошибок, таких как недоступность сервера, ошибки аутентификации или неправильные данные в запросах. Важно обеспечить обработку таких случаев в тестах для предотвращения ложных срабатываний.
Пример обработки ошибок:
const axios = require('axios');
describe('Обработка ошибок API', () => {
it('Ошибка при запросе с неверными данными', async () => {
try {
await axios.post('https://api.example.com/users', {
name: '',
email: 'invalid-email'
});
} catch (error) {
assert.strictEqual(error.response.status, 400);
assert.ok(error.response.data.error);
}
});
});
Использование API в процессе тестирования помогает не только ускорить подготовку данных, но и гарантировать стабильность тестов, улучшить их повторяемость и снизить зависимость от изменений в UI.