суббота, 25 августа 2012 г.

Как я устанавливал phpUnit для работы с Yii-фреймворком под WAMP на Windows XP

Начитавшись в умных книжках о пользе тестирования, решил посмотреть на практике, что же это такое. Под PHP очень популярен phpUnit, который позволяет выполнять как модульное, так и функциональное тестирование ПО. Ну а так как я недавно занялся изучением Yii-фреймворка, то заодно решил посмтреть, как этот phpUnit будет работать из-под Yii.. В общем, выкачал исходники phpUnit версии 3.6.12 с гитхаба, настроил в phpUnit.bat путь для php.exe, в php.ini добавил путь к каталога phpUnit в параметр include_path. Запускаю батник phpUnit.bat - получаю кучу сообщений об отсутствии тех или иных php-файлов. Посмотрел в исходниках: действительно, файлы подключаются, а сами они отсутствуют. Загуглил - оказывается, сам phpUnit имеет модульную структуру, и различные модули нужно дополнительно скачивать и помещать в разные каталоги внутрь базового каталога phpUnit. Накачал 8 дополнительных модулей, и после их распаковки в нужные места, а также правки некоторых исходных файлов (некоторые файлы подключались по 2 раза), phpUnit худо-бедно, вроде бы, стал запускаться.


Параллельно решил проблему корректного запуска php из консоли в Denwer'е (прописал полный путь к каталогу, в котором хранятся php-шные расширения, в extension_dir и zend_extension файла php.ini), а также установил openssl-библиотеку под Windows.
Для запуска функциональных тестов нужен Selenium. Выкачал Selenium standalone server версии 2.25.0 в виде отдельного jar-файла. Для его запуска создал отдельный bat-файл с единственной строкой:
===
  java -jar selenium-server-standalone-2.25.0.jar
===
Проверил - сервер стартует, что есть хорошо.
Далее перешел уже к Yii. В каталоге /protected/tests/functional создал файл SiteTest.php, в котором содержится единственный класс с одним методом:
===
class SiteTest extends WebTestCase {
    public function testIndex()  {
        $this->open('');
        $this->assertTextPresent('Welcome');
    }
}
==
то есть, тест открывает главную страницу сайта ('/') и проверяет после её загрузки наличие в контенте страницы слова "Welcome".Так как сайт создан на базе демо-примера, то на главной странице этот текст присутствует, то есть, тест должен проходить успешно.

В файле /protected/test/phpunit.xml заменил значение параметра colors c "false" на "true" (в этом случае в консоли при удачном прохождении тестов success-надпись выводится на приятном, радующем глаз, зеленом фоне, а в случае непрохождения тестов - на пугающем красном. Кроме того, отключил тут же бразуер Internet Explorer, оставив только строку о наличии Firefox'а (первым я практически не пользуюсь):
===
   
===
В метод setUp() класса WebTestCase была добавлена строка, устанавливающая таймаут для ожидания загрузки страницы:
===
        $this->setTimeout(5);                   
===
,то есть, устанавливаем максимальное время ожидания в 5 секунд.

При попытке запустить только что созданный класс с функциональным тестом
===
  phpUnit functional/sitetest.php
===
обнаружились две неприятные вещи: во-первых, не сработал параметр colors, то есть, отправленные в консоль escape-последовательности для установки цвета фона никак этой самой консолью Windows XP не воспринимались, а выдавались на выход в чистом виде без интерпретации. Во-вторых, почему-то вываливались warnung-и php следующего вида:
===
PHP Warning:  include(SiteTest: Firefox.php): failed to open stream: No such fil
e or directory in D:\webroot\home\yii.loc\www\framework\YiiBase.php on line 423
===
Опять пришлось жестоко гуглить. По поводу решения первой проблемы - корректной интепретации Escape-последовательности в консоли - попробовал добавить строку
==
device=%SystemRoot%\system32\ansi.sys
==
в Config.nt системного каталога Windows, но это не помогло. Зато удалось найти утилиту AnsiCon какого-то умельца, которая позволяет перехватить вывод в консоль и корректно обрабатывать Escape-последовательности. В общем, после её установки проблема с отображением цветов в консоли Windows XP была решена.
По поводу устранения warning'ов тоже что только в этом самом Интернете не предлагают: от установки игнорирования предупреждений путем простановки символа '@' перед "опасной" командой в php-файлах до полного отключения вывода ошибок через error_reporting(). Понятно, что все это не очень кошерно. В итоге нашел вариант, который неожиданно сработал: нужно полностью удалить строку из файла /protected/test/phpunit.xml, а указание на загрузку требуемого браузера перенести в метод setUp() класса 
WebTestCase следующим образом:
==
      $this->setBrowser('*firefox');
==
После этих манипуляций результат запуска тестов принял вот такой вот приятный вид:


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




4 комментария:

  1. спасибо за ansicon не знал про нее

    ОтветитьУдалить
  2. Не за что ) Приятно, что мои заметки кому-то приносят пользу.

    ОтветитьУдалить
  3. приветствую...
    а как с Вами связаться можно? спасибо

    ОтветитьУдалить
    Ответы
    1. Здравствуйте. Пишите мне в ICQ - 217861888, jabber - tvolf@jabber.ru, ну или в skype - там я "sktvolf" )

      Удалить