Облачные автотесты Selenium + Ubuntu (пошаговая инструкция)

В данной публикации я расскажу о том, как подружить Linux (ubuntu server 14.04) с Selenium Server v.2.43.1, о подводных камнях и зачем мне в облаке понадобился сервер для автоматических тестов.

image

Не так давно на Хабре была опубликована статья «Автотесты – барское дело». Я считаю, что в команде, где более 2-х разработчиков работают над одним проектом — это просто необоходимая вещь. Когда я работал один, обходился без тестов. Проект писался с нуля, код я знал как свои 5 пальцев. Компания росла очень быстро — в месте с ней и количество задач. Появились новые разработчики, тут то и начались проблемы. Пишем один функционал — отваливается другой. Не подумайте, такое случалось редко, но такие ошибки стоили дорого и нужно было с этим бороться. В это время я принял решение ввести автотесты в процесс разработки, о чем ни капли не жалею.

Сейчас я решил еще больше оптимизировать процесс тестирования. Идея в том, чтобы автоматически запускать тесты при поднятии функционала на дев, продакшин. Преимущества такого подхода очевидны и о них уже писали не раз. Как минимум — это моя уверенность в том, что тесты отработали и при заливке на продакшин ничего не сломается.

Решение задачи:
Я выбрал облако (DigitalOcean), в котором можно легко расширять/клонировать VPS. Тесты запускаю в 2 потока. Для этих целей выбрал сервер — с 2гб ОЗУ, 2 ядра по 2.40GHz. Оперативной должно быть с запасом, иначе тесты будут падать из-за ее нехватки, поэтому подключил еще Swap на 1гиг.

В качестве ОС выбрал Ubuntu 14.04 (в DO сборка Ubuntu 14.04 LAMP).

LAMP нужен для панели управления, вы можете отдельно поставить php. Для запуска тестов нужен браузер (мы тестируем в Firefox), Xvfb для запуска браузера в фоновом режиме, GUI + сервер XRDP для того, чтобы удаленно подключаться к рабочему столу, Exim для отправки результатов на почту, Java + Selenium + PhpUnit + php curl — для работы тестов.

Апгрейдим систему и устанавливаем FF:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install firefox

Подключаем по надобности SWAP:

sudo dd if=/dev/zero of=/home/swap-tmp bs=1024 count=1024K
sudo mkswap /home/swap-tmp
sudo swapon /home/swap-tmp
echo "/home/swap-tmp swap swap defaults 0 0" | sudo tee -a /etc/fstab
в примере дополнили ОЗУ на 1гб.

Ставим xvfb – оболочку для запуска FF в фоновом режиме и шрифты:

sudo apt-get install xvfb
sudo apt-get install -y xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic xvfb x11-apps

По надобности ставим XFCE + Xrdp сервер для удаленного подключения и тестирования в визуальной среде:

apt-get -y install xubuntu-desktop
apt-get -y install xrdp

в /etc/xrdp/startwm.sh удаляем то, что было — пишем следующее:

#!/bin/sh

if [ -r /etc/default/locale ]; then
  . /etc/default/locale
  export LANG LANGUAGE
fi
#. /etc/X11/Xsession
startxfce4

Перезагружаем xrdp:

service xrdp restart

Теперь можно приконектится к серверу через удаленный рабочий стол.

Устанавливаем PHP + Curl:

sudo apt-get install php5
sudo apt-get install php5-curl

Ставим phpunit:

wget https://phar.phpunit.de/phpunit.phar
chmod +x phpunit.phar
mv phpunit.phar /usr/local/bin/phpunit

Устанавливаем JAVA для запуска Selenium:

apt-get install default-jdk

Качаем последнюю версию selenium server. На момент написания статьи последняя 2.43:

mkdir /var/selenium/
wget http://selenium-release.storage.googleapis.com/2.43/selenium-server-standalone-2.43.1.jar
mv selenium-server-standalone-2.43.1.jar /var/selenium/server.jar

Для отправки уведомлений ставим exim4:

sudo apt-get install exim4 exim4-config
dpkg-reconfigure exim4-config

Мне для этих целей достаточно SMTP через «Яндекс.Почту». В интернете есть множество инструкций по настройке, поэтому заострять на этом внимание не буду.

Что бы selenium работал правильно и мог запустить Firefox в фоновом режиме — выполняем комманды:

Xvnc :10 -geometry 1920x1080 -depth 24 -bs -ac -nolisten tcp > /dev/null &
export DISPLAY=:10

После этого можно запускать Selenium:

java -jar /var/selenium/server.jar

Тут-то и появилась первая проблема. Selenium зависает на строке:

04:04:29.264 INFO - Started HttpContext[/,/]

Через раз его попускало и он запускался спустя, примерно, 15 минут.
При запуске через дебаг:

java -jar /var/selenium/server.jar --debug
09:24:21.360 DEBUG [1] org.openqa.jetty.http.HttpContext - Init classloader from null, sun.misc.Launcher$AppClassLoader@356e3aaf for HttpContext[/wd,/wd]
09:24:21.361 DEBUG [1] org.openqa.jetty.util.Container - Starting org.openqa.jetty.jetty.servlet.ServletHandler@6c10fa4d
09:24:21.361 DEBUG [1] org.openqa.jetty.jetty.servlet.AbstractSessionManager - New random session seed

Видно, что тупит он на создании сессии. Как оказалось, проблема не у меня одного и решается она путем правки файла /etc/java-7-openjdk/security/java.security. Нужо заменить строку:
securerandom.source=file:/dev/urandom

На:

-Djava.security.egd=file:/dev/urandom

Сохранил, запустил заново — все ок.

Ставим Selenium на автозапуск. В /etc/rc.local дописываем (в конце файла, или перед die, если есть):

Xvnc :10 -geometry 1920x1080 -depth 24 -bs -ac -nolisten tcp > /dev/null &
export DISPLAY=:10
sleep 2s
java -jar /var/www/sao/demon/selenium/selenium-server-standalone-2.39.0.jar > /dev/null &

Теперь при запуске сервера — selenium будет стартовать автоматически.

Практически все готово. Осталось в самих тестах настроить отправку уведомлений на почту с результатами и создание скриншотов в случае падения. Для автоматического запуска тестов можно написать простенький скрипт на сокетах, который слушает порт и, получив комманду, запускает нужные тесты. Для того, чтобы тесты стартовали автоматически при заливке на дев/продакшин — делаем скрипт обертку, либо юзаем callback возможности системы контроля версий, с которой работаете.

P.S Для тех, кто использует тесты на базе Yii 1.1. Они не работают с новой версией phpunit. Я решил не переходить на старые версии.

Проблему решил следующим образом:

В bootstrap.php заменил yiit.php на yiilite.php, Yii::createWebApplication на Yii::createConsoleApplication.
В файле WebTestCase.php заменил extends CWebTestCase на extends PHPUnit_Extensions_SeleniumTestCase
и перенес с CWebTestCase весь функционал.
  • +10
  • 27.8k
  • 9
Share post

Comments 9

    0
    И все-таки. Почему облако а не VBox тот же самый? 20$ против 0$.
      0
      Присоединяюсь — только я за docker =)
        +1
        Чувствую, тут вполне уместно попиарить мой проект github.com/Codegyre/RoboCI )
        В нем уже настроен PHP, xvfb, и работают тесты с селениумом. А главное — конфигурация описывается в формате .travis.yml
        0
        VBox — значит, либо каждый отдельно должен себе настроить, и я не буду уверен в том что тесты не забыли прогнать, либо все равно приходить к тому, что нужен сервер внутри компании к которому будут поступать запросы на прогон тестов. Решающим фактором в выборе облака была еще надобность некоторые виды «тестов» запускать в любое время суток, запросы поступают от программы и значит нужна постоянная доступность такого сервера.
          0
          если Вы говорите о настройке VBox для каждого, то у Вас есть два выхода:
          1. Vagrant
          2. Docker
          И тот и другой довольно легко запускается и настраивается сам одни конфигом (Vagrantfile, Dockerfile)
          Недавно столкнулся с кривостью некоторой особенностью Vagrant-а — с тем же конфигом, который идеаьно запускал vagrant на linux, на винде сыпал ошибками, хотя разработчики говорят о кроссплатформенности
        +1
        с Selenium RC


        Зачееем?
          0
          Тесты начали писать года полтора назад. В то время выбрали Selenium в связке с phpUnit. Что Вы можете посоветовать как замену Selenium?
            +1
            Ничего. Но вы как минимум могли б использовать Selenium 2…
            Почитайте про разницу между Selenium RC и Selenium. Это два принципиально разных продукта, первый работает через яваскрипт хуки, а второй использует протокол WebDriver и общается с браузером напрямую. Насколько, я помню, вам просто надо переключиться на PHPUnit_Extensions_Selenium2TestCase, и тесты будут работать стабильнее и быстрее.
              0
              Прошу прощения, не досмотрел. Используем selenium-server-standalone-2.43.1.jar, в статье опечатка. Исправил.

        Only users with full accounts can post comments. Log in, please.