Настраиваем PHPUnit тесты в Zend Framework 1.10

В документации к Zend Framework есть описание как создавать PHPUnit тесты для контроллеров и для баз данных. Но, к сожалению они не объясняют как настроить приложения для выполнения Unit тестов.
В данной статье приведены шаги по настройке Unit тестов:
1. Установка phpunit
2. Установка xdebug
3. Настройка phpunit.xml
4. Создание TestHelper.php для инициализации приложения
5. Написание и выполнение простого теста

В первую очередь для выполнения тестов нам понадобится phpunit, который можео установить из PEAR пакета PHPUnit.

CODE:
  1. $ pear channel-discover pear.phpunit.de
  2. $ pear config-set preferred_state alpha
  3. $ pear install phpunit/PHPUnit
  4. or you may wish to install all the optional supporting packages:
  5. $ nano /usr/local/php5/etc/php.ini  // memory_limit = 32M; change this to at least 32M
  6. // if you get a permission denied error on the ZF community server, send an email to fw-servers mail list
  7. $ pear install --alldeps  phpunit/PHPUnit

Следующим шагом установим xdebug. Xdebug мы будем использовать для проверки покрытие кода тестами.

CODE:
  1. $ pecl install xdebug-beta

Теперь откройте ваш php.ini файл и пропишите загрузку xdebug.

CODE:
  1. zend_extension=/usr/lib/..../..../php5/20060613/xdebug.so


Далее мы создадим структуру директорий для наших тестов, такую как изображена на следующем скриншоте:

Test directory structure

Директории log и report предназначены для записи отчетов тестирования.
Директория My/Search отражает структуру в каталоге mylib, такая структура директорий делает понятным предназанчения каждого теста относительно файлов приложения.

Для тестирования контроллеров можно было бы добавить диркторию application/controllers и application/models для моделей приложения.

Следующим шагом создадим конфигурационный файл phpunit.xml.

CODE:
  1. <phpunit bootstrap="./TestHelper.php" colors="true">
  2. <testsuite name="My Test Suite">
  3. <directory>./</directory>
  4. </testsuite>
  5.  
  6. <filter>
  7. <whitelist>
  8. <directory suffix=".php">../library/</directory>
  9. <directory suffix=".php">../mylib/</directory>
  10. <directory suffix=".php">../application/</directory>
  11. <exclude>
  12. <directory suffix=".phtml">../application/</directory>
  13. </exclude>
  14. </whitelist>
  15. </filter>
  16.  
  17. <logging>
  18. <log type="coverage-html" target="./log/report" charset="UTF-8"
  19. yui="true" highlight="true"
  20. lowUpperBound="50" highLowerBound="80"/>
  21. <log type="testdox-html" target="./log/testdox.html" />
  22. </logging>
  23. </phpunit>

Атрибутом bootstrap мы указываем путь к файлу TestHelper.php, который загружает ZF приложение.
Остальные параметры конфигурации вы можете прочитать в официальном руководстве к phpunit.xml.

И последнее, что нам надо сделать это создать файл TestHelper.php, который будет выполнять изначальный bootstrap приложения.

CODE:
  1. <?php
  2.  
  3. // Define path to application directory
  4. defined('APPLICATION_PATH')
  5. || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
  6.  
  7. // Define application environment
  8. define('APPLICATION_ENV', 'testing');
  9.  
  10. // Ensure library/ is on include_path
  11. set_include_path(implode(PATH_SEPARATOR, array(
  12. realpath(APPLICATION_PATH . '/../library'),
  13. realpath(APPLICATION_PATH . '/../mylib'),
  14. get_include_path(),
  15. )));
  16.  
  17. /** Zend_Application */
  18. require_once 'Zend/Application.php';
  19.  
  20. // Create application, bootstrap, and run
  21. $application = new Zend_Application(
  22. APPLICATION_ENV,
  23. APPLICATION_PATH . '/configs/application.ini'
  24. );
  25. $application->bootstrap();

Для тестирования контроллеров приложения, код создания объекта $application и вызов $application->bootstrap() необходимо перенести в метод setUp самих тестов, таким образом каждый тест будет выполнятся в своем окружении. Пример функции setUp:

CODE:
  1. abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
  2. {
  3.     public $application;
  4.  
  5.     public function setUp()
  6.     {
  7.         $this->application = new Zend_Application(
  8.             APPLICATION_ENV,
  9.             APPLICATION_PATH . '/configs/application.ini'
  10.         );
  11.  
  12.         $this->bootstrap = array($this, 'appBootstrap');
  13.         parent::setUp();
  14.     }
  15.  
  16.     public function appBootstrap()
  17.     {
  18.         $this->application->bootstrap();
  19.     }
  20. }

И так, теперь напишем наш первый тест.
Я тестировал работу Sphinx Search, поэтому для запуска моего теста вам потребуется установка Sphinx Search и запуск его на порту 9312.
Я предлагаю вам самим написать свой первый тест.
Моего Unit тест spinx search выглядит следующим образом:

CODE:
  1. <?php
  2. class SphinxTest extends PHPUnit_Framework_TestCase
  3. {
  4.     public function testConnectEstablished()
  5.     {
  6.         $sphinx = My_Search_Sphinx::factory('127.0.0.1', 9312);
  7.         $this->assertFalse($sphinx->IsConnectError());
  8.     }
  9.  
  10.     public function testConnectionException()
  11.     {
  12.         $this->setExpectedException("Exception");
  13.  
  14.         // set bad port number to throw connection exception
  15.         $sphinx = My_Search_Sphinx::factory('127.0.0.1', 99312);
  16.     }
  17. }

Чтоб запустить тесты на выполнение, необходимо выполнить команду phpunit

CODE:
  1. $phpunit

В соответствии с конфигурационным файлом phpunit.xml, эта команда выполнит все тесты в каталоге ./tests и создаст отчет о покрытии кода тестами в каталоге ./log/reports.

Отчет о покрытии кода тестами видно на следующем скриншоте:
Xdebug code coverage

Вопросы?

  1. Oleg Lobach says:

    Почему использовали файл TestHelper? Почему бы не воспользоваться сгененрированным утилитой zf файл bootstrap.php? Содержимое, конечно, у них фактически одинаковое. Но на мой взгляд лучше воспользоваться стандартным названием. К тому же этот файл и является, по сути, загрузчиком.

  2. Все правильно bootstrap.php логичное и правльное имя для загрузчика, но TestHelper.php можно тоже считать стандартным загрузчиком именно для тестов.
    Все таки он используется самим Zend-ом для тестирования фреймворка.

    • Oleg Lobach says:

      Я последнее время стал использовать bootstrap.php - уже создается при создании нового проекта и логичнее название.

  1. [...] Для создания юнит-тестов Вам необходимо произвести установку PhpUnit и xDebug. Использование xDebug позволяет производить генерацию отчетов по тестированию, с отображением информации об покрытие исходного кода тестами. Я не буду подробно останаливаться на процессе установки. В интернете достаточно много примеров установки и настройки. Например вот этот краткий мануал [...]

Leave a Reply