Configurar PHPUnit y Zend Framework

In: zend framework

13 may 2010

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

Entradas relacionadas:

  1. Configurar Netbeans para trabajar con PHPUnit y Zend Framework
  2. Instalar PHPUnit en el XAMPP de Ubuntu
  3. Instalar y configurar Zend Framework y Zend_Tool para construir proyectos en Ubuntu
  4. Configurar Subversion para utilizar los repositorios externos de Zend Framework
  5. Instalar PHPUnit con XAMPP en Windows

Formulario de Comentario

Página 1 de 11

Sobre este blog

Este blog informático pretende ser un blog de notas o portafolio de información variada: trozos de código, descubrimientos, notas sueltas, ... Para tenerla a mano, y ser compartida.