2010-10-21 4 views
1

Я использую фреймворк yii и пытаюсь запустить его юнит-тесты при подключении через ssh на сервере CentOS. Когда я бегу PHPUnit, он пытается запустить Firefox, который терпит неудачу с ошибкой «без дисплея specifiied»Как запустить тесты PHPUnit Selenium через ssh-соединение?

+0

При задании таких вопросов вам необходимо предоставить более подробную информацию. Вы пытаетесь запустить модульные тесты на своей локальной машине под управлением Linux? Если да, пытаетесь ли вы сделать это в xterm или с консоли «text»? Или вы, возможно, входите в систему для другого хоста Linux по сравнению с ssh? –

+0

Я пытаюсь сделать это через ssh на сервере CentOS только с Bash, если это вообще возможно. Я следую за Agile Development по книге Yii и использую селен на сервере. Я настраиваю локальную среду на Windows 7, но на самом деле не вижу смысла проводить тесты ни на чем, кроме производственной среды. Может, что-то другое, чем селен, должно сделать трюк? – steve76

+0

Я взял на себя смелость, чтобы отредактировать ваш вопрос для ясности, надеюсь, что вы не возражаете. –

ответ

8

Общая теория

Error: no display specified 

Чтобы понять, что сообщение об ошибке вы сначала должны понять, как Х Windowing Работа системы - это название структуры, используемой системами Linux (и других типов Unix), используемыми для отображения графических пользовательских интерфейсов.

X состоит из двух частей - есть клиент и сервер. Клиент - это программа, которая хочет нарисовать интерфейс - в вашем случае это будет Firefox. Сервер - это программа, которая делает возможным рисование. Доступны X-серверы для всех основных операционных систем. Linux и OSX обычно поставляются с одним, в Windows вам придется найти и установить один - Cygwin/X - это один из вариантов, но есть и другие.

Так почему же эта архитектура клиент/сервер нужна?

В большинстве случаев его даже не нужно. Если вам удастся запустить Linux локально, вы даже не заметите, что какая-то связь между клиентом и сервером происходит где-то - но есть.

Где X светит, хотя эта архитектура означает, что в нее встроены сетевые возможности. Вы можете запустить клиент (Firefox) на одной машине и отобразить графический интерфейс на совершенно другой машине. Вы можете запускать 10 разных клиентов на 10 разных машинах и каждый из них отображать вывод на одной машине благодаря X. Think VNC или Remote Desktop - X несколько похож, но вы можете сказать, что его на стероидах по сравнению с ними. И у X была эта способность на очень долгое время.

Всякий раз, когда вы запускаете X-клиент (программа, которая хочет отображать графический интерфейс пользователя), он ищет X-сервер. Одна из возможностей для клиента - найти переменную среды с именем DISPLAY. Я на OSX, и это то, что я вижу.

[~]> echo $DISPLAY 
/tmp/launch-ihNtDq/org.x:0 

Эта точка на моем локальном сервере X. Он может указывать на любой сервер в моей локальной сети. Когда клиент обнаружит эту переменную среды, она подключится к ней, и появится пользовательский интерфейс.

Если клиент не может найти это переменное окружение - вы получите знакомого

Error: no display specified 

Вернуться к Yii

Похож Yii имеет Selenium тестов в комплекте. PHPUnit необходимо запустить Selenium RC для управления экземпляром Firefox для запуска этих тестов. Selenium RC (или, может быть, сам Firefox) не может найти переменную среды DISPLAY. И умирает с вышеуказанной ошибкой.

Как вы решаете эту проблему?

Есть 3 варианта

1) установить Yii, PHPUnit и все их зависимости на местном уровне. Selenium отлично работает в Windows. Он не будет использовать протокол X в Windows, поэтому ни один из этих бизнес-процессов с X-клиентами и X-серверами.И вы можете запустить Yii testuite локально.

2) установите X-сервер в окно Windows. Затем включите «X Forwarding» в настройках вашего ssh-клиента (или используйте параметр командной строки -X для ssh). Когда вы это сделаете, тогда при входе в систему на этом CentOS-сервере будет отображаться переменная DISPLAY. Вы можете проверить это, набрав команду эха выше. Затем клиент X на CentOS может говорить (показывать графический интерфейс) на X-сервере на вашей машине Windows - весь трафик X туннелируется через ssh-соединение. Это, однако, означает, что вам нужен java (который встроен RC RC) и Firefox на этом CentOS-сервере. Вы можете иметь или не иметь их там.

3) использовать виртуальный фреймбуфер - например, Xvfb - сервер X, который выполняет все операции рисования в памяти, нигде не отображая выход.

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

Окончательное уточнение

Обратите внимание, что Selenium тесты только один тип тестов, которые PHPUnit могут работать. Selenium не требуется писать тесты PHPUnit, это необязательное дополнение. Но Yii testuite, очевидно, полагается на это.

Последние, но не в последнюю очередь

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

Обычно все тесты выполняются где-то в другом месте (ваша машина разработки, выделенный сервер QA, независимо от того, что у вас есть), до того, как новый код будет развернут на рабочих серверах. После всех тестов необходимо проверить, работает ли система после изменений. Не существует большого значения для их запуска в производственных системах - код не изменяется после его развертывания.

Конечно, это зависит от вас - если вы видите значение при выполнении этих тестов в производственной системе, идите прямо вперед.

0

Проще, чем вы думаете. Запустите Selenium локально на рабочем столе, убедитесь, что phpunit настроен на удаленном сервере. Затем запустите обратный SSH-туннель в своем SSH-соединении. Это зависит от вашего клиента SSH. В PuTTY есть настройка для туннелей SSH, и вы можете изменить направление, выбрав опцию remote. Обратитесь к this page. С OpenSSH из командной строки, ее сделать так:

ssh -R 4444:localhost:4444 [email protected] 

Это будет слушать на удаленном сервере, на порту 4444 и направить его на селеном сервер, работающий на локальном хосте на настольном порту 4444.

После вы сделали это, вам нужно изменить значение TEST_BASE_URL в yourproject/protected/tests/WebTestCase.php, чтобы перейти на URL-адрес удаленного сервера для вашего проекта yii.

Смежные вопросы