Как запустить тесты PHPUnit Selenium через ssh-соединение? - PullRequest
1 голос
/ 22 октября 2010

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

Ответы [ 3 ]

8 голосов
/ 23 октября 2010

Общая теория

Error: no display specified

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

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

Так зачем нужна такая архитектура клиент / сервер?

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

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

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

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

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

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

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

Последнее, но не менее важное:

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

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

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

0 голосов
/ 04 марта 2013

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

0 голосов
/ 24 февраля 2011

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

ssh -R 4444:localhost:4444 user@remoteserver

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

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

...