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

в 8:04, , рубрики: php, phpunit, selenium, tdd, тестирование, тестирование веб-приложений

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

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 весь функционал.

Автор: ganjar

Источник

Поделиться

* - обязательные к заполнению поля