{"id":1103,"date":"2015-08-28T10:44:14","date_gmt":"2015-08-28T08:44:14","guid":{"rendered":"http:\/\/www.h-hennes.fr\/blog\/?p=1103"},"modified":"2016-04-02T11:30:47","modified_gmt":"2016-04-02T09:30:47","slug":"optimiser-le-developpement-de-modules-prestashop-tester-fonctionnellement-vos-modules-avec-phpunit-et-selenium","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2015\/08\/28\/optimiser-le-developpement-de-modules-prestashop-tester-fonctionnellement-vos-modules-avec-phpunit-et-selenium\/","title":{"rendered":"Optimiser le d\u00e9veloppement de modules Prestashop : Tester fonctionnellement vos modules avec Phpunit et Selenium"},"content":{"rendered":"<div class=\"entete-serie\">\n<p>Cet article fait partie de la s\u00e9rie : Optimiser le d\u00e9veloppement de modules Prestashop<\/p>\n<ol>\n<li><a href=\"https:\/\/www.h-hennes.fr\/blog\/2015\/08\/20\/optimiser-developpement-de-modules-prestashop-mise-en-place-de-lenvironnement-de-developpement\/\">Mise en place de l&rsquo;environnement de d\u00e9veloppement<\/a><\/li>\n<li><a href=\"https:\/\/www.h-hennes.fr\/blog\/2015\/08\/21\/optimiser-le-developpement-de-modules-prestashop-industrialiser-linstallation-de-prestashop-et-des-modules\/\">Industrialiser l&rsquo;installation de Prestashop et des modules<\/a><\/li>\n<li><strong>Tester fonctionnellement vos modules avec Phpunit et Selenium<\/strong><\/li>\n<li><a href=\"https:\/\/www.h-hennes.fr\/blog\/2016\/04\/02\/optimiser-le-developpement-de-modules-prestashop-eviter-les-regressions-avec-lintegration-continue\/\">\u00c9viter les r\u00e9gressions avec l&rsquo;int\u00e9gration continue<\/a><\/li>\n<\/ol>\n<\/div>\n<p>3\u00e8me \u00e9tape de notre s\u00e9rie sur l&rsquo;optimisation du d\u00e9veloppement de module prestashop.<\/p>\n<p>Apr\u00e8s la <a href=\"https:\/\/www.h-hennes.fr\/blog\/2015\/08\/20\/optimiser-developpement-de-modules-prestashop-mise-en-place-de-lenvironnement-de-developpement\/\" target=\"_blank\">configuration de l&rsquo;environnement <\/a>et l&rsquo;<a href=\"https:\/\/www.h-hennes.fr\/blog\/2015\/08\/21\/optimiser-le-developpement-de-modules-prestashop-industrialiser-linstallation-de-prestashop-et-des-modules\/\" target=\"_blank\">industrialisation des installations<\/a> qui ont permis de mettre en place la structure de d\u00e9veloppement, il est temps de passer aux tests fonctionnels de nos modules.<br \/>\nCeci nous permettra de v\u00e9rifier que le comportement utilisateur est bien celui attendu.<\/p>\n<h3><span style=\"color: #000080;\"><strong>Configuration de l\u2019environnement pour ex\u00e9cuter les tests<\/strong><\/span><\/h3>\n<p>Pour cela nous allons d\u00e9j\u00e0 installer les programmes suivants sur le serveur<\/p>\n<ul>\n<li>Xvfb : permettra de lancer une application graphique sans serveur X<\/li>\n<li>Firefox : navigateur<\/li>\n<li>Java : JDk<\/li>\n<\/ul>\n<p>Pour installer ces \u00e9l\u00e9ments saisissez les commandes suivantes<\/p>\n<pre lang=\"bash\">sudo apt-get install xvfb<\/pre>\n<pre lang=\"bash\">sudo apt-get install firefox<\/pre>\n<pre lang=\"bash\">sudo apt-get install default-jdk<\/pre>\n<p>Nous allons ensuite installer \u00e9galement <strong>phpunit<\/strong> et <strong>selenium<\/strong>, cependant ces \u00e9l\u00e9ments peuvent \u00eatre install\u00e9 de mani\u00e8re globale ou via composer<\/p>\n<p><strong>Installation globale<\/strong><\/p>\n<p>PhpUnit<\/p>\n<pre lang=\"bash\">#T\u00e9l\u00e9chargement de phpunit\r\nwget https:\/\/phar.phpunit.de\/phpunit.phar\r\n#Droits d'\u00e9x\u00e9cution sur le fichier\r\nchmod +x phunit.phar\r\n#D\u00e9placement dans les binaires locaux\r\nsudo mv phpunit.phar \/usr\/local\/bin\/phpunit<\/pre>\n<p>Pour v\u00e9rifier son bon fonctionnement saisissez la commande suivante :<\/p>\n<pre lang=\"bash\">phpunit --version<\/pre>\n<p>Selenium :<\/p>\n<pre lang=\"bash\">wget http:\/\/selenium-release.storage.googleapis.com\/2.47\/selenium-server-standalone-2.47.0.jar\r\n#droits d'ex\u00e9cution\r\nchmod +x selenium-server-standalone-2.47.0.jar\r\n#d\u00e9placement dans les binaires\r\nmv selenium-server-standalone-2.47.0.jar \/usr\/local\/bin\/selenium-server-standalone.jar\r\n<\/pre>\n<p><strong>Via composer :<\/strong><\/p>\n<p>Cr\u00e9er un fichier composer.json dans le dossier \u00ab\u00a0prestashop\u00a0\u00bb ( dossier parent de \u00ab\u00a0scripts\u00a0\u00bb,\u00a0\u00bbglobal_modules\u00a0\u00bb, et toutes les installations prestashop )<br \/>\nAvec le contenu suivant :<\/p>\n<pre lang=\"xml\">{\r\n\"name\": \"hhennes\/prestashoptest\",\r\n\"description\": \"Functionnal test for prestashop modules\",\r\n\"authors\": [\r\n{\r\n\"name\": \"Herve\",\r\n\"email\": \"contact@h-hennes.fr\"\r\n}\r\n],\r\n\"require\": {\r\n\"phpunit\/phpunit\": \"^4.8\",\r\n\"phpunit\/phpunit-selenium\": \"^1.4\",\r\n\"se\/selenium-server-standalone\": \"^2.47\"\r\n}\r\n}\r\n<\/pre>\n<p>Puis saisissez la commande :<\/p>\n<pre lang=\"bash\">composer install<\/pre>\n<p>Les \u00e9l\u00e9ments n\u00e9cessaires sont \u00e0 pr\u00e9sent install\u00e9 dans le dossier \u00ab\u00a0vendor\u00a0\u00bb;<\/p>\n<h3><span style=\"color: #000080;\"><strong>Cr\u00e9ation des fichiers de tests<\/strong><\/span><\/h3>\n<p>Cr\u00e9er un fichier phpunit.xml \u00e0 la racine du module avec le contenu suivant<\/p>\n<pre lang=\"xml\" escaped=\"true\">&lt;?xml version=\"1.0\"?&gt;\r\n&lt;phpunit convertErrorsToExceptions=\"true\"&gt;\r\n\u00a0&lt;testsuite name='SampleModuleTests'&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;directory suffix='.php'&gt;.\/tests\/&lt;\/directory&gt;\r\n\u00a0&lt;\/testsuite&gt;\r\n\u00a0&lt;logging&gt;\r\n\u00a0\u00a0\u00a0\u00a0 &lt;log type=\"junit\" target=\".\/tests\/results\/results.xml\" logIncompleteSkipped=\"true\"\/&gt;\r\n\u00a0\u00a0\u00a0\u00a0 &lt;log type=\"tap\" target=\".\/tests\/results\/results.tap\" logIncompleteSkipped=\"true\"\/&gt;\r\n\u00a0&lt;\/logging&gt;\r\n&lt;\/phpunit&gt;\r\n<\/pre>\n<p>Nous allons \u00e0 pr\u00e9sent \u00e9crire notre tests fonctionnel pour le module \u00ab\u00a0<em>samplemodule<\/em>\u00a0\u00bb de notre s\u00e9rie que nous allons placer dans le fichier <em>SampleModuleTest.php<\/em> un dossier \u00ab\u00a0<em>tests<\/em>\u00a0\u00bb<br \/>\nCe test va s&rsquo;assurer que le texte \u00ab\u00a0It works\u00a0\u00bb est bien pr\u00e9sent sur le controller\u00a0 front office de notre module.<\/p>\n<pre lang=\"php\" escaped=\"true\">&lt;?php\r\n\r\nclass SampleModuleTest extends PHPUnit_Extensions_Selenium2TestCase\r\n{\r\n\u00a0\u00a0\u00a0 \/** Url du site\u00a0 *\/\r\n\u00a0\u00a0\u00a0 protected $_site_url = 'http:\/\/localhost\/prestashop\/';\r\n\r\n\u00a0\u00a0\u00a0 \/** Versions cibles du module ( 1.4 | 1.5 | 1.6 | ALL ) *\/\r\n\u00a0\u00a0\u00a0 protected $_targeted_versions = 'ALL';\r\n\r\n\u00a0\u00a0\u00a0 \/**\r\n\u00a0\u00a0\u00a0\u00a0 * Initialisation de la classe de test\r\n\u00a0\u00a0\u00a0\u00a0 *\/\r\n\u00a0\u00a0\u00a0 public function setUp()\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $this-&gt;setBrowser('firefox');\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $this-&gt;setBrowserUrl($this-&gt;_site_url);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\r\n\u00a0\u00a0\u00a0 \/**\r\n\u00a0\u00a0\u00a0\u00a0 * Test du bon affichage du texte du module sur le front office\r\n\u00a0\u00a0\u00a0\u00a0 * @param string $version version de prestashop \u00e0 tester\r\n\u00a0\u00a0\u00a0\u00a0 * @dataProvider getPrestashopVersions\r\n\u00a0\u00a0\u00a0\u00a0 *\/\r\n\u00a0\u00a0\u00a0 public function testDisplayText($version)\r\n\u00a0\u00a0\u00a0 {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/On charge l'url du controller front Office du module\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $this-&gt;url($version.'\/index.php?fc=module&amp;module=samplemodule&amp;controller=sample');\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Si vous voulez visualiser ce que le navigateur vois, sinon ces lignes peuvent \u00eatre comment\u00e9es.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $image = $this-&gt;currentScreenshot();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file_put_contents(dirname(__FILE__).'screenshot'.time().'.jpg', $image);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/On s'assure que le contenu du block central est bien \u00e9gal \u00e0 \"It works\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $this-&gt;assertEquals($this-&gt;byId('center_column')-&gt;text(),'It works');\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\r\n\u00a0\u00a0\u00a0 \/**\r\n\u00a0\u00a0\u00a0\u00a0 * R\u00e9cup\u00e9ration des versions de prestashop install\u00e9es sur l'infrastructure\r\n\u00a0\u00a0\u00a0\u00a0 * Et renvoi des versions cibl\u00e9es par la variable $_targeted_versions\r\n\u00a0\u00a0\u00a0\u00a0 *\/\r\n\u00a0\u00a0\u00a0 public function getPrestashopVersions()\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $prestashop_dir = dirname(__FILE__).'\/..\/..\/..\/';\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $dir\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = opendir($prestashop_dir);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $versions = array();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/R\u00e9cup\u00e9ration de toutes les versions prestashop install\u00e9es\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while ($item = readdir($dir)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (is_dir($prestashop_dir.$item) &amp;&amp; preg_match('#prestashop#',$item)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/En fonction des param\u00e8tres du module on inclus seulement les version cibles\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ($this-&gt;_targeted_versions != 'ALL') {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (preg_match('#'.str_replace('.', '-', $this-&gt;_targeted_versions).'#', $item))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $versions[] = array($item);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Si on cible toutes les versions on inclus tout\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $versions[] = array($item);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $versions;\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n<\/pre>\n<p>Cr\u00e9er \u00e9galement un dossier \u00ab\u00a0results\u00a0\u00bb dans ce dossier test. C&rsquo;est dans ce dossier que les r\u00e9sultats des tests seront affich\u00e9s.<\/p>\n<h3><span style=\"color: #000080;\"><strong>Lancement du test<\/strong><\/span><\/h3>\n<p>Afin de pouvoir ex\u00e9cuter ce test il va \u00eatre n\u00e9cessaire de lancer xvfb via les commande suivantes<\/p>\n<pre lang=\"bash\" escaped=\"true\">\/usr\/bin\/Xvfb :99 -ac -screen 0 1280x1024x8 &amp;\r\nexport DISPLAY=:99\r\n<\/pre>\n<p>Il faut ensuite ex\u00e9cuter selenium :<br \/>\nDans le cas d&rsquo;une installation globale :<\/p>\n<pre lang=\"bash\" escaped=\"true\">java -jar \/usr\/local\/bin\/selenium-server-standalone.jar &amp;<\/pre>\n<p>Dans le cas d&rsquo;une installation composer<\/p>\n<pre lang=\"bash\" escaped=\"true\">java -jar \/var\/www\/public\/prestashop\/vendor\/bin\/selenium-server-standalone &amp;<\/pre>\n<p>Puis nous pouvons a pr\u00e9sent ex\u00e9cuter notre test fonctionnel en nous rendant dans le dossier de notre module ( prestashop\/global_modules\/samplemodule\/ )<\/p>\n<p>En fonction de votre installation de phpunit ( globale ou composer ) la commande \u00e0 utiliser sera<\/p>\n<p>global<\/p>\n<pre lang=\"bash\">phpunit<\/pre>\n<p>composer<\/p>\n<pre lang=\"bash\"> ..\/..\/vendor\/bin\/phpunit<\/pre>\n<p>Si le test a bien r\u00e9ussi les r\u00e9sultats renvoy\u00e9s par phpunit devraient \u00eatre sous la forme suivante :<\/p>\n<pre>Time: 21.62 seconds, Memory: 14.00Mb\r\nOK (3 tests, 3 assertions)\r\n<\/pre>\n<p>Si tout est ok nous avons donc test\u00e9 fonctionnellement le comportement de notre module.<br \/>\nCet exemple est tr\u00e8s basique, pour r\u00e9aliser des tests plus complets je vous invite \u00e0 consulter les documentations suivantes (en anglais ):<\/p>\n<p>Phpunit : <a href=\"https:\/\/phpunit.de\/manual\/current\/en\/index.html\" target=\"_blank\">https:\/\/phpunit.de\/manual\/current\/en\/index.html<\/a><br \/>\nPhpUnit Selenium2 : <a href=\"https:\/\/github.com\/giorgiosironi\/phpunit-selenium\" target=\"_blank\">https:\/\/github.com\/giorgiosironi\/phpunit-selenium <\/a><\/p>\n<p>Dans la prochaine \u00e9tape nous verrons comment nous allons mettre en place une plateforme d&rsquo;int\u00e9gration continue pour suivre l&rsquo;\u00e9volution de nos modules et \u00e9viter les r\u00e9gressions.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cet article fait partie de la s\u00e9rie : Optimiser le d\u00e9veloppement de modules Prestashop Mise en place de l&rsquo;environnement de d\u00e9veloppement Industrialiser l&rsquo;installation de Prestashop et des modules Tester fonctionnellement vos modules avec Phpunit et Selenium \u00c9viter les r\u00e9gressions avec l&rsquo;int\u00e9gration continue 3\u00e8me \u00e9tape de notre s\u00e9rie sur l&rsquo;optimisation du d\u00e9veloppement de module prestashop. Apr\u00e8s [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[245],"tags":[],"class_list":["post-1103","post","type-post","status-publish","format-standard","hentry","category-prestashop-2"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/comments?post=1103"}],"version-history":[{"count":11,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1103\/revisions"}],"predecessor-version":[{"id":1338,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1103\/revisions\/1338"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=1103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=1103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=1103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}