Проведя последние несколько дней за изучением документации по 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.
Ниже представлен пример класса для тестирования контроллера.
Zend_Test_PHPUnit_Db наследует PHPUnit расширение базы данных с Zend Framework специфичным кодом, который позволяет значительно
упростить написание тестов для базы данных.
Ниже приведен такой тест:
Когда Ваше приложение будет уже почти закончено, уместно будет провести функциональное тестирование.
Совместно с Zend Framework с поддержкой PHPUnit может быть использована Selenium IDE.
Существуют тесты, которые имитируют поведение конечного пользователя и предназначены для тестирования юзабилити, защищенности и производительности.
Обычный тест Selenium наследует PHPUnit_Extensions_SeleniumTestCase и выглядит примерно так:
В этой статье не затронута и малая доля всех возможностей тестирования.
Цель этой статьи показать, что Zend framework очень тесно интегрирован в свое окружения и что
эта интеграция способствует группе пользователей PHP на практике использовать технологии
«разработка через тестирование» (TDD).
Используйте эти возможности, чтобы улучшить качество своих продуктов.
Моей первой мыслью было осознание скорости, с которой взрослеет технология 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).
Используйте эти возможности, чтобы улучшить качество своих продуктов.