Blog de informática: programación, internet, php, wordpress, zend framework, mysql, windows, mootools, linux,…
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.
Entradas relacionadas:
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.