He tenido que montar un entorno de desarrollo para Yii, un framework de PHP, en mi Mac OS X Lion. Como he tenido que hacer varios apaños he recopilado todos los ajustes en esta entrada.

Antes de nada enumero las versiones del software utilizadas:

  • Mac OS X 10.7.2
  • PHP 5.3.6
  • PEAR 1.9.4
  • PHPUnit 3.5.15
  • Selenium Server 2.8.0
  • Yii 1.1.8
  • Firefox 7.0.1

La mayoría de las acciones que comento han de realizarse con permisos de administrador.

Activar el servidor web con PHP

Mac OS X Lion incluye Apache con soporte para PHP. Sin embargo es necesario activarlo. Para ello en /etc/apache2/httpd.conf descomentamos:

LoadModule php5_module libexec/apache2/libphp5.so

Y en /etc copiamos el fichero de configuración de fábrica:

# cp /etc/php.ini.default /etc/php.ini

Nota: personalmente prefiero que mis entornos de desarrollo y pruebas sean lo más privados posibles. Por ello modifico el Listen de /etc/apache2/httpd.conf a

Listen 127.0.0.1:80

Solamente resta activar el servidor web desde System Preferences / Sharing / Web Sharing.

El directorio que se publica como página principal está ubicado en /Library/WebServer/Documents/ podemos utilizar directamente esta carpeta o bien utilizar carpetas personales ( http://localhost/**~usuario**/ ). La opción de carpetas personales busca el directorio Sites en el home del usuario, que se puede crear a partir del cuadro de configuración anterior.

Para probar que todo está funcionando lo más recomendable es publicar un fichero .php con un getinfo():

<?php
phpinfo();
?>

Instalar PEAR y PHPUnit

En las versiones anteriores de Mac OS X PEAR está directamente instalado, en Lion es necesario hacer un paso previo:

# php /usr/lib/php/install-pear-nozlib.phar 

Con esto ya tenemos PEAR instalado. Actualizamos:

# pear upgrade-all

configuramos el autodiscover (para hacernos las cosas más fáciles) e instalamos PHPUnit:

# pear config-set auto_discover 1
# pear install pear.phpunit.de/PHPUnit

Solamente nos falta un detalle más, añadir el software instalado por PEAR a la configuración de PHP. Añadimos al /etc/php.ini:

include_path = "/usr/lib/php/pear/"

Para comprobar que todo va bien comprobamos la versión de PHPUnit

$ phpunit --version

Montar y ejecutar las pruebas de un proyecto Yii

A partir de aquí lidiaremos con los problemas que surgen con Yii. Primero nos descargamos Yii y creamos un proyecto de prueba:

$ yii/framework/yiic webapp demo

Problema con date.timezone

Al acceder a la demo puede que nos muestre un mensaje de error como el siguiente:

It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function.

La solución más sencilla es configurar en /etc/php.ini el timezone, por ejemplo:

date.timezone = "Europe/Madrid"

Problema con Selenium, arrancar Firefox

Configuramos la URL para las pruebas en el fichero protected/tests/WebTestCase.php:

define('TEST_BASE_URL','http://localhost/~chernando/demo/index-test.php/');

Descargamos Selenium y lo dejamos ejecutando:

$ java -jar selenium-server-standalone-2.8.0.jar

e intentamos lanzar las pruebas funcionales del proyecto yii:

$ cd demo/protected/tests/
$ phpunit functional/SiteTest.php

Lo más probable es que falle el lanzamiento de iexplorer (bastante razonable en Mac OS X ;) ) o que no encuentre firefox-bin ya que no está en el path. Para solucionarlos editamos protected/tests/phpunit.xml, eliminamos:

<browser name="Internet Explorer" browser="*iexplore" />

y modificamos la entrada del Firefox a nuestro, en mi caso es el siguiente:

<browser name="Firefox" browser="*firefox /Users/chernando/Applications/Firefox.app/Contents/MacOS/firefox-bin" />

Con esto podremos ejecutar las pruebas funcionales.

Problema con Selenium, fallan los test

Después de llegar hasta aquí me sorprendió bastante que de los tres tests que vienen de fábrica fallaran dos ;) Concretamente estos dos fallos:

Body cannot be blank.

Failed asserting that <boolean:false> is true.

Password cannot be blank.

Failed asserting that <boolean:false> is true.

Por suerte es un problema conocido y ya está corregido en el repositorio.

El problema es que no se espera a que se ejecuten las validaciones con JavaScript. El parche publicado corrige un par de líneas en el fichero protected/tests/functional/SiteTest.php que cambia los dos assert que fallan por waitFor, consiguiendo el comportamiento esperado.