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

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

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

v:1.0 09.03.2010

Перевод статьи Test Driven Development with Zend Framework and 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
{     public function setUp()     {
        $this->bootstrap = array($this,'appBootstrap');         parent::setUp();
    }
    public function appBootstrap()     {
        $this->frontController->registerPlugin(new Bugapp_Plugin_Initialize('development'));     }
    public function testCallWithoutActionShouldPullFromIndexAction()
    {         $this->dispatch('/user');         $this->assertController('user');                $this->assertAction('index');
    }
    public function testIndexActionShouldContainLoginForm()
    {         $this->dispatch('/user');
        $this->assertAction('index');         $this->assertQueryCount('form#loginForm', 1);     }

    public function testValidLoginShouldGoToProfilePage()     {
        $this->request->setMethod('POST')              ->setPost(array('username' => 'foobar','password' => 'foobar'));         $this->dispatch('/user/login');         $this->assertRedirectTo('/user/view');
        $this->resetRequest()->resetResponse();         $this->request->setMethod('GET')->setPost(array());         $this->dispatch('/user/view');
        $this->assertRoute('default');         $this->assertModule('default');
        $this->assertController('user');         $this->assertAction('view');
        $this->assertNotRedirect();         $this->assertQuery('dl');         $this->assertQueryContentContains('h2','User: foobar');
    }
}

* This source code was highlighted with Source Code Highlighter.

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

class BugsTest extends Zend_Test_PHPUnit_DatabaseTestCase {
    private $_connectionMock;

    /**      * Возвращает тестовое соединение с базой данных.
     *
     * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
     */
    protected function getConnection()
    {         if($this->_connectionMock == null)         {
            $connection = Zend_Db::factory(...);             $this->_connectionMock = $this->createZendDbConnection(                 $connection, 'zfunittests');             Zend_Db_Table_Abstract::setDefaultAdapter($connection);
        }         return $this->_connectionMock;
    }

    /**
     * @return PHPUnit_Extensions_Database_DataSet_IDataSet
     */

    protected function getDataSet()     {
        return $this->createFlatXmlDataSet(dirname(__FILE__).                             '/_files/bugsSeed.xml');
    }
}
* This source code was highlighted with Source Code Highlighter.

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

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

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

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

Метки: PHP   Zend Framework   PHPUnit  

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

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

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