Общая теория
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, что бы у вас ни было), прежде чем новый код будет развернут на рабочих серверах.Ведь смысл тестов - убедиться, что система работает после внесенных изменений.Запускать их в производственных системах не имеет особой ценности - код не меняется после его развертывания.
Конечно, решать вам - если вы видите ценность в выполнении этих тестов в производственной системе, перейдитепрямо вперед.