Configurar PHPUnit y Zend Framework
In: zend framework
13 may 2010
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.
- Tags: php, phpunit, xampp, zend framework

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!