Консольный cucumber и capybara при помощи Selenium и Hudson

Автор оригинала: Ludo van den Boom
  • Перевод
В наши дни разработчики ПО не могут прожить без их любимых тестовых фреймворков. Но вот чего разрабочики не хотят — так это обеспечивать постоянный запуск этих тестов. Также, команды разработчиков не хотят тратить время на доведение результатов теста до всех.

Появляется все больше и больше полезных приложений, библиотек и плагинов, которые частично облегчают головную боль, возникающую в ходе попыток сделать тесты полезными для всей команды. Примерами прекрасных инструментов, которые есть в нашем распоряжении, могут быть Hudson для непрерывной интеграции, Cucumber для интеграционных тестов и Selenium для автоматизированного тестирования веб-приложений в реальном браузере. Но организация совместной работы всего этого требует все больше и больше настроек и конфигураций на сборочном сервере.

Наша цель — задокументировать шаги, требуемые для преодоления встречающихся препятствий на пути к запуску полного набора тестов Cucumber со сценариями на Selenium на сборочном сервере Hudson.

Ингридиенты


Мы будем использовать следующие ингридиенты в этом топике:
  • 1 инсталляцию Debian 5.0.4 'Lenny'
  • 1 инсталляцию Xvfb
  • 1 Web-браузер (в нашем случае, iceweasel, Firefox после Debianовского ребрендинга
  • 1 приложение для Ruby on Rails 2.3.7 (Не обязательно именно такую версию, с 3.0.0 все ок — прим. переводчика)
  • 1 гем Capybara 0.3.8
  • cucumber (0.7.3) по вкусу


Мы не будем погружаться в детали создания приложения Rails, установки гемов и разработки сценариев Cucumber. У них есть свои прекрасные мануалы.

Установка необходимых пакетов



Начнем с установки пары пакетов, которые позволят нам запускать тесты в браузере без графического режима.

Виртуальный фреймбуфер при помощи Xvfb


«В X Window System, Xvfb или виртуальный X фреймбуфер — это сервер X11, который выполняет все операции в памяти, не показывая ничего на экране» — http://en.wikipedia.org/wiki/Xvfb

$ apt-get install xvfb

Web браузер


После установки Xvfb мы можем пойти дальше и установить web браузер.

$ apt-get install iceweasel

Прежде, чем мы продолжим, нам нужно сконфигурировать профиль браузера так, чтобы он не ныл по поводу закрытия вкладок или восстановления после сбоя. Если этого не сделать, набор тестов сломается или будет работать вечно.

$ cd ~/.mozilla/firefox/xxxxxxxx.default/
$ vim user.js


Теперь впишем две строчки в файл user.js:

user_pref("browser.sessionstore.enabled", false);
user_pref("browser.sessionstore.resume_from_crash", false);


Проверка дисплея


Прежде чем мы начнем запускать наши тесты мы проверим что все пакеты установлены правильно. Чтобы сделать это запустите виртуальный фреймбуфер (сессию Xvfb) на дисплее 99 с экраном 0:

$ Xvfb :99 -ac -screen 0 1024x768x16


В другом окне терминала напишите:

$ DISPLAY=:99.0 iceweasel example.org


Это запустит наш веб браузер в виртуальном фреймбуфере и откроет главную страницу example.com в этом браузере. Дальше предстоит сделать «скриншот», чтобы мы могли увидеть что происходит внутри нашего виртуального фреймбуфера.

$ xwd -root -display :99.0 -out xwdout


И посмотрим наш скриншот при помощи:
$ xwud -in xwdout


(А если вы настраиваете удаленную машину, то можно файл xwdout забрать себе и посмотреть у себя — прим. переводчика)
Видите главную страницу example.org? Значит Xvfb и iceweasel были успешно установлены и мы готовы провести несколько тестов.
image

Запуск cucumber



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

$ DISPLAY=:99.0 rake cucumber


Если все прошло хорошо, тогда мы увидим что все сценарии завершились успешно. Если успешны не все сценарии, проверьте сначала, а все ли хорошо в ситуации с нормальным графическим режимом.

Конфигурация Hudson



Теперь мы пришли к тому, чтобы попытаться со всей этой фигней взлететь. Нам нужно добавить новый сборочный шаг к задаче, которая должна запустить наш фоновый cucumber. Но прежде чем добавлять сборочный шаг, мы создадим стартовый скрипт для нашего виртуального фреймбуфера. Этот скрипт можно использовать чтобы запустить буфер перед прогоном сценариев и остановить буфер после завершения сценариев. Вы можете сохранить этот скрипт в /etc/init.d/. Убедитесь, что права установлены таким образом, что пользователь, от которого работает Hudson может выполнить его.

XVFB=/usr/bin/Xvfb
XVFBARGS="$DISPLAY -ac -screen 0 1024x768x16"
PIDFILE=/var/hudson/xvfb_${DISPLAY:1}.pid
case "$1" in
start)
echo -n "Starting virtual X frame buffer: Xvfb"
/sbin/start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $XVFB -- $XVFBARGS
echo "."
;;
stop)
echo -n "Stopping virtual X frame buffer: Xvfb"
/sbin/start-stop-daemon --stop --quiet --pidfile $PIDFILE
echo "."
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: /etc/init.d/xvfb {start|stop|restart}"
exit 1
esac
exit 0


Финальный шаг — добавить сборочный шаг типа «Execute shell» в задачу Hudson. Вы можете использовать следующий набор команд чтобы запускать Ваш cucumber.

#!/bin/bash
export DISPLAY=:99
/etc/init.d/xvfb start
rake cucumber
RESULT=$?
/etc/init.d/xvfb stop
exit $RESULT


После добавления этого сборочного шага сохраним нашу задачу и позволим Hudson собрать ее. Если все идет хорошо, сценарии cucumber теперь будут работать как часть нашего процесса непрерывной интеграции. Вы можете посмотреть страницу «Console output» сборки в Hudson для поиска причин неудачных сборок.

Заключение



Если Вы дошли до этого места в этом топике, то сейчас у Вас есть работающая фоновая инсталляция. Преимущество этой инсталляции в том, что она достаточно легковесная и легкая в настройке. Но такая настройка не подойдет Вам, если Вам нужно тестировать с несколькими разными браузерами. Для такой настройки Вам придется посмотреть в сторону виртуальных машин и подчиненных агентов Hudson.

UPD: Перенес в «Тестирование», если проявится интерес хабрасообщества, напишу как оно все у нас сделано.

Средняя зарплата в IT

113 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 5 637 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 8

    0
    Предпочитаю не писать на огурце, т.к. нравятся формальные строки rspec+capybara+machinist. Но если осуществлять BDD и работать с несведущим в данном деле заказчиком, то cucumber может быть хорошим вариантом и даже включаться в ТЗ для согласования функциональности, желаемого поведения приложения по завершению работы над ним. Спасибо за перевод.
      +2
      Огурец — дело вкуса. Просто после огурца тяжело лично мне на rspec обратно переходить, хотя приходится местами в унаследованных проектах. Родной язык он такой родной — определить в чем дело быстрее в разы.
        0
        Тут тоже палка о двух концах — родной для системы или родной для пользователя?
        Кстати предпочитаете тесты на русском или на английском под cucumber? На мой взгляд после написания всего приложения на английском русские тесты диссонируют.
        Да и если ошибка в тесте, а не в приложении, тоже неизвестно как быстрее будет найти — разобраться в том как всё транслируется из английского в руби или сразу найти ошибку в руби.
        А в общем, верно, дело вкуса и привычки.
          0
          Все тесты пишем на русском. Поскольку часто программист додумывает интерфейс, а часто и логику, именно в момент написания теста, то лишняя нагрузка на мозг — лишняя. Мы вот так привыкли — ну что уж теперь поделать.
      0
      не плохо было бы еще все это связать со spork и autotest, ну и версии староваты, перевод переводом но можно было и поправить
        0
        Если буду писать про то, как у нас — напишу актуальные версии.
          0
          я это к тому, что вы явно указали все версии, однако в начале написали что все работает и в rails 3 (пример переводчика). Новичок можен много времени убить, разбераясь почему «gem 'capybara', '0.3.8'» так безпощадно глючит в rails 3.0.8
            +1
            Новички с continious testing обычно не сталкиваются.

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

      Самое читаемое