Translate to

Buscar

7 de septiembre de 2010

Hello SimpleTest

Este es un ejemplo trivial donde uso SimpleTest para comprobar el módulo HelloWorld.

Entorno
Procedimiento

Tengo creado el módulo HelloWorld:

helloworld.info
; $Id$
name = Hello World
description = Hello World simple module
core = 6.x
package = Hello

helloworld.module
<?php
// $Id$
/**
 * Implementation of hook_menu()
 */
function helloworld_menu() {
  $items = array();
  
  $items['helloworld'] = array(
    'title' => 'Hello World',
    'page callback' => 'helloworld_page',
    'access arguments' => array('access helloworld content'),
    'type' => MENU_NORMAL_ITEM,
  );
  
  return $items;
}

/**
 * Return content
 */
function helloworld_page() {
  $greeting = variable_get('helloworld_greeting', 'Hello World!');
  
  $content = '<div id="helloworld_block"><div class="greeting">' .
    $greeting . '</div></div>';
    
  return $content;
}

helloworld.test
<?php
// $Id$
class HelloWorldTestCase extends DrupalWebTestCase {
  protected $privileged_user;
  
  public static function getInfo() {
    return array(
      'name' => 'Hello World',
      'description' => 'Hello World simple module.',
      'group' => 'Hello',
    );
  }
  
  public function setUp() {
    parent::setUp('helloworld');
  }
  
  public function testHelloPage() {
    $this->drupalGet('helloworld');
    $this->assertText('Hello World!', 'Greeting in Page');
  }
  • La intención de la prueba es acceder a la dirección helloworld y comprobar que aparezca el texto 'Hello World!'.
  • La clase HelloWorldTestCase extiende a DrupalWebTestCase, que permite imitar una navegación.
  • getInfo() hace que el case sea accesible desde la interface de SimpleTest.
  • setUp() permite definir el entorno inicial para las prueba. Por ejemplo hay órdenes para crear usuarios y simular logins. En este caso, no se hace nada de eso, sólo lo mínimo.
  • El nombre del método de la prueba comienza con test, luego el nombre de la prueba.
  • drupalGet(url) permite simular un acceso a la página de url especificado.
  • assertText() comprueba si el el texto especificado está presente en la página abierta. Sólo el texto; el HTML es ignorado. Opcionalmente se puede asociar un mensaje a la prueba.
  • En tutoriales como http://www.lullabot.com/articles/drupal-module-developer-guide-simpletest aparece un paso donde se implementa hook_simpletest(). Sin embargo, en el tutorial oficial http://drupal.org/node/890654 no aparece este paso. Yo tampoco lo he puesto aquí. No sé si será necesario en otros casos.
    Tampoco fué necesario que creara un directorio test. Coloqué helloworld.test en el mismo directorio que helloworld.module.
Para correr la prueba se usa el administrador de Drupal, Site Building, Testing, Hello (el nombre del grupo de pruebas que especifiqué con getInfo()) y HelloWorld (el nombre del case).


En este caso aparecerá un fail en la línea del assertText. Tambiém puede comprobar manualmente que al intentar acceder a la página helloworld aparece un mensaje de acceso denegado.

Es porque en la definición de la página he indicado privilegios de acceso que no existen. Para corregir esto:

function helloworld_menu() {
  $items = array();
  
  $items['helloworld'] = array(
    'title' => 'Hello World',
    'page callback' => 'helloworld_page',
    'access arguments' => array('access content'),
    'type' => MENU_NORMAL_ITEM,
  );
  
  return $items;
}


Como he modificado el módulo, limpio el cache antes de volver a correr la prueba. Aparecerá todo OK.

Enlaces interesantes

6 de septiembre de 2010

Instalando SimpleTest

SimpleTest es un módulo que permite usar unit testing (test unitarios) en la programación de Drupal.

Entorno
Ingredientes
Procedimiento
  1. drush dl simpletest
  2. Antes de activar el módulo, revisé el archivo INSTALL.txt.
    Allí, indican que el primer paso es aplicar el parche D6-core-simpletest.patch a Drupal core.
  3. Para aplicar el parche, uso Aptana Studio.
    Como el directorio del site aún no era un proyecto de Aptana, lo ubico en la pestaña File, click secundario, Promote to Project...
    Una vez que el site ya figura bajo Projects, en la misma pestaña File, click secundario, Team, Apply Patch...
    Luego indico aplicar modules/simpletest/D6-core-simpletest.patch en el site.
  4. Usando el administrador de Drupal, indico activar el módulo SimpleTest.
    Obtengo un mensaje que dice que no se puede activar el módulo porque el php no tiene la biblioteca curl (uno de los requisitos).
  5. Edito el archivo de configuración de php (xampp/php/php.ini) y allí descomento la línea que declara curl como extensión:
    extension=php_curl.dll
    Luego reinicio el servidor apache (usando el panel de control de xampp).
  6. Vuelvo a intentar activar el módulo SimpleTest, esta vez con éxito.
    Ahora, en el administrador de Drupal, Site Building, aparece la nueva opción Testing.

Más artículos