Тестируем функционал из-под разных IP
Привет всем!
Сегодня я хочу поделится одной из возможностью тестирования функционала веб приложения из под разных IP адресов. Так как в топике много букв (и даже картинки есть!), решила я сделать содержание с навигацией.
Содержание
- Предисловие
- Формулировка задачи
- Поиски и фрагменты решений
- От теории к практики
- Техническая комплектация решения
- Настройка окружения для работы с приложением
- Запуск приложения
- Литература
Предисловие
Несколько недель назад ко мне в скайп постучался один таинственный незнакомец, и спросил меня совета, каким способом можно проверить со стороны пользовательского интерфейса то, что пользователь после
Формулировка задачи
Тест кейс по его высказываниям я набросала следующий
Название: Блокировка входа в систему по IP после неверно введенных данных
- Открываем в браузере страницу входа в систему
- Вводим логин
- Вводим неверный пароль
- Нажимаем кнопку входа
- Проверяем, что на странице отображается ошибка о неверно введенном логине/пароле
- Повторяем действия со второго по пятый шаг еще 2 раза
- Проверяем, что на странице отображается ошибка о превышении неудачных попыток входа в систему
- Меняем IP адрес
- Открываем в браузере страницу входа в систему
- Вводим логин
- Вводим верный пароль
- Нажимаем кнопку входа
- Проверяем, что мы успешно вошли в систему
В распоряжении у меня небыло пользовательского интерфейса, единственно, что я знала, что форма аутентификации в приложении стандартная: канал шифрованный на базе HTTPS, поле ввода логина, поле ввода пароля и собственно кнопочка войти.
Поиски и фрагменты решений
После определения задачи и неуспешного поиска готовых решений мне стало ясно, что для взаимодействия с интерфейсом можно взять Selenium Webdriver (который мне больше знаком, чем другие подобные решения), который, кроме всего прочего, может помочь закрыть вопросы с возможным изменением DOM модели после загрузки странички или в результате взаимодействия с UI (посредством JavaScript’а например).
В результате поиска средств по смене IP для тестирования веб приложения я остановилась на решении под названием TOR. По сути этот инструмент решает вопросы сохранение анонимности пользователей в сети за счет того, что запрос от клиента к серверу проходит через сеть проксирующих узлов в результате оставляя наш реальный IP невидимым для конечного сервера. Для более наглядного восприятия я постаралась это изобразить на рисунке ниже:
В теории, каждый новый запрос может пойти через другие мостовые узлы (relay), но на практике я этого так и не увидела. Проверяла я таким образом: выполняла запрос за определением своего внешнего IP адреса к разным веб ресурсам, и все они показывали мне один и тот же TOR’овский IP адрес, полученный в начале. Может быть переключение между мостовыми узлами (relay) срабатывает в аварийном случае, например, когда мостовой узел (relay) не отвечает, например из рисунка выше, если б узел в Германии упал, и Украина пересоединилась с США, как я показала на рисунке ниже:
Названия стран на моих рисунках — это лишь условности, которые подчеркивают, что сервера (узлы) могут находится в любом уголке нашей планеты.
От теории к практики
Реализовывать решение по тест кейсу я не стала, так как думаю, что многие знакомы с API Selenium Webdriver’а, а если нет, то существует много классных статей на эту тему, что не составит большого труда найти то, что вам будет по душе. Из задачи таинственного незнакомца, описанной в начале топика, я взяла лишь интересный для себя кусочек (так как мой ответ незнаю на решение его проблемы, его устроил быстрей, чем я даже ожидала ...). Этот сладкий кусочек относится к автоматизации взаимодействия с браузером от имени другого хоста (компьютера). В результате я написала приложение с консольным интерфейсом. Все, что приложение умеет делать, это посещать разные источники по HTTP/HTTPS, переданные в него в качестве аргумента. Если будет желание к приложению приделать хвост (образно), то исходники есть в открытом доступе. Выкачать исходники приложения можно с помощью команды:
git clone [email protected]:irinkav/anonymous-lover.git. Финальную версию своего решения я изобразила следующим образом:
Техническая комплектация решения
Написала приложение на следующих технологиях:
- Apache Maven (maven.apache.org) — для придания формы приложению (помогает в сборке, управлению зависимостями ...)
- Selenium Webdriver (docs.seleniumhq.org/projects/webdriver) — для взаимодействия с веб страничками при помощью реального браузера
- Jsoup (jsoup.org) — наследие, которое осталось в коде, и довольно неплохо себя там чувствует. Использовала его для выполнения запросов за контентом для быстрого получения информации о своем внешнем IP. Это решение гораздо легче Selenium Webdriver’а из-за того, что никаких браузеров не нужно подымать, а всего лишь строить запрос (GET/POST...) к веб серверу за контентом, и работать с DOM моделью контента при помощи удобного API на базе CSS selector’ов...
- commons-exec (commons.apache.org/proper/commons-exec) — для запуска внешних программ. Я запускаю консольный TOR Socks прокси сервер с помощью этой библиотеки. Почему выбрала ее? Потому что она умеет порождать дочерний процесс от основного (процесса приложения) и управлять его жизненным циклом. Например, по завершению основного процесса тушатся все его подпроцессы порожденные им (с помощью ShutdownHookProcessDestroyer хука). Это нужно мне для того, чтоб по каждому новому запуску приложения стартовал TOR Socks прокси сервер как дочерний процесс, цеплял IP, и я его могла использовать для серфинга просторов интернета. О консольном TOR Socks прокси сервере поговорю немного и ниже в статье
- commons-cli (commons.apache.org/proper/commons-cli) — для упрощения работы с приходящими аргументами из командной строки
- консольный TOR Socks прокси сервер (www.torproject.org/index.html.en) — собственно для проксирования траффика между браузером и веб сервером. Использую Torproject реализацию TOR клиента.
Свое приложение проверяла на двух платформах: Linux и Windows и, конечно же, у меня все работало ;-)
Настройка окружения для работы с приложением
Для настройки окружение на работу через TOR сеть с помощью моей программки нужно:
- Скачать и установить Tor Browser Bundle (www.torproject.org/...oad/download-easy.html.en). Он подается в разном виде, то есть у него сборки есть под разные платформы Windows/Mac/Linux.
- Скачать и установить Java SE 7+ (www.oracle.com/...k7-downloads-1880260.html). Я проверяла приложение на 7 версии, поэтому за младшие версии сказать ничего не могу, собственно, как и за старшие
- Скачать и установить Apache Maven 3+ (maven.apache.org/download.cgi)
Запуск приложения
Для того, чтоб запустить программу нам нужно найти место, куда мы установили Tor Browser Bundle, и скопировать полные пути (желательно) к исполняемому файлу Tor\tor.exe (Tor/tor в случае с Linux, и, подозреваю, на Mac’е также...) и к директории Data. Они нам пригодятся на следующем шаге.
- tor.exe — собственно консольный TOR Socks прокси сервер
- Data — директория, где TOR Socks прокси сервер хранит свои конфигурации
Итак,
- Заходим в директории с программой
- Запускаем командную строку (консоль, терминал, cmd...)
- Выполняем в директории команду на сборку приложения: mvn clean install
- Из target/anonymous-lover-1.0-dist.zip копируем архив куда душе угодно (почему так я назвала приложение, напишу в конце статьи, дабы суть чище держать)
- Распаковываем архив anonymous-lover-1.0-dist.zip
- Заходим в распакованных архив
- Выполняем из командной строки (в моем примере пусть будет такая команда):
java -jar anonymous-lover-1.0.jar --url 'https://dou.ua/forums/topic/9914/' --use-proxy --check-ip --tor-proxy-path 'c:\_tools\torBrowser\Tor\tor.exe' --tor-proxy-data-directory-path 'C:\_tools\torBrowser\Data'
, где- anonymous-lover-1.0.jar — исполняемый Java архив
- —url — страничка, которую мы хотим посетить. Результат странички сохраняется в директорию output корневой директории программы
- —use-proxy — сделать посещение безопасным (в теории для этого был разработан TOR), то есть использовать режим проксирования траффика с помощью TOR сети
- —check-ip — проверить IP и записать его в файл для потомков (шутка). Файл ложится в директорию output корневой директории программы. Если не хотите проверять внешний IP, то просто опускайте этот аргумент при общении с приложением
- —tor-proxy-path — путь к файлу запуска TOR Socks прокси сервера
- —tor-proxy-data-directory-path — путь к файлу конфигурации TOR Socks прокси сервера
В команде подразумевалось, что браузер Firefox был установлен в известное для Selenium Webdriver’а место. Однако если это не так, то всегда можно воспользоваться еще одним аргументом: —firefox-binary-path — указывает на путь к файлу запуска Firefox браузера. Например, значением этого аргумента может быть: c:\_tools\firefox\firefox.exe.
Также нужно иметь ввиду, что по умолчанию TOR Socks прокси сервер открывает и слушает Socks порт под номером 9150, но это можно изменить правкой в файл конфигурации в Data/Tor/torrc-defaults в строку с SocksPort 9150. После изменения может понадобится дать моему приложению понять, на каком порте крутится (слушает) прокси. Сделать это можно с помощью аргумента —proxy-port — порт TOR Socks прокси сервера (SocksPort параметр из Data/Tor/torrc-defaults).
Другую полезную информацию по TOR Socks прокси серверу можно черпнуть по ссылке: www.torproject.org/docs/tor-manual.html.en.
PS: Приложение назвала anonymous-lover, так как дома скучно что-то писать без изюминки. А тут, вроде как, и из названия понятно, чем приложение является для страничек.
Вообщем-то на этом и окончилась моя игра с TOR’ом.
Мне было бы интересно узнать из комментариев к топику, есть ли любой другой способ сделать тоже самое, и чем это могло бы быть лучше/хуже предложенного мной способа в контексте тестирования веб приложений.
Спасибо за внимание.
Литература
За время решения проблемы пользовалась следующими источниками:
- docs.seleniumhq.org/projects/webdriver — здесь разнообразная документация на API Selenium Webdriver’а
- www.guru99.com/...mparison-selenium-rc.html — дружелюбная статья по сравнению WebDriver и Selenium RC решений
- aosabook.org/en/selenium.html — здесь черпнула знаний по поводу внутренней кухни Selenium WebDriver
- en.wikipedia.org/...i/Tor_(anonymity_network — обрела понимание того, зачем и как устроена TOR сеть
- www.torproject.org/...hort-user-manual_en.xhtml — здесь посмотрела, как работает TOR Socks прокси сервер в приближении к Torproject реализации
- www.torproject.org/...s/hidden-services.html.en — здесь наглядно показан процесс внутренней луковой маршрутизации в TOR сети
- www.torproject.org/docs/tor-manual.html.en — документация по тому, как можно использовать консольный TOR Socks прокси сервер
- blog.sanaulla.info/...che-commons-exec-library — этот туториал по использованию Apache Commons Exec библиотеки мне больше понравился, чем официальный — commons.apache.org/...ommons-exec/tutorial.html
- Примеры использования библиотеки Apache Commons Exec:
- commons.apache.org/...er/commons-cli/usage.html — этот туториал по использованию Apache Commons CLI библиотеки
- Остальное, как и все предыдущее, собственно, — через Google
28 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів