Si vous ne l’avez pas encore lu, allez lire l’article Tester ses modules Drupal 7.

Les tests fonctionnels via Simpletest sont gérés par la class DrupalWebTestCase qu’il faut ensuite étendre dans son module.

Pour chaque fonction commençant par test définie dans la class, Simpletest va reconstruire entièrement une instance de Drupal, activer les modules désirés et exécuter les tests.

L’avantage de ce type de tests réside dans le fait que Drupal a accès aux informations de la base de données et est donc en capacité d’exécuter la totalité des fonctions disponibles.

Il est donc possible d’utiliser dans ces tests des fonctions comme node_save(), variable_get() …

Mise en place des tests

Déclarer ces fichier de tests

Drupal décrit l’ensemble de ces tests dans des fichiers portant l’extension .test.
Chaque fichier de test doit ensuite être déclaré dans le .info de votre module via la déclaration files[] qui est notamment utilisé par Drupal pour charger ces class.

Ainsi si vous nommez le fichier contenant vos tests mon_module.test, il vous faudra ajouter la ligne suivante dans le .info : files[] = mon_module.test

Contenu minimal d’un fichier de tests

Etendre la class de base de Drupal

Dans le cadre de tests fonctionnels, c’est donc la class DrupalWebTestCase que l’on veut étendre.

<?php

class EditorListTests extends DrupalWebTestCase {}

Déclaration des infos de notre test

C’est la fonction static getInfo() qui se charge de recevoir ces informations. Elle retourne un tableau contenant un nom, une description et un groupe.

Le nom doit être unique pour votre class. Le groupe peut être commun à plusieurs modules, ce qui est pratique pour pouvoir lancer par exemple l’ensemble des tests de vos modules custom en 1 fois.

<?php

public static function getInfo() {
  // Note: getInfo() strings should not be translated.
  return array(
    'name' => 'Editor List tests',
    'description' => 'Test that editor_list module work fine.',
    'group' => 'Editor List',
  );

}

Déclaration des modules à activer

2nd fonction obligatoire à déclarer dans vos fichiers de tests, il s’agit de setUp(). Cette fonction vous permet de définir, notamment, les modules à charger lors de l’initialisation des environnements de test.

Dans l’exemple ci-dessous, on déclare ainsi que les environnements doivent avoir le module editor_list de charger. A l’initialisation Drupal se charge de regarder les dépendances des modules à activer et les activer automatiquement. Il n’est donc pas nécessaire de tous les déclarer explicitement.

<?php

/**
 * {@inheritdoc}
 */
public function setUp() {
  parent::setUp('editor_list');
}

Il est également possible d’utiliser cette méthode setUp() pour définir des éléments nécessaires à l’ensemble de vos tests. Par exemple, création d’un compte admin, création de contenus de tests … Ces éléments pourront ainsi être exploiter directement dans vos tests sans avoir besoin de répéter la phase de création à chaque fois.

Déclarer une fonction de test

Un fonction de test doit obligatoirement commencer par le mot clé test.

<?php

/**
 * Test Administration page access and edition.
 */
public function testAdministrationPage() {
  // Your tests
}

L’obligation d’avoir le mot clé test au début du nom de votre fonction vous permet de créer des fonctions utilitaires dans la même class en étant certains qu’elles ne seront pas exécuter par Simpletest si vous ne les appelez pas explicitement.

Exemple complet

Module editor_list