Protractor — инструмент для автоматизированного тестирования веб-приложений на базе Angular и других фронтенд-фреймворков. Традиционно Protractor используется для проверки взаимодействия пользователя с интерфейсом, однако в реальных проектах часто возникает необходимость совмещать UI тесты с проверкой API, чтобы гарантировать корректность данных, отображаемых на странице.
Объединение UI и API тестирования позволяет:
Для работы с API в тестах на Protractor удобно использовать axios или node-fetch. Пример установки:
npm install axios --save-dev
Импорт в тесте:
const axios = require('axios');
Создание базового клиента API:
const apiClient = axios.create({
baseURL: 'https://example.com/api',
timeout: 5000,
headers: { 'Content-Type': 'application/json' }
});
Запрос на получение списка пользователей:
async function getUsers() {
try {
const response = await apiClient.get('/users');
return response.data;
} catch (error) {
console.error('Ошибка при получении пользователей:', error);
throw error;
}
}
Создание нового пользователя через API перед UI тестом:
async function createUser(userData) {
const response = await apiClient.post('/users', userData);
return response.data;
}
Удаление данных после теста:
async function deleteUser(userId) {
await apiClient.delete(`/users/${userId}`);
}
Обычно последовательность действий выглядит следующим образом:
Пример интегрированного теста:
describe('UI + API тестирование пользователей', () => {
let testUser;
beforeAll(async () => {
testUser = await createUser({ name: 'Test User', email: 'test@example.com' });
});
it('должен отображать нового пользователя на странице', async () => {
await browser.get('/users');
const userElement = element(by.cssContainingText('.user-name', testUser.name));
expect(await userElement.isPresent()).toBe(true);
});
it('должен обновлять данные через UI и проверять через API', async () => {
const updatedName = 'Updated User';
const editButton = element(by.css(`.edit-user[data-id="${testUser.id}"]`));
await editButton.click();
const nameInput = element(by.css('input[name="name"]'));
await nameInput.clear();
await nameInput.sendKeys(updatedName);
const saveButton = element(by.css('.save-user'));
await saveButton.click();
const updatedUser = await apiClient.get(`/users/${testUser.id}`);
expect(updatedUser.data.name).toEqual(updatedName);
});
afterAll(async () => {
await deleteUser(testUser.id);
});
});
Protractor отслеживает Angular-зоны, что позволяет автоматически ожидать завершения асинхронных операций на клиенте. Однако при интеграции API тестов важно помнить:
async/await или промисы для синхронизации.Интеграция API и UI тестирования в Protractor позволяет создавать комплексные сценарии, обеспечивая высокое качество проверок и стабильность автоматизированного тестового процесса.