Configurar PHPUnit y Zend Framework

In: zend framework

13 may 2010

ruedas dentadas 150x150 Configurar PHPUnit y Zend Framework

Las pruebas unitarias son un sistema interesante para los desarrolladores, facilitando el trabajo. Es común el proceso de modificar, extender o mejorar la aplicación; y también es común que estos cambios produzcan que ciertas funcionalidades dejen de funcionar. Igual que es fácil olvidar el código que se ha hecho hace dos meses, también es fácil olvidar todos los sitios donde se llama a ese código.

Con las pruebas unitarias se evita el problema de modificar el código y que ciertas funcionalidades dejen de funcionar. Si existe una batería de tests que asseguran el correcto funcionamiento, es posible comprobar que la aplicación sigue cumpliendo con su cometido. Esto mismo es lo que ofrece PHPUnit para PHP.

Mirando varias artículos, tutoriales y demás, he conseguido tener una estructura funcional para realizar los tests con Zend Framework. En este caso, el entorno esta formado a partir de la instalación de PHPUnit y Zend Framework en XAMPP. Así, los archivos necesarios estarán en la carpeta tests, al mismo nivel que library:

/tests/phpunit.xml

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="./TestHelper.php">
    <testsuite>
        <directory>./</directory>
    </testsuite>
 
    <filter>
        <whitelist>
            <directory suffix=".php">../application/</directory>
            <exclude>
                <directory suffix=".phtml">../application/</directory>
            </exclude>
        </whitelist>
    </filter>
    <logging>
        <log type="coverage-html" target="./log/report" charset="UTF-8"
            yui="true" highlight="true"
            lowUpperBound="50" highLowerBound="80"/>
        <log type="testdox-html" target="./log/testdox.html" />
    </logging>
</phpunit>

/tests/TestHelper.php

<?php
 
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
 
// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));
 
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));
 
/**
 * Register autoloader
 */
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
 
require_once APPLICATION_PATH . '/../tests/application/ControllerTestCase.php';

/tests/application/bootstrap.php

<?php
 
/** Zend_Application */
require_once 'Zend/Application.php';
 
// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap();

/tests/application/ControllerTestCase.php

<?php
class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    public $application;
 
    public function setUp()
    {
        $this->application = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
        );
 
        $this->bootstrap = array($this, 'appBootstrap');
 
        parent::setUp();
    }
 
    public function tearDown()
    {
        Zend_Db_Table::getDefaultAdapter()->closeConnection();
        parent::tearDown();
    }
 
    public function appBootstrap()
    {
        $this->application->bootstrap();
    }
 
}

/tests/application/controllers/IndexControllerTest.php

<?php
 
class IndexControllerTest extends ControllerTestCase
{
    public function testIndexAction() {
        $this->dispatch('/');
        $this->assertController('index');
        $this->assertAction('index');
    }
 
    public function testErrorURL() {
        $this->dispatch('foo');
        $this->assertController('error');
        $this->assertAction('error');
    }
 
    public function testViewObjectContainsStringProperty()
    {
        $this->dispatch('/');
 
        $controller = new IndexController(
            $this->request,
            $this->response,
            $this->request->getParams()
        );
        $controller->indexAction();
 
        $this->assertTrue(isset($controller->view->string));
    }
}

Con estos 4 archivos, se puede hacer una prueba yendo a la línea de comandos y ejecutando phpunit en la carpeta tests. Si todo ha ido correctamente, se verá algo parecido a lo siguiente:

C:\xampp\htdocs\testzf\tests>phpunit
PHPUnit 3.4.11 by Sebastian Bergmann.
 
..F
 
Time: 2 seconds, Memory: 13.75Mb
 
There was 1 failure:
 
1) IndexControllerTest::testViewObjectContainsStringProperty
Failed asserting that <boolean:false> is true.
 
C:\xampp\htdocs\testzf\tests\application\controllers\IndexControllerTest.ph
p:28
 
FAILURES!
Tests: 3, Assertions: 5, Failures: 1.
 
Generating code coverage report, this may take a moment.

Como se puede ver, se han realizado 3 tests, que contenía 5 pruebas, una de las cuales no ha sido superada. En la carpeta “log” hay un informe que ha generado PHPUnit, detallando el resultado de las pruebas.

3 Comentarios en Configurar PHPUnit y Zend Framework

Fernando

18 marzo 2011 a las 00:32

Hola, si el proyecto es modular, tienen idea que cambios habría que hacer?

Alex

20 diciembre 2011 a las 19:15

Hola,
No acabo de pillar cómo se integra el archivo bootstrap.php en todo el sistema planteado. De hecho, para hacerlo funcionar he tenido que añadirlo al TestHelper.php así:
require_once ‘/../tests/application/bootstrap.php’;

¿Valdría de esa forma o es que me he saltado algún paso?

Gracias.

María

03 abril 2012 a las 09:52

Fernando, te ha respondido alguien o has encontrado la forma de hacerlo funcionar correctamente en un proyecto modular?
Si es así, podrías darme alguna pista? :)
Mi e-mail es maria.antignolo arroba gmail punto com.
Saludos!

Formulario de Comentario

Página 1 de 11