framework.zend.com
Stable релиз 2.0 / 1.12

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

К комментариям

Перевод статьи 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');
}
}

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');
}
}

Когда Ваше приложение будет уже почти закончено, уместно будет провести функциональное тестирование. Совместно с 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());
}
}
}

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

Лучший способ следить за обновлениями сайта это подписаться на RSS
Если информация была полезной для вас, вы можете поддержать сайт.
Комментарии:
Уважаемые пользователи. Комментарии не для того чтобы:
  1. Спрашивать почему у вас не работает код, для этого есть тема форума закрепленная за статьей.
  2. Спрашивать как реализовать ту или иную функциональность, для этого необходимо создать свою тему на форуме.

Комментарии для того чтобы: высказать свое аргументированное мнение о статье, указать какие участки вызывают непонимание, что нужно исправить/улучшить, просто сказать спасибо.

Комментарии имеют древовидную структуру.
Если вы хотите ответить на определенный комментарий - нажмите на ссылку "Ответить" возле этого комментария.

Комментарии не соответствующие этим правилам могут быть удалены. Спасибо за понимание.
Комментарии временно отключены, вы можете воспользоваться форумом.