N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.
Cet article fait partie de la série : Optimiser le développement de modules Prestashop
- Mise en place de l’environnement de développement
- Industrialiser l’installation de Prestashop et des modules
- Tester fonctionnellement vos modules avec Phpunit et Selenium
- É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.