Подготовка данных через API

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

Зачем нужна подготовка данных через API?

Подготовка данных через API имеет несколько ключевых преимуществ:

  1. Изолированность тестов. API предоставляет прямой доступ к данным, что позволяет полностью контролировать состояние приложения.
  2. Скорость. Запросы к API выполняются гораздо быстрее, чем загрузка данных через интерфейс.
  3. Повторяемость. Тесты можно запускать с одним и тем же набором данных каждый раз, гарантируя стабильность результатов.
  4. Гибкость. API дает возможность работать с различными состояниями приложения, не ожидая выполнения сложных действий через пользовательский интерфейс.

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

Для работы с API в рамках тестов на WebdriverIO можно использовать встроенную поддержку запросов HTTP, а также подключать сторонние библиотеки, такие как axios или node-fetch, для более удобного выполнения запросов.

Настройка WebdriverIO для работы с API

WebdriverIO поддерживает работу с API через свои собственные команды, но чаще всего для этого используют сторонние библиотеки. Рассмотрим пример с использованием axios.

  1. Установите библиотеку axios:

    npm install axios
  2. Затем настройте запросы в тестах. В WebdriverIO тестах удобно использовать асинхронные функции для выполнения запросов и ожидания результатов.

Пример взаимодействия с API

В этом примере мы создадим тест, который взаимодействует с 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 для подготовки данных

  1. Прямой доступ к данным: API предоставляет доступ к данным, которые нельзя изменить через пользовательский интерфейс, что позволяет тестировать различные сценарии с заранее подготовленными данными.
  2. Меньше зависимости от внешних факторов: тесты становятся менее подвержены изменениям в интерфейсе приложения или другим факторам, которые могут повлиять на пользовательский опыт.
  3. Лучший контроль над тестами: используя API, можно подготавливать и очищать данные тестов перед их выполнением, избегая манипуляций с UI.

Работа с аутентификацией и авторизацией

Многие 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

В некоторых случаях данные в 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

Работа с 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.