Archivo de la etiqueta: Codeigniter

phpunit con CIUnit no hace nada

[linux] [programación]

Ejecución de phpunit sin salida por consola

Este es otro claro ejemplo de problema en informática al que dedicas un montón de tiempo y te vuelves loco para resolverlo, y al final resulta ser una chorrada. El problema es el siguiente: yo hago mis tests para CodeIgniter utilizando CIUnit y en mi anterior sistema todo funcionaba (MacOSX). Cambio de sistema a un Linux Ubuntu, y cuando lanzo los tests no ocurre nada. No hay mensajes, no hay errores, no hay nada de nada.

Así que tras muchos días de pruebas, en mi desesperación me pongo a añadir mensajes de debug por todo el código de la librería CIUnit y el core de CodeIgniter para encontrar en que momento se para la ejecución, hasta llegar a esta línea:

return @mysql_pconnect($this->hostname, $this->username, $this->password);

Esta línea en el fichero /system/database/drivers/mysql/mysql_driver.php es donde salimos de CodeIgniter para entrar en el core de PHP y es donde la ejecución está fallando. Y a algún “genio” se le ocurrió que sería una buena idea silenciar los errores…

Al quitar el silencio, PHP nos informa de que no puede conectarse a la base de datos porque no tiene el driver de mysql instalado, lo cual podemos solucionar fácilmente con:

sudo apt-get install php5-mysql

Aquí dejo un listado de comandos que me han sido útiles en la resolución del problema:

Comprobar si tienes un módulo instalado:

php -i | grep nombre_del_modulo

Por ejemplo:

php -i | grep mysql

Obtener el listado de módulos que podemos instalar:

apt-cache search php5-

CIUnit: Errores y soluciones para empezar a funcionar

[programación]

Poco a poco me voy concienciando de la importancia de realizar tests unitarios, pero entre unas cosas y otras, y siempre un poco de perrería, nunca me había dignado a montar tests unitarios con mis aplicaciones en CodeIgniter.

Por fin ayer, aprovechando un rediseño de la estructura de la aplicación, me decidí a incluir tests unitarios en CodeIgniter. Tras buscar un poco encontré una implementación para integrar PHPUnit con CodeIgniter, llamada CIUnit.

La documentación es un tanto escasa y confusa, pero tres buenos sitios donde buscar son:

Tras seguir los pasos de la instalación (en un Mac OS X Mountaion Lion), y lanzar PHPUnit desde consola, me saltaron varios errores que detallo a continuación:

Error

[CIUnit] PHP Error: Warning - require_once(PHPUnit/Autoload.php): failed to open stream: No such file or directory File Path: CIUnit/bootstrap_phpunit.php (line: 259)

Fatal error: require_once(): Failed opening required 'PHPUnit/Autoload.php' (include_path='.:') in /project_path/application/third_party/CIUnit/bootstrap_phpunit.php on line 259

Solución

Si estás usando la última versión de PHPUnit tengo entendido que no es necesario cargar ninguna librería, por lo que podemos ir al fichero bootstrap_phpunit.php y comentar o borrar la línea 259.

Error

[CIUnit] PHP Error: Notice - Undefined index: REMOTE_ADDR File Path: core/Input.php (line: 351)
PHPUnit 4.0.14 by Sebastian Bergmann.

Solución

Cuando lanzamos una aplicación PHP desde consola (en este caso PHPUnit) evidentemente no tendremos una REMOTE_ADDR, por lo que debemos añadir una comprobación.

Sustituimos:

$this->ip_address = $_SERVER['REMOTE_ADDR'];

Por lo siguiente:

if(isset($_SERVER['REMOTE_ADDR']))
    $this->ip_address = $_SERVER['REMOTE_ADDR'];
else
    $this->ip_address = '127.0.0.1';

Error

[CIUnit] Error: 500 Message: Unable to connect to your database server using the provided settings. Filename: core/Loader.php Line Number: 346

Solución

Tal como explican en esta página, no podemos usar localhost como hostname, por lo que lo cambiamos por 127.0.0.1 en application/config/testing/database.php:

$db['default']['hostname'] = '127.0.0.1';