В этой статье расскажу вам о том как автоматизировать тестирование писем и о плохом опыте фриланс тестирования. Началось все на Upwork, это как известно крупнейшая забугорная фриланс биржа с огромным количеством проектов на любой вкус и цвет и с такой же большой конкуренцией. На этой бирже я бываю редко, но фриланс проекты по тестированию здесь представлены в большом количестве, поэтому стараюсь быть активнее. С моей нулевой репутацией на Upwork очень сложно найти заказчика, поэтому я был очень рад, когда «удача» настигла меня и мне удалось взяться за работу.

Что нужно было сделать?

Это был интернет магазин по продаже сигар. В целом ничего особенного, обычный магазин, коих сотни. Моей задачей было протестировать содержимое писем, приходящих с процесса регистрации нового пользователя и процесса сброса пароля. Если быть более точным, нужно удостовериться, что каждая ссылка внутри тела письма валидна, и возвращает 200 статус если по ней пройти. Также мне нужно было проверить сценарий сброса пароля, начиная от ссылки в письме и заканчивая успешной авторизацией с новым паролем. Все это надо было выполнить с помощью Codeception.

Тестирование писем с Codeception

Какие у нас варианты?

Мне в голову пришли только 2:

  1. Самый очевидный, это использовать WebDriver. Сбросить пароль на сайте, получить письма для сброса пароля на email, затем в соседней вкладке выполнить переход на этот email и проверить полученное письмо.
  2. Использовать mail-сервер или специальную утилиту чтобы сохранить контент письма на локальном сервере, и затем предоставить доступ к этому письму в формате html, все это опять же проверить при помощи WebDriver.

У каждого подхода есть недостаток. В первом варианте, сценарий получается сложным, а значит тест будет не стабильным. В тесте придется не только генерить сброс пароля на сайте, но и авторизовываться в email клиенте, находить полученное письмо и лишь затем переходить к его проверке. Это довольно длинный и не надежный тест. Во втором варианте значительно проще получить контент письма, но потребуется дополнительная трата времени на установку и настройку mail сервера или дополнительного по. В качестве примера почитайте про MailCatcher. Также в этом случае вам придется запускать тесты и устанавливать утилиту на одной машине или потратить еще немного времени, чтобы выводить письма на отдельном домене с закрытым доступом.

Приступаем к реализации

Я выбрал второй вариант и приготовился к его реализации, но требования заказчика внезапно изменились. Аргументируя тем, что все его проекты уже используют сервис MailGun, заказчик попросил выполнить все при помощи этого инструмента. Я никогда с ним не имел дело и поэтому потратил довольно много времени на изучение. Если вкратце, то это такой сервис, позволяющий обрабатывать ваши письма пропуская их через себя, или просто отправляя их за вас, если вы не хотите заморачиваться с mail-сервером. Можно настроить хитрый роутинг писем с одновременным их преобразованием, переадресацию и еще много чего. Все это возможно благодаря богатому API который предоставляет этот сервис. Почитайте, если не слышали довольно занятный инструмент. Немного поразмыслив я изменил свои планы тестирования с WebDriver на PhpBrowser. Это даст намного больше скорости, позволит подключить модуль тестирования REST и потребует меньше ресурсов на выполнение теста.

После изучения API MailGun, я собрал примерный набросок того, как сделать тестирование писем и получить их контент. Рассмотрим сценарий сброса пароля.

После регистрации в MailGun вам будут доступны такие данные

настройки MailGunЗдесь нам понадобятся

Default SMTP Login это и есть тестовый email на который мы будем получать письма.

API Base URL это собственно адрес API для запросов

API Key понадобится для авторизации

Остальные данные в рамках этого теста мне не пригодились.

Дальше нужно зарегистрировать аккаунт с Default SMTP Login в качестве email на проекте. Чтобы сохранять письма приходящие на эту почту в MailGun, нужно настроить так называемый Route с такими правилами.

Mailgun route

Теперь можно генерировать отправку письма для сброса пароля. Обычно форма сброса пароля имеет только один инпут для ввода email или login.

Пишем код автотеста

Я пропущу код заполнения именно формы, там все очевидно. Будем считать что письмо для сброса пароля отправлено и нам нужно вытащить его контент из MailGun. Благодаря открытому API мы можем сделать запрос на API Base URL, нужно лишь сформировать правильный путь. Но контент письма хранится глубже, поэтому одним запросом мы получим урл к письму, а другим уже откроем его контент.

  1. Нас интересует адрес /events. Именно по этому адресу можно получить информацию о сохраненных сообщениях
  2. Поддерживаются дополнительные параметры для фильтрации получаемых писем, я сохранил их в переменную $params
  3. Для безопасности API Base URL закрыт по HTTP и доступ к нему можно получить используя API Key в качестве пароля и слово ‘api’ в качестве логина

Все это легче реализовать с помощью модуля REST в Codeception, я приводил ранее простой пример тестирования вебсервиса с использованием этого модуля.

Надеюсь код достаточно прост, чтобы его понять.

Получив значение ключа url, мы теперь можем получить контент письма. MailGun сохраняет его для нас в нескольких форматах, но нам больше всего подходит ‘stripped-html’. Полученный в предыдущей функции $url мы передаем в функцию ниже, а на выходе получим контент письма.

Что теперь делать с контентом письма? На самом деле все зависит от ваших требований. Мне достаточно вытянуть все ссылки из письма, и не важно где находились эти ссылки и у какого элемента.

Полученный массив ссылок, легко по нему пройти, но важно вычленить оттуда ссылку для сброса пароля. Очевидно что она будет иметь какой-то стандартный адрес, в моем случае адрес всегда содержал такую строку ‘update-password’. Да функция неправильная, но для прототипа сойдет.

Мы прошлись по каждой ссылке проверили что ни одна из них не битая и имеем на руках ссылку для сброса пароля. Теперь остается лишь пройти по ней и сбросить пароль, заполнив простую форму. А потом попробовать залогиниться с новым.

Что было дальше

Дальше я предоставил данный код заказчику, но по своей глупости я не «закрепил» сотрудничество с заказчиком, через инструменты Upwork. То есть я не был выбран официальным исполнителем, мы лишь обсудили в чате детали и мне была обещана выплата в недалеком будущем. Задача показалась мне интересной и я с головой погрузился в нее, не сильно остерегаясь подвоха.

Выводы

НИКОГДА не соглашайтесь выполнять работу без согласования проекта на портале и используйте сервисы гарантирующие выплату.  Было довольно не приятно, такая проблема во фрилансе настигла меня впервые, но зато я получил не плохой опыт в тестировании и буду рад если вам пригодится.

P.S. Я уверен что тестирование писем можно провести и другими способами, буду рад если поделитесь ими в комментариях.