Configurar PHPUnit y Zend Framework

Ruedas dentadas

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.

4 comentarios en “Configurar PHPUnit y Zend Framework

  1. 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.

  2. 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!

  3. she would do better next time. The focus here is Ms. Yuen’s cmeomnt on “有咩偶像就有咩FANS”. This cmeomnt is extremely wrong. I just feel bad for Stephy. If someone is overly protective about her and make a bad cmeomnt about someone or something, she shouldn’t be made responsible. 無錯 華仔個CASE 係一個例子 我唔係話偷野同寫錯字同罪…….Anyway, I just wanted to stand up for Stephy. I am not her fans at all but I just didn’t think Ms. Yuen had to make that cmeomnt……

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>