И, конечно, довольно часто социальные сети банят наших тестовых пользователей, потому что считают их вовсе не тестовыми, а «подозрительными». В данной статье я расскажу, как бороться с банами Instagram и почему приходится это делать.
Суть проблемы
Итак, давайте разбираться по порядку. Начнем с того, что у нас есть сервис, который нам надо покрыть UI-тестами. И на нем есть некий функционал, который зависит от каких-либо социальных сетей. Например, у нас есть возможность авторизоваться на сайте через Instagram. Как покрыть такой функционал тестами?
На первый взгляд все просто. Мы создаем юзера на Instagram и прописываем его email и пароль в тесте (в специально созданном для этого месте):
class InstagramUsers:
EMAIL = "some_email@example.com"
PASS = "secret"
Далее пишем тест, который находит необходимую иконку и кликает на нее.
Запуская тест в браузере, само собой, мы запускаем «чистую» сессию. Это значит, что никакой авторизации ни на одном из сайтов у нас нет (нет соответствующих кук). То же самое касается нативного приложения: поднимая эмулятор или запуская приложение «честно», мы не должны быть авторизованы ни на одном сервисе.
Тест делает следующее. Он открывает нужный экран, находит иконку социальной сети и кликает на нее. Начинается процесс авторизации на Instagram. В нужном окошке мы вводим email и пароль нашего аккаунта (пример для web):
Соответственно, тест авторизуется и далее идет проверка взаимодействия нашего сервиса с Instagram. Мы видим желаемый статус теста «success» и радуемся — все в порядке.
После этого мы добавляем тест в CI и начинаем его запускать по расписанию. И через несколько дней или даже часов тест начинает падать. Открываем скриншот с ошибкой и видим следующее:
Instagram забанил нашего пользователя и тест перестал работать… На первый взгляд единственное, что можно с этим сделать — создать новый аккаунт в Instagram. Но тогда теряется суть автоматизации тестирования. :)
Для данной проблемы есть два решения.
Первое решение
Мы можем сохранять куки, полученные от Instagram, между запусками тестов. И авторизовываться только в необходимом случае. Правда тут я вижу несколько проблем.
Во-первых, если у нас много тестов, нам рано или поздно захочется их распараллелить, чтобы процесс тестирования проходил быстрее. В данном случае придется решать проблему параллельного доступа к данным. Когда expire date у авторизационной куки закончится, нам надо как-то гарантировать, что два или более тестов не попробуют авторизоваться в Instagram одновременно из параллельных потоков.
Во-вторых, при подходе с «предустановленной» авторизацией мы не проверим полный процесс взаимодействия с соцсетью от авторизации там до, например, авторизации на нашем сервисе. Как мы можем гарантировать, что сервис работает, если наши автотесты проверяют только половину кейзов?
Второе решение
Собственно, ради чего я сел писать статью… Мы можем авторизовываться на Instagram через Facebook. Странно звучит, верно? Сейчас я расскажу подробнее.
По какой-то причине Instagram не банит аккаунты, которые то и дело авторизовываются через Facebook вместо формы авторизации. Честно, я не знаю почему так происходит, я наткнулся на эту особенность от безысходности, пытаясь решить вопрос с баном аккаунтов. И решил поделиться с вами.
Итак, последовательность действий следующая. Мы создаем пользователя на Facebook. Далее мы создаем пользователя Instagram, сразу привязанного к пользователю Facebook. В тестах прописываем только доступы к пользователю Facebook.
Сам тест надо научить логиниться в Instagram через Facebook. Тут сложностей возникнуть не должно.
Итог
Я не люблю воркэраунды. Чем проще подход, который мы применяем в тестировании, тем он честнее. Соответственно, тем спокойнее можно спать по ночам. Но, к сожалению, иногда приходится «выкручиваться».
В отличие от Instagram, у Facebook есть возможность честно создавать тестовых пользователей, которых не банят, когда их используешь в автотестах.
Я очень надеюсь, что однажды все крупные сервисы будут иметь подобный API. Еще больше я надеюсь, что если ребята из Instagram увидят этот материал, они не просто исправят эту особенность, а сделают адекватный способ получения тестовых аккаунтов для автоматизированного тестирования.