PHPUnit. Первый PHPUnit-тест для Zend Framework

Статьи -> Программирование -> Zend Framework

PHPUnit. Первый PHPUnit-тест для Zend Framework.

v:1.0 08.04.2010

В этой статье я расскажу как максимально просто и быстро начать применять PHPUnit для тестирования приложений на Zend Framework, т.е. как написать первый тест по типу "Hello, World".
В качестве ответа на вопрос: что такое PHPUnit и для чего он нужен рекомендую эту статью PHPUnit. Часть 01 Автоматические тесты.

Подготовка

Я исхожу из того, что Zend Framework уже установлен и работает корректно. Прежде чем приступить к написанию первого теста, надо установить PHPUnit.
Процесс установки для Linux описан в официальной документации, про установку под Windows написано здесь.

Структура каталогов

Если для создания проекта Вы пользовались Zend-Tools, то необходимые каталоги и базовые файлы у Вас уже должны быть созданы. В каталоге lib, должен быть каталог tests, в котором должен быть файл phpunit.xml и каталог application с файлом bootstrap.php. Схематично это выглядит так:
project
|-- lib
      |
      |--application
      |      |
      |      |--controllers 
      |            |
      |            |--IndexController.php 
      | 
      |--tests
            |
            |--application
            |        |
            |        |--bootstrap.php
            |       
            |--phpunit.xml
Эти файлы и каталоги можно создать вручную, если их еще нет.

Конфигурация

Все настроечные параметры тестов задаются в конфигурационном файле phpunit.xml
Вот минимальный текст этого файла:
<phpunit
 bootstrap="./application/bootstrap.php" 
 >        
    
 <testsuite name="MyApp">
    <directory>./</directory>         
 </testsuite>

</phpunit>


* This source code was highlighted with Source Code Highlighter.
В конфигурации задается пусть к файлу bootstrap.php и набор тестов, см. PHPUnit. Часть 05 Организация тестов.
Сейчас у нас один набор, в который входя все тесты.

Файл bootstrap.php

Файл Bootstrap.php по своим функциям и содержанию почти полностью дублирует index.php.
Вот его содержимое:
<?php
error_reporting( E_ALL | E_STRICT );

define('BASE_PATH', realpath(dirname(__FILE__) . '/../../'));
define('APPLICATION_PATH', BASE_PATH . '/application');

set_include_path(
    '.'
    . PATH_SEPARATOR . BASE_PATH . '/library'
    . PATH_SEPARATOR . get_include_path()
);

define('APPLICATION_ENV', 'testing');

require_once 'Zend/Application.php'
require_once 'ControllerTestCase.php';


* This source code was highlighted with Source Code Highlighter.
В Bootstrap.php мы указываем пути, и подключаем файлы с нужными классами.

Файл ControllerTestCase.php

В этом файле находится абстрактный класс ControllerTestCase, от которого будут унаследованы все тесты.
Файл ControllerTestCase.php:
<?php

require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';

abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    protected $application;
    
     public function setUp()
    {     
        $this->bootstrap = array($this, 'appBootstrap');
        parent::setUp();
    }
    
    public function appBootstrap()
    {
         $this->application = new Zend_Application(APPLICATION_ENV,APPLICATION_PATH . '/configs/application.ini');
         $this->application->bootstrap();
    }    
}


* This source code was highlighted with Source Code Highlighter.
Каждое MVC приложение должно надлежащим образом инициализировать переменную $this->bootstrap.
В документации описаны три возможных способа, выше использован один из них.

Ядро тестирования готово, можно написать первый тест.

И еще раз о структуре каталогов

В документации на PHPUnit приводится рекомендуемая структура организации тестов, см. PHPUnit. Часть 05 Организация тестов. Согласно рекомендациям, дерево каталогов тестов должно повторять дерево тестируемого приложения. Поэтому, для тестирования контроллеров в каталоге application создается каталог controllers, в котором будут создаваться тесты контроллеров.
    Классы и соответственно файлы unit-тестов должны именоваться согласно правилам:
  • Наименование тестирующего класса образуется путем добавления постфикса Test к наименованию тестируемого класса. Например тестируемый класс называется Class, тестирующий - ClassTest.
  • Наименования тестирующих методов образуются путем добавления приставки test к наименованиям тестируемых методов.
Поэтому для тестирования контроллера IndexController создается класс IndexControllerTest в файле IndexControllerTest.php.

Файл IndexControllerTest.php

Этот файл находится в каталоге application/controllers/
Файл IndexControllerTest.php:
<?php

class IndexControllerTest extends ControllerTestCase 
{
    public function testIndexAction()
    {
        $this->dispatch("/index/index");
        $this->assertController("index");
        $this->assertAction("index");    
        $this->assertResponseCode(200);
    }
}


* This source code was highlighted with Source Code Highlighter.
Как видите, класс наследует ControllerTestCase.
Для тестирования метода IndexAction контроллера IndexController создается функция testIndexAction.
Строго говоря, это не тестирование функционала, а простейший тест.
Тест заключается в том, что при обработки URL "/index/index" текущим котроллером должен стать контроллер index, текущим действием - действие index. Кроме этого проверяется, что ответный код HTML-запроса: 200 (ошибок нет).
Все PHPUnit-тесты стоятся на утверждениях (assert), см. примеры.
В этом тесте проверяются утверждения: assertController, assertAction, assertResponseCode.
Для успешного выполнения теста обязательно требуется выполнение всех утверждений.

Выполнение теста

Из каталога tests выполните команду phpunit. Если все хорошо Вы увидите такой результат:
PHPUnit 3.4.11 by Sebastian Bergmann.
.
Time: 9 seconds, Memory: 12.00Mb
OK (1 test, 3 assertions)

Итак, Вы видите, что принцип написания тестов весьма прост. В следующих статьях я рассмотрю особенности PHPUnit, имеющие больший практический смысл.

Источники
При написании статьи использовались материалы Unit Testing with the Zend Framework with Zend_Test and PHPUnit.

Петрелевич Сергей
petrelevich@yandex.ru
www.SmartyIT.ru

Метки: PHP   Web   Zend Framework   PHPUnit   Тестирование  

Комментарии.

Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: <a>, <b>, <i>, <br>.

Яндекс цитирования Ðåéòèíã@Mail.ru Rambler's Top100