Настройка Netbeans для yii с поддержкой xdebug, тестов phpunit и selenium

После прочтения книги Agile Web Application Development with Yii 1.1 and PHP5 захотелось рассказать о настройке NetBeans для работы с yii, включая поддержку unit-тестов + тесты через selenium.

Selenium позволяет проводить тесты, почти полностью эмулируя действия через браузер: кликать по ссылкам, вводить текст.

Это очень мощно! Имеются:

Сайт будет располагаться в /var/www/yii/www, а yii в /var/www/yii-lib/yii

Действия на сервере Создаём папку, где будет располагаться сайт.

mkdir -p /var/www/yii/{logs,tmp,www}
chown www-data.www-data /var/www/yii/{tmp,www}
chmod 0700 /var/www/yii/{tmp,www}

Создаём конфиг для php5-fpm. Файл: /etc/php5/fpm/pool.d/yii.conf

[yii]
listen = /var/run/php5-fpm/yii.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

user = www-data
group = www-data

pm = dynamic
pm.max_children = 50
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 5
pm.max_requests = 500

pm.status_path = /status
ping.path = /ping
ping.response = pong
; Это значение стоит увеличить при активном использовании xdebug, иначе скрипт отвалится. Также нужно соответственно изменить в nginx параметр fastcgi_read_timeout.
request_terminate_timeout = 5m
request_slowlog_timeout = 2s
slowlog = /var/www/yii/logs/php-fpm.slow.log
chdir = /var/www/yii/www
catch_workers_output = yes

env[TMP] = /var/www/yii/tmp
env[TMPDIR] = /var/www/yii/tmp
env[TEMP] = /var/www/yii/tmp

php_flag[display_errors] = on
php_admin_value[error_log] = /var/www/yii/logs/fpm-php.log
php_admin_flag[log_errors] = on

php_admin_value[open_basedir] = /var/www/yii/www:/var/www/yii/tmp:/var/www/yii/yii
php_admin_value[upload_tmp_dir] = /var/www/yii/tmp
php_admin_value[session.save_path] = /var/www/yii/tmp

Конфигурация сайта для nginx. Файл: /etc/nginx/sites-available/yii

upstream yii {
  server unix:/var/run/php5-fpm/yii.sock;
}
server {
  listen   80;
  server_name yii.local;
  server_tokens off;
  server_name_in_redirect  off;

  access_log /var/www/yii/logs/nginx.access.log gzip;
  error_log /var/www/yii/logs/nginx.error.log warn;

  # ОБЯЗАТЕЛЬНО нужно отключить gzip, потому что тесты selenium не будет работать
  gzip off;
  charset utf-8;
  client_max_body_size 1m;
  fastcgi_intercept_errors on;

  # Это значение стоит увеличить при активном использовании xdebug, иначе скрипт отвалится. Также нужно соответственно изменить в php5-fpm параметр request_terminate_timeout.
  fastcgi_read_timeout 600;
  root /var/www/yii/www;
  index index.php index.html index.htm;

  location ~ /.ht
  {
    deny all;
  }

  location ~ /(.git|protected)/ {
    deny all;
  }

  location ~ /(assets|css)/ {
    expires 7d;
  }

  location / {
    try_files $uri $uri/ @php;
  }

  location ~ \.php$ {
    try_files $uri @php;
    fastcgi_pass yii;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/yii/www$fastcgi_script_name;
    include fastcgi_params;
  }

  location @php {
    fastcgi_pass yii;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/yii/www/index.php;
    fastcgi_param SCRIPT_NAME /index.php;
    fastcgi_param QUERY_STRING q=$uri&$args;
    include fastcgi_params;
  }
}

Включаем сайт, путём линкования в папку sites-enabled.

Скачивание yii

# Скачиваем исходники yii
cd /usr/local/src
wget http://yii.googlecode.com/files/yii-1.1.4.r2429.tar.gz
mkdir -p /var/www/yii-lib/
tar xvfz yii-1.1.4.r2429.tar.gz -C /var/www/yii-lib/
cd /var/www/yii-lib/
# Делаем линк на текущую версию
ln -s yii-1.1.4.r2429 yii
# Меняем пользователя и группу
chown -R www-data.www-data /var/www/yii-lib/
# Создаём веб-приложение
/var/www/yii-lib/yii/framework/yiic webapp /var/www/yii/www/
Create a Web application under '/var/www/yii/www'? [Yes|No] Y
# Меняем пользователя и группу
chown -R www-data.www-data /var/www/yii/www

Устанавливаем php5-xdebug

aptitude install php5-xdebug

Настраиваем xdebug для работы отладки /etc/php5/fpm/conf.d/xdebug.ini

zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so

xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
# Ip-адрес компьютера разработчика
xdebug.remote_host=192.168.0.2
xdebug.remote_log="/var/log/xdebug.log"
# По-умолчанию, используется 9000 порт, но он у меня уже занят.
xdebug.remote_port=9009
xdebug.idekey=netbeans-xdebug

Рестартим fpm и apache:

invoke-rc.d php5-fpm restart
invoke-rc.d apache2 restart

Настройка компьютера разработчика Я монтирую всю папку /var/www к себе. Это очень удобно, т.к. не нужно скачивать все файлы с сайта. Нужен пакет sshfs.

sudo mkdir -p /mnt/www
sudo chown ВЫ.ВЫ /mnt/www
sshfs www-data@192.168.0.3:/var/www /mnt/www

Прописываем в /etc/hosts

192.168.0.3 yii.local

Phpunit

Устанавливаем phpunit

Selenium

Скачиваем Selenium RC. Распаковываем и запускаем:

java -jar selenium/selenium-server-1.0.3/selenium-server.jar

Netbeans

Устанавливаем NetBeans (в моём случае это NetBeans 7.0m2). Ставим плагин Selenium Module for PHP (Tools → Plugins → Available Plugins).

Немного настраиваем (Tools → Options):

Php → General Ставим порт 9009 для xdebug и снимаем галку с опции Stop at First Line.

phpunit

Php → Unit Testing Указываем путь до phpunit: /usr/bin/phpunit

phpunit

Miscellaneous → Files Исключаем файл yiilite.php, чтобы при автокомплите подсказки не дублировались ^(yiilite.php|CVS|

phpunit

Создаём новый проект:

phpunit

Указываем пути, название проект. Meta-файлы сохраняем в другой директории.

phpunit

Указываем url проекта: http://yii.local/

phpunit

Теперь вызываем настройки проекта.

Указываем директорию тестов (File → Project properties → Sources → Test Folder)

phpunit

Задаём маппинг пути (File → Project properties → Run configuration → Advanced). Тут не видно, но указано, что /var/www доступно в /mnt/www.

phpunit

Указываем директорию с yii: /mnt/www/yii-lib/yii (File → Project properties → PHP Include Path)

phpunit

Папки, которые будут игнорироваться: /mnt/www/yii/www/protected/runtime (File → Project properties → Ignored Folders → Add Folder).

phpunit

Настройка phpunit (File → Project properties → PhpUnit).

phpunit

Открываем файлы index.php, index-test.php, protected/tests/bootstrap.php и заменяем /yii-1.1.4.r2429/ на /yii/

Удалить из protected/tests/phpunit.xml тест под IE

<browser name="Internet Explorer" browser="*iexplore" />

Меняем константу TEST_BASE_URL в файле protected/tests/WebTestCase.php:

define('TEST_BASE_URL','http://yii.local/index-test.php');

Правим тест protected/tests/functional/SiteTest.php (баг):

Заменяем $this->clickAndWait(’link=Logout’); на $this->clickAndWait(’link=Logout (demo)’);

Теперь можно запустить тест Selenium

phpunit

Появиться окошко выбора папки с этими тестами, указываем: /mnt/www/yii/www/protected/tests/functional

phpunit

Будут всплывать окошки с firefox’ом и в конце концов появиться результат:

phpunit

Phpunit

Можно запускать phpunit тесты прямо с сервера или с рабочего компьютера, но придётся установить php и все используемые библиотеки (php5-pgsql, php5-mysql, etc). Рассмотрим 2-ой вариант. На компьютере разработчика установить phpunit и php5: Для phpunit теста можно установить свои параметры для yii в protected/config/test.php поверх стандартных (например, коннект к базе). Напишем простейший тест для проверки авторизации. Файл protected/tests/unit/AuthTest.php:

< ?php
class AuthTest extends CTestCase
{
  public function testAuth()
  {
    $login = new LoginForm;
    $login->username = 'demo';
    $login->password = 'demo';
    $this->assertTrue($login->login());
  }
}

Для выполнения теста в Netbeans нажимаем Alt+F6. При этом выполняться все тесты: и phpunit и selenium.

phpunit

Можно выбрать AuthTest.php и нажать Shift+F6, тогда тестирование выполниться только из этого файла. Также можно выполнять phpunit тесты прямо с сервера (aptitude install phpunit):

cd /var/www/yii/www/protected/tests/
phpunit unit/AuthTest.php
PHPUnit 3.4.14 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 7.25Mb

OK (1 test, 1 assertion)

Также можно написать тесты, не использую базу данных, подменив некоторые таблицы fixtures - ассоциативным массивом, имитирующим записи в таблице.

Дебагинг кода Тесты написаны, теперь можно дебажить код. Открываем index.php, на любой строке добавляем breakpoint (Ctrl+F8). Запускаем дебагинг (Ctrl+F5). Теперь можно “пройтись” по коду клавишами F7 (Step Into) и F8 (Step Over). Это очень помогает понять как же работает сам yii, а так же “качественно” дебажить код, видя текущие переменные, watches, Call stack.

Советую всем прочитать книгу Agile Web Application Development with Yii1.1 and PHP5 всем, кто работает с yii. Книга поднимет уровень и в правильном написании кода для yii, и английского языка.