Настраиваем PHPUnit тесты в Zend Framework 1.10
В документации к Zend Framework есть описание как создавать PHPUnit тесты для контроллеров и для баз данных. Но, к сожалению они не объясняют как настроить приложения для выполнения Unit тестов.
В данной статье приведены шаги по настройке Unit тестов:
1. Установка phpunit
2. Установка xdebug
3. Настройка phpunit.xml
4. Создание TestHelper.php для инициализации приложения
5. Написание и выполнение простого теста
В первую очередь для выполнения тестов нам понадобится phpunit, который можео установить из PEAR пакета PHPUnit.
-
$ pear channel-discover pear.phpunit.de
-
$ pear config-set preferred_state alpha
-
$ pear install phpunit/PHPUnit
-
or you may wish to install all the optional supporting packages:
-
$ nano /usr/local/php5/etc/php.ini // memory_limit = 32M; change this to at least 32M
-
// if you get a permission denied error on the ZF community server, send an email to fw-servers mail list
-
$ pear install --alldeps phpunit/PHPUnit
Следующим шагом установим xdebug. Xdebug мы будем использовать для проверки покрытие кода тестами.
-
$ pecl install xdebug-beta
Теперь откройте ваш php.ini файл и пропишите загрузку xdebug.
-
zend_extension=/usr/lib/..../..../php5/20060613/xdebug.so
Далее мы создадим структуру директорий для наших тестов, такую как изображена на следующем скриншоте:
Директории log и report предназначены для записи отчетов тестирования.
Директория My/Search отражает структуру в каталоге mylib, такая структура директорий делает понятным предназанчения каждого теста относительно файлов приложения.
Для тестирования контроллеров можно было бы добавить диркторию application/controllers и application/models для моделей приложения.
Следующим шагом создадим конфигурационный файл phpunit.xml.
-
<phpunit bootstrap="./TestHelper.php" colors="true">
-
<testsuite name="My Test Suite">
-
<directory>./</directory>
-
</testsuite>
-
-
<filter>
-
<whitelist>
-
<directory suffix=".php">../library/</directory>
-
<directory suffix=".php">../mylib/</directory>
-
<directory suffix=".php">../application/</directory>
-
<exclude>
-
<directory suffix=".phtml">../application/</directory>
-
</exclude>
-
</whitelist>
-
</filter>
-
-
<logging>
-
<log type="coverage-html" target="./log/report" charset="UTF-8"
-
yui="true" highlight="true"
-
lowUpperBound="50" highLowerBound="80"/>
-
<log type="testdox-html" target="./log/testdox.html" />
-
</logging>
-
</phpunit>
Атрибутом bootstrap мы указываем путь к файлу TestHelper.php, который загружает ZF приложение.
Остальные параметры конфигурации вы можете прочитать в официальном руководстве к phpunit.xml.
И последнее, что нам надо сделать это создать файл TestHelper.php, который будет выполнять изначальный bootstrap приложения.
-
<?php
-
-
// Define path to application directory
-
defined('APPLICATION_PATH')
-
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
-
-
// Define application environment
-
define('APPLICATION_ENV', 'testing');
-
-
// Ensure library/ is on include_path
-
set_include_path(implode(PATH_SEPARATOR, array(
-
realpath(APPLICATION_PATH . '/../library'),
-
realpath(APPLICATION_PATH . '/../mylib'),
-
get_include_path(),
-
)));
-
-
/** Zend_Application */
-
require_once 'Zend/Application.php';
-
-
// Create application, bootstrap, and run
-
$application = new Zend_Application(
-
APPLICATION_ENV,
-
APPLICATION_PATH . '/configs/application.ini'
-
);
-
$application->bootstrap();
Для тестирования контроллеров приложения, код создания объекта $application и вызов $application->bootstrap() необходимо перенести в метод setUp самих тестов, таким образом каждый тест будет выполнятся в своем окружении. Пример функции setUp:
-
abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
-
{
-
public $application;
-
-
public function setUp()
-
{
-
$this->application = new Zend_Application(
-
APPLICATION_ENV,
-
APPLICATION_PATH . '/configs/application.ini'
-
);
-
-
$this->bootstrap = array($this, 'appBootstrap');
-
parent::setUp();
-
}
-
-
public function appBootstrap()
-
{
-
$this->application->bootstrap();
-
}
-
}
И так, теперь напишем наш первый тест.
Я тестировал работу Sphinx Search, поэтому для запуска моего теста вам потребуется установка Sphinx Search и запуск его на порту 9312.
Я предлагаю вам самим написать свой первый тест.
Моего Unit тест spinx search выглядит следующим образом:
-
<?php
-
class SphinxTest extends PHPUnit_Framework_TestCase
-
{
-
public function testConnectEstablished()
-
{
-
$sphinx = My_Search_Sphinx::factory('127.0.0.1', 9312);
-
$this->assertFalse($sphinx->IsConnectError());
-
}
-
-
public function testConnectionException()
-
{
-
$this->setExpectedException("Exception");
-
-
// set bad port number to throw connection exception
-
$sphinx = My_Search_Sphinx::factory('127.0.0.1', 99312);
-
}
-
}
Чтоб запустить тесты на выполнение, необходимо выполнить команду phpunit
-
$phpunit
В соответствии с конфигурационным файлом phpunit.xml, эта команда выполнит все тесты в каталоге ./tests и создаст отчет о покрытии кода тестами в каталоге ./log/reports.
Отчет о покрытии кода тестами видно на следующем скриншоте:

Вопросы?


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