Я использую инфраструктуру yii и пытаюсь запустить ее модульные тесты при подключении через ssh на сервере CentOS. Когда я запускаю phpunit, он пытается запустить Firefox, который терпит неудачу с ошибкой «не указан дисплей».
Как запустить тесты PHPUnit Selenium через ssh-соединение?
Ответы (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) обычно не выполняются в производственных системах, потому что есть вероятность, что тестовые данные останутся в вашей производственной базе данных. Кроме того, получение хороших результатов тестирования означает максимальную изоляцию от внешних факторов — содержимое вашей производственной базы данных будет постоянно меняться, и это может повлиять на ваши тесты.
Обычно все тесты будут выполняться где-то еще (ваш компьютер для разработки, выделенный сервер контроля качества и т. д.), прежде чем новый код будет развернут на рабочих серверах. Ведь смысл тестов в том, чтобы убедиться, что система работает после изменений. Их запуск в производственных системах не имеет особого смысла — код не меняется после развертывания.
Конечно - решать вам - если вы видите ценность в проведении этих тестов на производственной системе, продолжайте.
Это проще, чем вы думаете. Запустите 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. проект.
Самый простой способ запустить тест графического интерфейса с другого компьютера с агентом на клиенте Windows — использовать «psexec» (http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx).