Разработка через тестирование с Zend Framework и PHPUnit

Автор оригинала: Srirangan
  • Перевод
Проведя последние несколько дней за изучением документации по Zend Framework, я был приятно удивлен новым функционалом, который был добавлен в последнюю версию этого каркаса Web-приложений.
Моей первой мыслью было осознание скорости, с которой взрослеет технология PHP.
Легкость совместного использования Zend Framework и PHPUnit — это, на мой взгляд, одно из наиболее значительных достижений.


Я уже достаточно поработал с PHPUnit, чтобы понять, насколько это мощный, настраиваемый и простой в
использовании инструмент (он принадлежит семейству xUnit тестировочных framework'ов), однако наиболее примечательно то, что и Zend Framework полностью готов к работе с PHPUnit (по моему мнению такая готовность позволят выбирать Zend Framework для любого PHP проекта, но это тема для другого поста...).

Вот, что мы знаем о PHPUnit: Вы можете не только модульно тестировать свои PHP классы, но и создавать зависимости между тестами, использовать dataProvider'ы для увеличения размера выборки входных параметров тестов, тестировать исключения и ошибки.

Кроме того, PHPUnit позволяет делать следующее: организовывать тесты, обеспечивать тестирование базы данных, выполнить двойное тестирование для покрытия исходного кода, и, более того, может быть использовано для быстрого документирования.
В заключении отмечу, что PHPUnit очень хорошо работает совместно с Selenium, Apache Ant, Apache Maven, Phing, Atlassian Bamboo, CruiseControl и другими средами.

Мне остается только сослаться на документацию по PHPUnit и можно вернуться к основной теме статьи.

По структуре каталогов проекта Zend Framework хорошо видно, что авторы Zend Framework всегда большое внимание уделяли методологии «разработка через тестирование». В официальной документации, справочных материалах, литературе особо подчеркивается место каталога для тестов в общей структуре проекта. Можно говорить о «Zend пути развития PHP» («Zend way of PHP development»).
При более детальном изучении, в пакете Zend_Test мы найдем классы Zend_Test_PHPUnit и Zend_Test_PHPUnit_Db, которые унаследованы от PHPUnit.

Zend_Test_PHPUnit предоставляет классы, которые могут использоваться для тестирования MVC-классов framework'а.
В наиболее типичном случае класс для тестирования контроллера будет наследником Zend_Test_PHPUnit_ControllerTestCase.
Ниже представлен пример класса для тестирования контроллера.

class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase<br>{<br>    public function setUp()<br>    {<br>        $this->bootstrap = array($this, 'appBootstrap');<br>        parent::setUp();<br>    }<br><br>    public function appBootstrap()<br>    {<br>        $this->frontController<br>             ->registerPlugin( new Bugapp_Plugin_Initialize('development'));<br>    }<br><br>    public function testCallWithoutActionShouldPullFromIndexAction()<br>    {<br>        $this->dispatch('/user');<br>        $this->assertController( 'user');<br>        $this->assertAction('index');<br>    }<br><br>    public function testIndexActionShouldContainLoginForm()<br>    {<br>        $this->dispatch( '/user');<br>        $this->assertAction('index');<br>        $this->assertQueryCount('form#loginForm', 1);<br>    }<br><br>    public function testValidLoginShouldGoToProfilePage()<br>    {<br>        $this->request->setMethod('POST')<br>             ->setPost(array(<br>                 'username' => 'foobar',<br>                 'password' => 'foobar'<br>             ));<br>        $this->dispatch('/user/login');<br>        $this->assertRedirectTo('/user/view');<br><br>        $this->resetRequest()<br>             ->resetResponse();<br><br>        $this->request->setMethod('GET')<br>             ->setPost(array());<br>        $this->dispatch('/user/view');<br>        $this->assertRoute('default');<br>        $this->assertModule('default');<br>        $this->assertController('user');<br>        $this->assertAction('view');<br>        $this->assertNotRedirect();<br>        $this->assertQuery('dl');<br>        $this->assertQueryContentContains('h2', 'User: foobar');<br>    }<br>}<br><br>* This source code was highlighted with Source Code Highlighter.

Zend_Test_PHPUnit_Db наследует PHPUnit расширение базы данных с Zend Framework специфичным кодом, который позволяет значительно
упростить написание тестов для базы данных.
Ниже приведен такой тест:

class BugsTest extends Zend_Test_PHPUnit_DatabaseTestCase<br>{<br>    private $_connectionMock;<br><br>    /**<br>     * Возвращает тестовое соединение с базой данных.<br>     *<br>     * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection<br>     */<br>    protected function getConnection()<br>    {<br>         if($this->_connectionMock == null) {<br>            $connection = Zend_Db::factory(...);<br>            $this->_connectionMock = $this->createZendDbConnection(<br>                $connection, 'zfunittests'<br>            );<br>            Zend_Db_Table_Abstract::setDefaultAdapter($connection);<br>        }<br>         return $this->_connectionMock;<br>    }<br><br>    /**<br>     * @return PHPUnit_Extensions_Database_DataSet_IDataSet<br>     */<br>    protected function getDataSet()<br>    {<br>        return $this->createFlatXmlDataSet(<br>            dirname(__FILE__) . '/_files/bugsSeed.xml'<br>        );<br>    }<br>}<br><br>* This source code was highlighted with Source Code Highlighter.

Когда Ваше приложение будет уже почти закончено, уместно будет провести функциональное тестирование.
Совместно с Zend Framework с поддержкой PHPUnit может быть использована Selenium IDE.
Существуют тесты, которые имитируют поведение конечного пользователя и предназначены для тестирования юзабилити, защищенности и производительности.

Обычный тест Selenium наследует PHPUnit_Extensions_SeleniumTestCase и выглядит примерно так:

<?php<br>require_once 'PHPUnit/Extensions/SeleniumTestCase.php';<br>class seleniumExampleTest extends PHPUnit_Extensions_SeleniumTestCase<br>{<br> protected function setUp()<br> {<br>     $this->setBrowser('*firefox');<br>     $this->setBrowserUrl('http://www.google.com.au/');<br> }<br> function testMyTestCase()<br> {<br>     $this->open('http://www.google.com.au/');<br>     $this->type('q', 'zend framework');<br>     $this->click('btnG');<br>     $this->waitForPageToLoad('30000');<br>     try {<br>         $this->assertTrue($this->isTextPresent('framework.zend.com/'));<br>     } catch (PHPUnit_Framework_AssertionFailedError $e) {<br>         array_push($this->verificationErrors, $e->toString());<br>     }<br> }<br>}<br><br>* This source code was highlighted with Source Code Highlighter.

В этой статье не затронута и малая доля всех возможностей тестирования.
Цель этой статьи показать, что Zend framework очень тесно интегрирован в свое окружения и что
эта интеграция способствует группе пользователей PHP на практике использовать технологии
«разработка через тестирование» (TDD).
Используйте эти возможности, чтобы улучшить качество своих продуктов.
Поделиться публикацией

Похожие публикации

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

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

    0
    Что-то я не понял, так PHPUnit надо устанавливать отдельно или нет, чтобы воспользоваться этими классами для тестов?
      0
      В версии 1.9.5 PHPUnit уже есть, классы находятся в каталоге:
      Zend\ZendServer\share\ZendFramework\library\Zend\Test
        +1
        Вы не путаете? У меня хоть и не ZendServer, но ZF 1.10.3 и там, в указанной папке, только классы-«адаптеры» для работы с основным фреймворком PHPUnit.
          0
          Да, я действительно ошибся. PHPUnit не входит в состав ZF
        +1
        PHPUnit надо отдельно ставить через PEAR (самое удобное) или самим качать и подключать.
      0
      Написали плохо про такие хорошие вещи. Человеку, который никогда не сталкивался с PHPUnit, и не понятно как даже начать.
        0
        Согласен, статья не самая удачная. Но и новичок может извлечь из нее массу полезного.
        Я, например, узнал про xUnit, PHPUnit и Selenium IDE.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое