SMS и SMS коды

Одной из важных задач в автоматизированном тестировании веб-приложений является проверка функционала, связанного с отправкой и обработкой SMS-сообщений, а также верификацией через SMS коды. В большинстве современных приложений используется двухфакторная аутентификация (2FA), при которой пользователи получают одноразовый код в SMS для подтверждения своей личности. Важно, чтобы этот процесс корректно работал на всех этапах тестирования. WebdriverIO предоставляет удобные возможности для взаимодействия с таким функционалом.

Проблематика работы с SMS в автоматизированных тестах

Тестирование SMS-услуг в реальных условиях может быть сложной задачей. Для этого обычно требуется интеграция с внешними сервисами отправки SMS или виртуальными номерами. Однако стандартные инструменты, такие как WebdriverIO, не включают в себя прямую работу с SMS-сообщениями, поэтому необходимо использовать сторонние решения для симуляции или интеграции с такими сервисами.

Подходы к решению задачи

  1. Использование сторонних API для получения SMS Для автоматизации процесса получения SMS кодов часто применяются внешние API, которые предоставляют виртуальные номера телефонов. Такие сервисы, как Twilio, Nexmo, и другие, предлагают удобные интерфейсы для получения сообщений. В тестах можно подключить эти сервисы для автоматического извлечения кодов.

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

  3. Использование моков и симуляций Для некоторых приложений может быть достаточно симулировать процесс получения SMS-сообщений с помощью мок-сервисов. Это подход, при котором отправка SMS и получение кода эмулируются внутри теста, что позволяет избежать внешних зависимостей и ускоряет процесс тестирования.

Интеграция WebdriverIO с внешними сервисами

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

Пример интеграции с Twilio

  1. Установка Twilio SDK

    Первым шагом необходимо установить Twilio SDK для взаимодействия с API. Для этого выполняем команду:

    npm install twilio
  2. Создание API клиента

    Далее создаём клиент для работы с Twilio в тестах:

    const twilio = require('twilio');
    
    const client = twilio('accountSid', 'authToken');

    Важно заменить accountSid и authToken на реальные значения, полученные при регистрации в Twilio.

  3. Получение SMS сообщения

    Теперь можно написать функцию для получения последнего SMS-кода:

    async function getSmsCodeFromTwilio(phoneNumber) {
        const messages = await client.messages.list({to: phoneNumber, limit: 1});
        if (messages.length > 0) {
            return messages[0].body.match(/\d{6}/)[0]; // Извлекаем 6-значный код
        }
        return null;
    }
  4. Использование в тестах WebdriverIO

    Теперь можно интегрировать это в тест с WebdriverIO. Предположим, что при регистрации или входе в приложение на определённый номер телефона отправляется SMS с кодом. После того как страница ввела номер телефона, нужно получить код и ввести его в поле:

    describe('Регистрация через SMS', () => {
        it('должен ввести код из SMS', async () => {
            await browser.url('https://example.com/register');
    
            // Вводим номер телефона
            const phoneNumber = '+1234567890';
            await $('#phoneNumberInput').setValue(phoneNumber);
            await $('#submitButton').click();
    
            // Получаем SMS код
            const code = await getSmsCodeFromTwilio(phoneNumber);
            assert(code, 'Не удалось получить код');
    
            // Вводим код в поле
            await $('#smsCodeInput').setValue(code);
            await $('#verifyButton').click();
    
            // Проверяем, что регистрация прошла успешно
            await expect($('#successMessage')).toBeDisplayed();
        });
    });

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

Моки для симуляции получения SMS

Для ускорения тестирования можно использовать моки. Это позволяет эмулировать получение SMS без реальной отправки сообщений. Один из популярных инструментов для мокинга – это nock. С его помощью можно замокировать HTTP-запросы, имитируя ответы API.

Пример использования nock для мокинга

  1. Установка nock

    Для начала устанавливаем библиотеку:

    npm install nock
  2. Мокирование API вызова

    В тестах можно замокировать API, которое бы возвращало код, как если бы это был реальный запрос к сервису получения SMS:

    const nock = require('nock');
    
    nock('https://api.twilio.com')
        .get('/2010-04-01/Accounts/accountSid/Messages.json')
        .query({to: '+1234567890'})
        .reply(200, {
            messages: [
                {body: 'Your verification code is 123456'}
            ]
        });

    После этого можно продолжать тестирование, уверенные, что получим нужный код.

  3. Применение в тесте WebdriverIO

    Моки также интегрируются с тестами WebdriverIO точно так же, как и реальный вызов API:

    describe('Регистрация через SMS с мокированием', () => {
        it('должен ввести код из мокированного SMS', async () => {
            await browser.url('https://example.com/register');
    
            // Вводим номер телефона
            const phoneNumber = '+1234567890';
            await $('#phoneNumberInput').setValue(phoneNumber);
            await $('#submitButton').click();
    
            // Мокируем получение кода
            const code = '123456';
    
            // Вводим код в поле
            await $('#smsCodeInput').setValue(code);
            await $('#verifyButton').click();
    
            // Проверяем, что регистрация прошла успешно
            await expect($('#successMessage')).toBeDisplayed();
        });
    });

Мокирование позволяет тестировать логику ввода кодов без необходимости настраивать реальную интеграцию с внешними сервисами, что ускоряет процесс разработки и тестирования.

Заключение

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