Я хотел бы знать, как писать тесты PHPUnit с помощью Zend_Test и вообще с помощью PHP.






Я не использовал Zend_Test, но я написал тесты для приложений, использующих Zend_MVC и тому подобное. Самая большая часть - получить достаточное количество кода начальной загрузки в вашей тестовой настройке.
Я использую Zend_Test для полного тестирования всех контроллеров. Его довольно просто настроить, так как вам нужно только настроить файл начальной загрузки (сам файл начальной загрузки НЕ должен отправлять передний контроллер!). Мой базовый класс тестового случая выглядит так:
abstract class Controller_TestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
protected function setUp()
{
$this->bootstrap=array($this, 'appBootstrap');
Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_NonPersistent());
parent::setUp();
}
protected function tearDown()
{
Zend_Auth::getInstance()->clearIdentity();
}
protected function appBootstrap()
{
Application::setup();
}
}
где Application::setup(); выполняет все задачи по настройке, которые также настраивают реальное приложение. Тогда простой тест будет выглядеть так:
class Controller_IndexControllerTest extends Controller_TestCase
{
public function testShowist()
{
$this->dispatch('/');
$this->assertController('index');
$this->assertAction('list');
$this->assertQueryContentContains('ul li a', 'Test String');
}
}
Вот и все...
Я помещаю Controller_TestCase в свой каталог tests / Controller - это каталог, в котором расположены все тестовые примеры контроллеров. Обычно я не использую автоматическую загрузку при запуске модульных тестов, но если я провожу тесты контроллера, я использую Zend_Loader :: registerAutoload () для использования автоматической загрузки, потому что это очень ...
... сложно отслеживать зависимости при работающем MVC. Вам просто нужно убедиться, что вы следуете соглашению об именах и что Zend_Loader найдет ваши файлы (установите include_path). Для запуска своих тестов я использую CLI PHPUnit, потому что мне не нравится интеграция PHPUnit в Eclipse PDT. Его...
... на самом деле нет проблем с переключением окон для запуска тестов - особенно если вы следуете соглашению об именах PHPUnit (так же, как соглашение Zend Framework) и используете TestSuites для группировки ваших тестов. Возможно, вам стоит взглянуть на структуру тестирования, используемую, например, сам Zend Framework.
У них есть «Введение в искусство модульного тестирования» в Zend Developer Zone, который охватывает PHPUnit.
ссылка в настоящее время не работает
Я нашел статью это очень полезной. Также очень помогла документация Zend_Test. С помощью этих двух ресурсов мне удалось успешно реализовать модульное тестирование в Краткое руководство Zend Framework и написать несколько тестов для него.
Используя ZF 1.10, я помещаю код начальной загрузки в tests / bootstrap.php (в основном то, что находится в (public / index.php), до $ application-> bootstrap ().
Затем я могу запустить тест, используя
phpunit --bootstrap ../bootstrap.php PersonControllerTest.php
Кроме того, если вы используете транзакцию базы данных, было бы лучше удалить всю транзакцию, которая выполняется с помощью модульного теста, иначе ваша база данных испортится.
так что настройте
public function setUp() {
YOUR_ZEND_DB_INSTANCE::getInstance()->setUnitTestMode(true);
YOUR_ZEND_DB_INSTANCE::getInstance()->query("BEGIN");
YOUR_ZEND_DB_INSTANCE::getInstance()->getCache()->clear();
// Manually Start a Doctrine Transaction so we can roll it back
Doctrine_Manager::connection()->beginTransaction();
}
и при разрыве все, что вам нужно сделать, это откат
public function tearDown() {
// Rollback Doctrine Transactions
while (Doctrine_Manager::connection()->getTransactionLevel() > 0) {
Doctrine_Manager::connection()->rollback();
}
Doctrine_Manager::connection()->clear();
YOUR_ZEND_DB_INSTANCE::getInstance()->query("ROLLBACK");
while (YOUR_ZEND_DB_INSTANCE::getInstance()->getTransactionDepth() > 0) {
YOUR_ZEND_DB_INSTANCE::getInstance()->rollback();
}
YOUR_ZEND_DB_INSTANCE::getInstance()->setUnitTestMode(false);
}
Не могли бы вы подробнее рассказать об этом? Мне нравится ваш абстрактный класс TestCase! Куда вы положите свой Controller_TestCase? Вам нужно требовать / включать какие-либо файлы? Как провести тест? Вы используете PHPUnit через командную строку или с плагином в среде IDE? Спасибо!