В этом уроке я покажу вам как создавать тесты на примере приложения
TodoIt.
Настройка PHPUnit
Всё, что вам надо так это папка /tests. Инструмент ZF cli создаст файл phpunit.xml, но он будет пустым! Вот, что нужно туда добавить:
<phpunit colors="true" bootstrap="./TestHelper.php">
<testsuite name="TodoIt Test Suite">
<directory>./</directory>
</testsuite>
<filter>
<whitelist>
<directory suffix=".php">../library/</directory>
<directory suffix=".php">../application/</directory>
<exclude>
<directory suffix=".phtml">../application/</directory>
</exclude>
</whitelist>
</filter>
<logging>
<log highlowerbound="80" lowupperbound="50" highlight="true" yui="true" charset="UTF-8" target="./log/report" type="coverage-html"></log>
</logging>
</phpunit>
Этот файл используется для конфигурации phpunit. Поскольку это XML, то его очень просто прочитать. Так же нам надо создать TestHelper.php, который будет использоваться как bootstrap. В общем, содержание данного файла очень схоже с index.php. TestHelper.php выглядит следующим образом:
<?php
error_reporting(E_ALL | E_STRICT);
date_default_timezone_set('Europe/London');
define('APPLICATION_ENV', 'unittesting');
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
$root = realpath(dirname(__FILE__) . '/../');
$library = $root . '/library';
$models = $root . '/application/models';
$path = array(
$library,
$models,
get_include_path()
);
set_include_path(implode(PATH_SEPARATOR, $path));
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
// чистим за собой
unset($root, $library, $models, $path);
Теперь мы готовы к написанию тестов.
Класс тестов
Расположите тесты в каталоге tests/application/controllers для того, чтобы быстро их найти. (Тесты для моделей в tests/application/models и т.д.). Начнём с тестирования AuthController::indexAction(). В первую очередь проверим наличие формы.
Сам AuthControllerTest будет находиться в tests/application/controllers/AuthControllerTest.php:
<?php
if (!defined("PHPUnit_MAIN_METHOD")) {
define("PHPUnit_MAIN_METHOD", "AuthControllerTest::main");
}
require_once 'PHPUnit/Framework/TestCase.php';
/**
* @group Controllers
*/
class AuthControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
public static function main()
{
$suite = new PHPUnit_Framework_TestSuite(get_class($this));
$result = PHPUnit_TextUI_TestRunner::run($suite);
}
public function setUp()
{
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$this->bootstrap = $application;
return parent::setUp();
}
public function tearDown()
{
/* Tear Down Routine */
}
public function testLoginDisplaysAForm()
{
$this->dispatch('/auth/index');
$this->assertQueryContentContains('h1', 'Login');
$this->assertQuery('form#login'); // id of form
}
}
В первую очередь мы должны убедиться в том, что можем запускать PHPUnit тесты из командной строки:
phpunit tests\application\controllers\AuthControllerTest.php
Мы можем это делать благодаря константе PHPUnit_MAIN_METHOD статического метода AuthControllerTest::main(). Инструмент phpunit cli запустит метод, который активирует тесты.
Методы setUp() и tearDown() запускаются до и после теста. Так как мы наследуем от Zend_Test_PHPUnit_ControllerTestCase то можем использовать специальные методы. Их мы используем в setUp().
Каждый тест должен начинаться с ключевого слова test:
public function testLoginDisplaysAForm()
{
$this->dispatch('/auth/index');
$this->assertResponseCode(200);
$this->assertQueryContentContains('h1', 'Login');
$this->assertQuery('form#login'); // id формы
}
Начнём мы с вывода dispatch(). Метод assertQuery предназначен для проверки того, что находится в объекте response. Он использует DOM пути для того, чтобы достучаться до элемента. Вызов assertQueryContentContains позволяет нам установить присутствует текст с тегом H1 на странице или нет.
Теперь вы знаете как тестировать ваши приложения.