| Тестирование 2FA с Playwright и Mailosaur |
| 24.08.2026 00:00 |
|
Когда вы пишете end-to-end тесты, аутентификация часто становится первым барьером. Невозможно протестировать реальную функциональность приложения, не пройдя сначала экран логина. Но современные методы аутентификации могут усложнять автоматизацию, используя несколько факторов, которые трудно автоматизировать (в этом и заключается смысл 2FA). Обычно с этим справляются, либо отключая такие методы в тестовых окружениях, либо используя различные обходные решения. Кто-то может сказать, что это уже не настоящее e2e-тестирование. Честно говоря, это, скорее, тема для отдельной дискуссии, но критика подхода с обходом логина определённо имеет основания. Так как же правильно работать с аутентификацией? Уже много лет моим основным решением является Mailosaur. Это сервис для тестирования, который предоставляет виртуальные email-адреса и номера телефонов для автоматизации. Представьте его себе как тестовый почтовый ящик, к которому тесты получают доступ программно. Можно:
Давайте посмотрим, как это настроить. Начало работыСначала потребуется аккаунт Mailosaur. Он нужен для создания виртуальных email-адресов и номеров телефонов для тестов. После этого установите клиент Mailosaur: npm install --save-dev mailosaur В аккаунте Mailosaur вам понадобятся две вещи:
Их лучше хранить в секрете (особенно API key), поэтому рекомендуется сохранять их в переменных окружения, например в .env файле или в CI/CD пайплайне. # .env Метод 1: magic links по emailMagic links становятся всё более популярными. Их можно использовать вместо пароля, но по сути это то же самое, что и при сбросе пароля. Сервер генерирует ссылку, которая даёт доступ к определённому действию (вход или смена пароля), и отправляет её на email владельца аккаунта. Поток выглядит так:
Как видно из диаграммы выше, основная сложность в том, что в определённый момент поток отрывается от браузера. Для браузерной автоматизации это проблема. Как попасть в почтовый ящик? Здесь помогает Mailosaur. Он позволяет программно получать доступ к почтовому ящику, созданному для теста. Из него извлекается нужная информация (письмо со ссылкой), после чего тест продолжается. Вот как может выглядеть такой тест в Playwright: import { test, expect } from '@playwright/test';
Примечание: чтобы использовать переменные из .env в Playwright, нужно импортировать пакет dotenv в файл playwright.config.ts. import 'dotenv/config'; Ключевая часть здесь — метод mailosaur.messages.get(). Он автоматически ожидает поступления письма и парсит его содержимое. Ссылки доступны через message.html.links. Каждый объект ссылки содержит: {Если в письме несколько ссылок, их можно отфильтровать: const verifyLink = message.html.links.find( Метод 2: SMS-коды подтвержденияПо сути, аутентификация через SMS похожа на magic links, только вместо письма отправляется числовой код на телефон. Пользователь вводит этот код, чтобы подтвердить владение номером. Поток выглядит так:
С помощью Mailosaur можно создать виртуальный номер телефона, который будет получать SMS. После этого его можно использовать в тестах. Вот пример автоматизации такого потока: import { test, expect } from '@playwright/test';
Как и в случае с email, Mailosaur автоматически извлекает коды подтверждения из SMS. Они доступны через message.text.codes. Если кодов несколько (что бывает редко), все они будут в массиве codes. const code = message.text.codes[0].value; // e.g., "564214" Метод 3: приложения-аутентификаторы (TOTP)Приложения вроде Google Authenticator или Authy генерируют одноразовые коды на основе времени (TOTP). Эти коды меняются каждые 30 секунд и создаются на основе общего секрета. В этом процессе есть два этапа. На первом этапе приложение-аутентификатор настраивается с использованием общего секрета.
На втором этапе используется код, сгенерированный приложением, который вводится в форму входа. Затем он проверяется на сервере.
Секрет обычно представлен в виде QR-кода или строки символов при настройке. При интеграции с Mailosaur первый этап можно настроить вручную в сервисе Mailosaur.
Это позволяет взаимодействовать с аутентификатором при ручном тестировании. Но можно настроить всё и автоматически в тестах. Вот пример теста для TOTP-аутентификации: import { test, expect } from '@playwright/test';
Как видно, общий секрет извлекается из элемента на странице. Обычно такая возможность есть на страницах настройки TOTP. Если нет, можно декодировать QR-код, чтобы получить ключ.
Общие подводные камни и советыПроблемы с таймингом TOTP-кодовTOTP-коды истекают каждые 30 секунд. Если тест работает медленно или попадает на границу времени, код может устареть между генерацией и использованием. Чтобы это обработать: Задержки доставки email и SMSХотя метод messages.get() автоматически ждёт сообщение, таймаут можно настроить: const message = await mailosaur.messages.get( Очистка тестовых данныхЕсли почтовый ящик переполняется тестовыми данными, их можно очистить: test.afterEach(async () => {
Использование критериев поиска для нахождения нужных писемВместо уникальных email-адресов можно искать письма по содержимому или теме. Это особенно полезно, когда несколько тестов отправляют письма на один адрес: const message = await mailosaur.messages.get(serverId, {
Для SMS обычно доступно ограниченное количество виртуальных номеров, поэтому используйте критерии поиска: const message = await mailosaur.messages.get(serverId, {
Надеюсь, это поможет! Если материал оказался полезным, поделитесь им с теми, кто сталкивается с проблемами тестирования аутентификации. Также можно найти меня в Twitter или LinkedIn, где я делюсь дополнительными советами и приёмами тестирования. |