Как использовать PHPUnit с Zend Framework?

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


person Community    schedule 15.09.2008    source источник


Ответы (6)


Я использую 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');
    }
}

Это все...

person Stefan Gehrig    schedule 16.09.2008
comment
Не могли бы вы рассказать об этом немного подробнее? Мне нравится ваш абстрактный класс TestCase! Куда вы поместите свой Controller_TestCase? Вам нужно требовать/включать какие-либо файлы? Как вы проводите тест? Вы используете PHPUnit через командную строку или с плагином в IDE? Спасибо! - person Andrew; 17.03.2009
comment
Я поместил Controller_TestCase в каталог test/Controller — это каталог, в котором находятся все тестовые примеры контроллера. Обычно я не использую автоматическую загрузку при запуске модульных тестов, но если я выполняю тесты контроллера, я использую Zend_Loader::registerAutoload() для использования автозагрузки, потому что это очень... - person Stefan Gehrig; 17.03.2009
comment
... сложно отслеживать зависимости при работающем MVC. Вам просто нужно убедиться, что вы следуете соглашению об именах и что Zend_Loader найдет ваши файлы (установите include_path). Для запуска тестов я использую интерфейс командной строки PHPUnit, потому что мне не нравится интеграция PHPUnit в Eclipse PDT. Его... - person Stefan Gehrig; 17.03.2009
comment
... на самом деле нет проблем с переключением окон для запуска тестов, особенно если вы следуете соглашению об именах PHPUnit (тому же, что и соглашение Zend Framework) и используете TestSuites для группировки ваших тестов. Возможно, вам следует взглянуть на структуру тестирования, используемую, например. сам Zend Framework. - person Stefan Gehrig; 17.03.2009

У них есть «Введение к искусству модульного тестирования" в Zend Developer Zone, посвященном PHPUnit.

person isuldor    schedule 08.10.2008
comment
ссылка в настоящее время не работает - person thanksd; 19.01.2016

Я нашел эту статью очень полезной. . Также очень помогла документация Zend_Test. С помощью этих двух ресурсов мне удалось успешно реализовать модульное тестирование в руководстве по быстрому запуску Zend Framework и написать для него несколько тестов.

person Josef Sábl    schedule 21.02.2009

Используя ZF 1.10, я поместил некоторый загрузочный код в тесты/bootstrap.php (в основном то, что находится в (public/index.php), до $application->bootstrap().

Затем я могу запустить тест, используя

phpunit --bootstrap ../bootstrap.php  PersonControllerTest.php 
person Alex    schedule 08.03.2010

Я не использовал Zend_Test, но написал тесты для приложений, использующих Zend_MVC и тому подобное. Самая большая часть — получить достаточно вашего кода начальной загрузки в вашей тестовой настройке.

person Sam Corder    schedule 15.09.2008

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

так что настрой

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

}
person KdPurvesh    schedule 18.04.2011