Как запустить тесты PHPUnit Selenium через ssh-соединение?

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


person steve76    schedule 21.10.2010    source источник
comment
Вы должны дать гораздо больше деталей, задавая такие вопросы. Вы пытаетесь запустить модульные тесты на своем локальном компьютере под управлением Linux? Если да, то пытаетесь ли вы сделать это в xterm или из текстовой консоли? Или вы, возможно, входите на какой-то другой хост Linux через ssh?   -  person Anti Veeranna    schedule 22.10.2010
comment
Я пытаюсь сделать это через ssh на сервере CentOS, используя только Bash, если это вообще возможно. Я слежу за книгой Agile Development on Yii и использую селен на сервере. Я настраиваю локальную среду в Windows 7, но на самом деле не вижу смысла запускать тесты на чем-либо, кроме производственной среды. Может быть, что-то еще, кроме селена, должно помочь?   -  person steve76    schedule 23.10.2010
comment
Я позволил себе отредактировать ваш вопрос для ясности, надеюсь, вы не возражаете.   -  person Anti Veeranna    schedule 23.10.2010


Ответы (3)


Общая теория

Error: no display specified

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

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

Так зачем вообще нужна эта клиент-серверная архитектура?

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

Отличительной чертой X является то, что эта архитектура означает, что сетевые возможности встроены прямо в нее. Вы можете запустить клиент (Firefox) на одном компьютере и отобразить графический интерфейс на совершенно другом компьютере. Вы можете запустить 10 разных клиентов на 10 разных машинах, и все они будут отображать вывод на одной машине благодаря X. Подумайте о VNC или удаленном рабочем столе — 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 локально.

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

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

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

Последнее уточнение

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

И последнее, но не менее важное

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

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

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

person Anti Veeranna    schedule 23.10.2010

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

ssh -R 4444:localhost:4444 user@remoteserver

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

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

person deltaray    schedule 24.02.2011

Самый простой способ запустить тест графического интерфейса с другого компьютера с агентом на клиенте Windows — использовать «psexec» (http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx).

person Zile Rehman    schedule 04.03.2013