Cet article fait partie de la série : Optimiser le développement de modules Prestashop

  1. Mise en place de l’environnement de développement
  2. Industrialiser l’installation de Prestashop et des modules
  3. Tester fonctionnellement vos modules avec Phpunit et Selenium
  4. Éviter les régressions avec l’intégration continue

3ème étape de notre série sur l’optimisation du développement de module prestashop.

Après la configuration de l’environnement et l’industrialisation des installations qui ont permis de mettre en place la structure de développement, il est temps de passer aux tests fonctionnels de nos modules.
Ceci nous permettra de vérifier que le comportement utilisateur est bien celui attendu.

Configuration de l’environnement pour exécuter les tests

Pour cela nous allons déjà installer les programmes suivants sur le serveur

  • Xvfb : permettra de lancer une application graphique sans serveur X
  • Firefox : navigateur
  • Java : JDk

Pour installer ces éléments saisissez les commandes suivantes

sudo apt-get install xvfb
sudo apt-get install firefox
sudo apt-get install default-jdk

Nous allons ensuite installer également phpunit et selenium, cependant ces éléments peuvent être installé de manière globale ou via composer

Installation globale

PhpUnit

#Téléchargement de phpunit
wget https://phar.phpunit.de/phpunit.phar
#Droits d'éxécution sur le fichier
chmod +x phunit.phar
#Déplacement dans les binaires locaux
sudo mv phpunit.phar /usr/local/bin/phpunit

Pour vérifier son bon fonctionnement saisissez la commande suivante :

phpunit --version

Selenium :

wget http://selenium-release.storage.googleapis.com/2.47/selenium-server-standalone-2.47.0.jar
#droits d'exécution
chmod +x selenium-server-standalone-2.47.0.jar
#déplacement dans les binaires
mv selenium-server-standalone-2.47.0.jar /usr/local/bin/selenium-server-standalone.jar

Via composer :

Créer un fichier composer.json dans le dossier “prestashop” ( dossier parent de “scripts”,”global_modules”, et toutes les installations prestashop )
Avec le contenu suivant :

{
"name": "hhennes/prestashoptest",
"description": "Functionnal test for prestashop modules",
"authors": [
{
"name": "Herve",
"email": "[email protected]"
}
],
"require": {
"phpunit/phpunit": "^4.8",
"phpunit/phpunit-selenium": "^1.4",
"se/selenium-server-standalone": "^2.47"
}
}

Puis saisissez la commande :

composer install

Les éléments nécessaires sont à présent installé dans le dossier “vendor”;

Création des fichiers de tests

Créer un fichier phpunit.xml à la racine du module avec le contenu suivant

<?xml version="1.0"?>
<phpunit convertErrorsToExceptions="true">
 <testsuite name='SampleModuleTests'>
      <directory suffix='.php'>./tests/</directory>
 </testsuite>
 <logging>
     <log type="junit" target="./tests/results/results.xml" logIncompleteSkipped="true"/>
     <log type="tap" target="./tests/results/results.tap" logIncompleteSkipped="true"/>
 </logging>
</phpunit>

Nous allons à présent écrire notre tests fonctionnel pour le module “samplemodule” de notre série que nous allons placer dans le fichier SampleModuleTest.php un dossier “tests
Ce test va s’assurer que le texte “It works” est bien présent sur le controller  front office de notre module.

<?php
 
class SampleModuleTest extends PHPUnit_Extensions_Selenium2TestCase
{
    /** Url du site  */
    protected $_site_url = 'http://localhost/prestashop/';
 
    /** Versions cibles du module ( 1.4 | 1.5 | 1.6 | ALL ) */
    protected $_targeted_versions = 'ALL';
 
    /**
     * Initialisation de la classe de test
     */
    public function setUp()
    {
        $this->setBrowser('firefox');
        $this->setBrowserUrl($this->_site_url);
    }
 
 
    /**
     * Test du bon affichage du texte du module sur le front office
     * @param string $version version de prestashop à tester
     * @dataProvider getPrestashopVersions
     */
    public function testDisplayText($version)
    {
 
        //On charge l'url du controller front Office du module
        $this->url($version.'/index.php?fc=module&module=samplemodule&controller=sample');
 
        //Si vous voulez visualiser ce que le navigateur vois, sinon ces lignes peuvent être commentées.
        $image = $this->currentScreenshot();
        file_put_contents(dirname(__FILE__).'screenshot'.time().'.jpg', $image);
 
        //On s'assure que le contenu du block central est bien égal à "It works"
        $this->assertEquals($this->byId('center_column')->text(),'It works');
    }
 
 
    /**
     * Récupération des versions de prestashop installées sur l'infrastructure
     * Et renvoi des versions ciblées par la variable $_targeted_versions
     */
    public function getPrestashopVersions()
    {
        $prestashop_dir = dirname(__FILE__).'/../../../';
        $dir            = opendir($prestashop_dir);
 
        $versions = array();
 
        //Récupération de toutes les versions prestashop installées
        while ($item = readdir($dir)) {
            if (is_dir($prestashop_dir.$item) && preg_match('#prestashop#',$item)) {
                //En fonction des paramètres du module on inclus seulement les version cibles
                if ($this->_targeted_versions != 'ALL') {
                    if (preg_match('#'.str_replace('.', '-', $this->_targeted_versions).'#', $item))
                            $versions[] = array($item);
                }
                // Si on cible toutes les versions on inclus tout
                else {
                    $versions[] = array($item);
                }
            }
        }
        
       return $versions;
    }
}

Créer également un dossier “results” dans ce dossier test. C’est dans ce dossier que les résultats des tests seront affichés.

Lancement du test

Afin de pouvoir exécuter ce test il va être nécessaire de lancer xvfb via les commande suivantes

/usr/bin/Xvfb :99 -ac -screen 0 1280x1024x8 &
export DISPLAY=:99

Il faut ensuite exécuter selenium :
Dans le cas d’une installation globale :

java -jar /usr/local/bin/selenium-server-standalone.jar &

Dans le cas d’une installation composer

java -jar /var/www/public/prestashop/vendor/bin/selenium-server-standalone &

Puis nous pouvons a présent exécuter notre test fonctionnel en nous rendant dans le dossier de notre module ( prestashop/global_modules/samplemodule/ )

En fonction de votre installation de phpunit ( globale ou composer ) la commande à utiliser sera

global

phpunit

composer

 ../../vendor/bin/phpunit

Si le test a bien réussi les résultats renvoyés par phpunit devraient être sous la forme suivante :

Time: 21.62 seconds, Memory: 14.00Mb
OK (3 tests, 3 assertions)

Si tout est ok nous avons donc testé fonctionnellement le comportement de notre module.
Cet exemple est très basique, pour réaliser des tests plus complets je vous invite à consulter les documentations suivantes (en anglais ):

Phpunit : https://phpunit.de/manual/current/en/index.html
PhpUnit Selenium2 : https://github.com/giorgiosironi/phpunit-selenium

Dans la prochaine étape nous verrons comment nous allons mettre en place une plateforme d’intégration continue pour suivre l’évolution de nos modules et éviter les régressions.