SlideShare une entreprise Scribd logo
Des tests 'MODERNES' pour Drupal 
Christophe Villeneuve 
@hellosct1
Qui... est Christophe Villeneuve ? 
<< 
afup – lemug.fr – mysql – mariadb – drupal – demoscene – firefoxos – drupagora – phptour – forumphp – solutionlinux – demoinparis – ici et maintenant – eyrolles – editions eni – programmez – linux pratique – webriver – phptv – neuros - elephpant
Support présentation aujourd'hui 
Disponible sur http://www.eyrolles.fr 
Drupal avancé – un CMS pour développeurs par Christophe Villeneuve et Vanessa Kovalsky David aux Editions EYROLLES
Expérience sur... Les tests 
Citations 
✔ « Des fois cela plante » 
✔ « On a testé, … 
il y a 3 mois lors de la dernière livraison... 
Pas eu le temps... »
L'importance des tests 
Pourquoi c'est utile ? Et L'intérêt... 
✔ Le code peut casser 
✔ Changer le nom d'un fichier 
✔ Pas le temps d'en faire 
✔ C'est long manuellement 
✔ Coûte du temps au début 
✔ En fait gain après 
✔ Nécessite de la rigueur et 
de la constante
Les différents types de tests 
Tests Unitaires 
● Module / classe / méthode 
Tests fonctionnels 
● l'interface utilisateur testée par le client 
Tests intégrations 
● Tester la navigation, et l'interface utilisateur 
Tests Automatisés 
Tests de charges 
Tests d'ergonomie 
Tests de sécurité
Tests unitaires... En pratique
Tests unitaires 
Déroulement Quoi tester ? 
✔ Existe-t-il ? 
✔ Ecrire un test qui échoue 
✔ Ecrire un test qui est bon 
✔ Un test de sécurité 
✔ Un test de contrôle 
✔ Un module 
✔ Une classe 
✔ Une méthode 
✔ Tester 
✔ Ce qui est important 
✔ Le risque de casser 
✔ Les parties que vous 
touchez souvent
Tests unitaires : Les API 
✔ jUnit 
✔ SimpleTest 
✔ Zend_test 
✔ PHPUnit 
✔ Atoum 
Roadmap 
✔ ... D7 D8 D9 
SimpleTest 
PHPUnit
Cas pratique avec PHPUnit
Installation 
En ligne de commandes 
# sudo apt-get install phpunit 
# pear channel-discover pear.phpunit.de 
# pear channel-discover components.ez.no 
# pear channel-discover pear.symfony-project.com 
En mode assistée 
Avec IDE 
- Windows 
- Eclipse PDT 
- Linux 
- Netbeans 
- Mac
Tests unitaires : cas 1 
Du code... +ieurs commentaires 
<?php 
class calculs 
{ 
public function add($a, $b) 
{ 
return $a + $b; 
} 
} 
?> 
<?php 
class calculs 
{ 
/** 
* @assert (0, 0) == 0 
* @assert (0, 1) == 1 
* @assert (1, 0) == 1 
* @assert (1, 1) == 2 
* @assert (1, 2) == 3 
*/ 
public function add($a, $b) 
{ 
return $a + $b; 
} 
} 
?>
Tests unitaires : cas 1 
1 commentaire Passer au test 
<?php 
class calculs 
{ 
/** 
* @assert (1, 1) == 2 
*/ 
public function add($a, $b) 
{ 
return $a + $b; 
} 
} 
?> 
<?php 
/** 
* Generated from @assert (1, 1) == 2 
*/ 
public function testAdd() 
{ 
$this->assertEquals( 
2, 
$this->object->add(1, 1) 
); 
} 
?>
Fonctionnement PHPUnit avec Drupal 
✔ Boostrap 
✔ Script d'amorcage 
✔ Construction autonome 
✔ Etendre le Boostrap 
✔ Emplacement du fichier 
✔ Déclarer les SLASHs 
✔ Recherche de racine Drupal 
✔ Chargeons boostrap.inc 
✔ Execution
PHPUnit avec Drupal : Comprendre 
<?php 
define('DRUPAL_ROOT', realpath(dirname(__FILE__) ) . DS ); 
set_include_path(DRUPAL_ROOT . get_include_path()); 
include_once DRUPAL_ROOT . 'includes' . DS . 'bootstrap.inc'; 
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); 
class base_test extends PHPUnit_Framework_TestCase 
{ 
public function test_one_more_one_is_two() 
{ 
$this->assertEquals(1+1,2); 
} 
} 
?>
Résultat 
. Le test est réussi 
F l'assertion a échoué 
E Erreur Exécution 
S Problème inconnu 
I Test incomplet
Module & PHPUnit & Drupal
Module & PHPUnit & Drupal (1/2) 
<?php 
/** 
* Implementation hook_help() 
*/ 
function drupalcampmontreal_help($path, $arg) { 
switch ($path) { 
case 'admin/help#drupalcampmontreal': 
$output = '<h3>A propos de : DrupalCamp Montréal</h3>'; 
$output .= '<p>Exemple de module test DrupalCamp Montréal 2014</p>'; 
return $output; 
} 
} 
✔ 
drupalmontreal.module
Module & PHPUnit & Drupal (2/2) 
drupalcampmontreal.test.php 
<?php 
include_once DRUPAL_ROOT . 'includes/bootstrap.inc'; 
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); 
class drupalcampmontreal_test extends PHPUnit_Framework_TestCase 
{ 
public function test_function_help() 
{ 
$output = '<h3>A propos de : DrupalCamp Montréal</h3>'; 
$output .= '<p>Exemple de module test DrupalCamp Montréal 2014</p>'; 
$this->assertEquals(drupalcampmontreal_help('admin/help#drupalcampmontreal'), $output ); 
} 
...
Résultat
Tests Fonctionnels... En pratique
Tests Fonctionnels 
Déroulement Quoi tester ? 
✔ Prépare outil & API 
✔ Vérifie l'intégration des 
différents composants 
✔ On le partage 
✔ On récupère le résultat 
✔ Nous... Rien 
✔ C'est le client
Tests Fonctionnels : utilisation 
Outils 
✔ Selenium 
✔ Casper.js & Phantom.js 
✔ Cucumber 
✔ GreenPepper 
✔ ... 
D7 D8 D9 
Roadmap 
Selenium 
Casper.js 
Phantom.js
Cas pratique avec Selenium
Tests Fonctionnels : utilisation
Différents Selenium 
● Selenium *.jar 
● Selenium IDE 
– Extension Firefox 
● SeleniumHQ 
– Compatible avec tous les navigateurs 
http://www.seleniumhq.org/
Utilisation de Selenium
Selenium seul
Selenium et Drupal 
✔ Module selenium 
✔ S'appuie sur SimpleTest 
Selenium pour PHPUnit
Installation PHP Unit & Selenium 
# sudo apt-get install phpunit 
# sudo apt-get install php5-curl 
# sudo apt-get install php-selenium 
En mode assistée 
- Windows 
- Linux 
- Mac 
Avec IDE 
- Eclipse PDT 
- Netbeans
Utilisation PHP Unit & Selenium (1/2) 
<?php 
class TestLogin extends PHPUnit_Extensions_Selenium2TestCase { 
public function setUp() 
{ 
$this->setHost('localhost'); 
$this->setPort(4444); 
$this->setBrowser('firefox'); 
$this->setBrowserUrl('http://localhost/seleniumTut'); 
} 
public function testHasLoginForm() 
{ 
$this->url('index.php'); 
$username = $this->byName('username'); 
$password = $this->byName('password'); 
$this->assertEquals('', $username->value()); 
$this->assertEquals('', $password->value()); 
}
Utilisation PHP Unit & Selenium (2/2) 
<?php 
public function testSubmitButtonIsDisabledUntilFieldsAreFilled() 
{ 
$this->url('index.php'); 
$username = $this->byName('username'); 
$password = $this->byName('password'); 
$submit = $this->byId('submit'); 
$this->assertFalse($submit->enabled()); 
$username->value('votreLogin'); 
$password->value('votrePassword'); 
$this->assertTrue($submit->enabled()); 
$username->clear(); 
$password->clear(); 
$username->value(' '); 
$this->assertFalse($submit->enabled()); 
} 
?>
PHPUnit / Selenium / Drupal (1/3)
PHPUnit / Selenium / Drupal (2/3) 
<?php 
class drupalcampmontreal_test extends PHPUnit_Extensions_Selenium2TestCase { 
public function setUp() 
{ 
$this->setHost('localhost'); 
$this->setPort(4444); 
$this->setBrowser('firefox'); 
$this->setBrowserUrl('http://localhost/drupal7'); 
} 
public function testSite() 
{ 
$this->setBrowserurl ('index.php'); 
}
PHPUnit / Selenium / Drupal (3/3) 
public function testOuverturePageTypeMenu() { 
$this->open ( 
"http://localhost/drupal-test/admin/menus/diner" ); 
$this->assertElementValueEquals ( 'name', '' ); 
$this->assertElementValueEquals ( 'listlieu', '' ); 
}
Au final... les tests associés 
$ cd votreSite 
$ phpunit sites/all/modules/menus/menus.test.php
Tests Intégrations... En pratique
Tests Intégrations 
Déroulement Pourquoi ? 
✔ 1 Navigation de la prod. 
✔ Générer le script pour 
repérer les modifications 
de comportement 
✔ 1 exécution sur le 
nouveau serveur 
✔ Simulation d'un être 
humain 
✔ Détection des problèmes 
éventuels
Tests Intégrations : utilisation 
Outils 
✔ Selenium 
✔ Sikuli 
✔ Hudson / Jenkins 
✔ PhpUnderControl 
✔ Behat/Mink 
✔ Sahi 
✔ PHPCov 
✔ ... 
D7 D8 D9 
Roadmap 
Selenium 
Behat+mink
Cas pratique avec Behat
Utilisation 
# pear channel-discover pear.symfony.com 
# pear channel-discover pear.behat.org 
# pear install behat/behat 
http://docs.behat.org/ 
{ 
"require": { 
"behat/behat": 
"2.4.*@stable" 
}, 
"minimum-stability": "dev", 
"config": { 
"bin-dir": "bin/" 
} 
} 
Contexte 
Evénements 
Résultat
Utilisation par le code Behat/Mink 
require_once 'mink/autoload.php'; 
class FeatureContext extends BehatMinkBehatContextMinkContext { 
/** 
* @Given /^Je suis identifie "([^"]*)"$/ 
*/ 
public function jeSuisIdentifie($username) 
{ 
return array( 
new StepGiven('I go to "login.php"') 
,new StepWhen("I fill in 'Mon nom' with '$username' ") 
,new StepWhen("I fill in 'Mon mot de passe' with '$password' ") 
,new StepWhen('I press "Login"') 
); 
} 
}
Behat / Mint / Drupal (1/3) 
Module behat 
# curl -s https://getcomposer.org/installer | php 
# php composer.phar install 
# wget http://selenium...../selenium-server-standalone-2.26.0.jar 
Behat.yml 
default: 
context: 
extensions: 
BehatMinkExtensionExtension: 
base_url: 'http://localhost' 
goutte: ~ 
selenium2: ~
Behat / Mint / Drupal (2/3) 
menus.feature 
Scenario: Submits diner when required fields are filled out 
Given I am on "/" 
When I follow "diner" 
And I fill in "Your name" with "#name" 
And I fill in "Your lieu" with "#lieu" 
And I press "add" 
Then I should see "diner ajouter"
Behat / Mint / Drupal (3/3) 
$ bin/behat features/menus.feature 
© http://drupalwatchdog.com/volume-2/issue-2/behat-and-mink
Les autres Tests …. 
Ils seront 
abordés 
dans la 
journée 
Ils seront 
abordés 
dans la 
journée
Merci 
http://blog.hello-design.fr 
@hellosct1 Questions ?

Contenu connexe

Tendances

20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
Arnaud Héritier
 
Power shell saturday Paris 2017 Omiossec
Power shell saturday  Paris 2017 OmiossecPower shell saturday  Paris 2017 Omiossec
Power shell saturday Paris 2017 Omiossec
Olivier Miossec
 
"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012
Jean-Michel Doudoux
 
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Fabien Arcellier
 
JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924
Gregory Boissinot
 
20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven
Arnaud Héritier
 
Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2
teejug
 
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
vincent aniort
 
DevOps avec Ansible et Docker
DevOps avec Ansible et DockerDevOps avec Ansible et Docker
DevOps avec Ansible et Docker
Stephane Manciot
 
Apache Maven 3
Apache Maven 3Apache Maven 3
Apache Maven 3
Maxime Gréau
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
Martin Latrille
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHP
julien pauli
 
Jenkins Workflow
Jenkins WorkflowJenkins Workflow
Jenkins Workflow
Jean Detoeuf
 
Jenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverteJenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverte
Stephane Couzinier
 
Procédure de configuration et préparation de l’environnement sous windows
Procédure de configuration et préparation de l’environnement sous windowsProcédure de configuration et préparation de l’environnement sous windows
Procédure de configuration et préparation de l’environnement sous windows
Addi Ait-Mlouk
 
20111220 lyon jug-packaging-natif
20111220 lyon jug-packaging-natif20111220 lyon jug-packaging-natif
20111220 lyon jug-packaging-natif
Henri Gomez
 
Présentation Maven
Présentation MavenPrésentation Maven
Présentation Maven
SOAT
 
Presentation du gestionnaire de configuration Puppet
Presentation du gestionnaire de configuration PuppetPresentation du gestionnaire de configuration Puppet
Presentation du gestionnaire de configuration Puppet
Aurélie Henriot
 

Tendances (20)

20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 
Power shell saturday Paris 2017 Omiossec
Power shell saturday  Paris 2017 OmiossecPower shell saturday  Paris 2017 Omiossec
Power shell saturday Paris 2017 Omiossec
 
"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012
 
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
 
Sonar-Hodson-Maven
Sonar-Hodson-MavenSonar-Hodson-Maven
Sonar-Hodson-Maven
 
JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924
 
20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven
 
Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2
 
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
Node, Grunt et leurs copains qui font de l’accessibilité tout seuls !
 
DevOps avec Ansible et Docker
DevOps avec Ansible et DockerDevOps avec Ansible et Docker
DevOps avec Ansible et Docker
 
Apache Maven 3
Apache Maven 3Apache Maven 3
Apache Maven 3
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHP
 
Ansib formation-ansible
Ansib formation-ansibleAnsib formation-ansible
Ansib formation-ansible
 
Jenkins Workflow
Jenkins WorkflowJenkins Workflow
Jenkins Workflow
 
Jenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverteJenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverte
 
Procédure de configuration et préparation de l’environnement sous windows
Procédure de configuration et préparation de l’environnement sous windowsProcédure de configuration et préparation de l’environnement sous windows
Procédure de configuration et préparation de l’environnement sous windows
 
20111220 lyon jug-packaging-natif
20111220 lyon jug-packaging-natif20111220 lyon jug-packaging-natif
20111220 lyon jug-packaging-natif
 
Présentation Maven
Présentation MavenPrésentation Maven
Présentation Maven
 
Presentation du gestionnaire de configuration Puppet
Presentation du gestionnaire de configuration PuppetPresentation du gestionnaire de configuration Puppet
Presentation du gestionnaire de configuration Puppet
 

Similaire à Des tests modernes pour Drupal

Effectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupalEffectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupal
neuros
 
Effectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupalEffectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupal
Christophe Villeneuve
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
fdussert
 
20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif
Henri Gomez
 
Comment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguerComment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguer
Damien Seguy
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
Abdoulaye Dieng
 
Utilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHPUtilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHP
Jean-Marc Fontaine
 
Valider par des tests - Blend
Valider par des tests - BlendValider par des tests - Blend
Valider par des tests - Blend
Christophe Villeneuve
 
Présentation devops&puppet 04112014
Présentation devops&puppet 04112014 Présentation devops&puppet 04112014
Présentation devops&puppet 04112014
Roberto Barros De Sousa
 
WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
 WordCamp Lyon 2015 - WordPress, Git et l'intégration continue WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
Stéphane HULARD
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
Vincent Composieux
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec Symfony
Hugo Hamon
 
Traits : de la théorie à la pratique
Traits : de la théorie à la pratiqueTraits : de la théorie à la pratique
Traits : de la théorie à la pratique
Frederic Hardy
 
Integrons en mode continu
Integrons en mode continuIntegrons en mode continu
Integrons en mode continu
neuros
 
l'Industrialisation (avec PHP) @MMIConnect
l'Industrialisation (avec PHP) @MMIConnectl'Industrialisation (avec PHP) @MMIConnect
l'Industrialisation (avec PHP) @MMIConnect
Florent DENIS
 
PHP #4 : sessions & cookies
PHP #4 : sessions & cookiesPHP #4 : sessions & cookies
PHP #4 : sessions & cookies
Jean Michel
 
Gitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueGitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement Continue
Vincent Composieux
 
Les tests en PHP
Les tests en PHPLes tests en PHP
Les tests en PHP
Jean-Philippe Chateau
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'ts
Julien Wittouck
 

Similaire à Des tests modernes pour Drupal (20)

Effectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupalEffectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupal
 
Effectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupalEffectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupal
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
 
20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif
 
Comment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguerComment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguer
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Utilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHPUtilisation optimale et professionnelle de PHP
Utilisation optimale et professionnelle de PHP
 
Valider par des tests - Blend
Valider par des tests - BlendValider par des tests - Blend
Valider par des tests - Blend
 
Présentation devops&puppet 04112014
Présentation devops&puppet 04112014 Présentation devops&puppet 04112014
Présentation devops&puppet 04112014
 
WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
 WordCamp Lyon 2015 - WordPress, Git et l'intégration continue WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec Symfony
 
Traits : de la théorie à la pratique
Traits : de la théorie à la pratiqueTraits : de la théorie à la pratique
Traits : de la théorie à la pratique
 
Integrons en mode continu
Integrons en mode continuIntegrons en mode continu
Integrons en mode continu
 
l'Industrialisation (avec PHP) @MMIConnect
l'Industrialisation (avec PHP) @MMIConnectl'Industrialisation (avec PHP) @MMIConnect
l'Industrialisation (avec PHP) @MMIConnect
 
PHP #4 : sessions & cookies
PHP #4 : sessions & cookiesPHP #4 : sessions & cookies
PHP #4 : sessions & cookies
 
Nagios
NagiosNagios
Nagios
 
Gitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueGitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement Continue
 
Les tests en PHP
Les tests en PHPLes tests en PHP
Les tests en PHP
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'ts
 

Plus de Christophe Villeneuve

MariaDB une base de donnees NewSQL
MariaDB une base de donnees NewSQLMariaDB une base de donnees NewSQL
MariaDB une base de donnees NewSQL
Christophe Villeneuve
 
La boîte à outils de développements dans Firefox
La boîte à outils de développements dans FirefoxLa boîte à outils de développements dans Firefox
La boîte à outils de développements dans Firefox
Christophe Villeneuve
 
pister les pisteurs
pister les pisteurspister les pisteurs
pister les pisteurs
Christophe Villeneuve
 
controler vos donnees éthiques dans le web
controler vos donnees éthiques dans le webcontroler vos donnees éthiques dans le web
controler vos donnees éthiques dans le web
Christophe Villeneuve
 
Infrastructure as code drupal
Infrastructure as code drupalInfrastructure as code drupal
Infrastructure as code drupal
Christophe Villeneuve
 
Mariadb une base de données NewSQL
Mariadb une base de données NewSQLMariadb une base de données NewSQL
Mariadb une base de données NewSQL
Christophe Villeneuve
 
Open Source et contribution : Une association gagnante
Open Source et contribution : Une association gagnanteOpen Source et contribution : Une association gagnante
Open Source et contribution : Une association gagnante
Christophe Villeneuve
 
Pentest bus pirate
Pentest bus piratePentest bus pirate
Pentest bus pirate
Christophe Villeneuve
 
Peur de la migration vers l’open source ?
Peur de la migration vers l’open source ?Peur de la migration vers l’open source ?
Peur de la migration vers l’open source ?
Christophe Villeneuve
 
La sécurité applicative par le design
La sécurité applicative par le designLa sécurité applicative par le design
La sécurité applicative par le design
Christophe Villeneuve
 
Foxfooding semaine 3
Foxfooding semaine 3Foxfooding semaine 3
Foxfooding semaine 3
Christophe Villeneuve
 
Foxfooding
FoxfoodingFoxfooding
Accessibilite web wcag rgaa
Accessibilite web wcag rgaaAccessibilite web wcag rgaa
Accessibilite web wcag rgaa
Christophe Villeneuve
 
Mozilla french speaking community activites
Mozilla french speaking community activitesMozilla french speaking community activites
Mozilla french speaking community activites
Christophe Villeneuve
 
Monitoring dynamique : Grafana et Microsoft
Monitoring dynamique : Grafana et MicrosoftMonitoring dynamique : Grafana et Microsoft
Monitoring dynamique : Grafana et Microsoft
Christophe Villeneuve
 
Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?
Christophe Villeneuve
 
Le futur de l'authentification webAuthn
Le futur de l'authentification webAuthnLe futur de l'authentification webAuthn
Le futur de l'authentification webAuthn
Christophe Villeneuve
 
Send large files with addons
Send large files with addonsSend large files with addons
Send large files with addons
Christophe Villeneuve
 
Tests d'accessibilite par la pratique
Tests d'accessibilite par la pratiqueTests d'accessibilite par la pratique
Tests d'accessibilite par la pratique
Christophe Villeneuve
 
Donnez la voix aux machines
Donnez la voix aux machinesDonnez la voix aux machines
Donnez la voix aux machines
Christophe Villeneuve
 

Plus de Christophe Villeneuve (20)

MariaDB une base de donnees NewSQL
MariaDB une base de donnees NewSQLMariaDB une base de donnees NewSQL
MariaDB une base de donnees NewSQL
 
La boîte à outils de développements dans Firefox
La boîte à outils de développements dans FirefoxLa boîte à outils de développements dans Firefox
La boîte à outils de développements dans Firefox
 
pister les pisteurs
pister les pisteurspister les pisteurs
pister les pisteurs
 
controler vos donnees éthiques dans le web
controler vos donnees éthiques dans le webcontroler vos donnees éthiques dans le web
controler vos donnees éthiques dans le web
 
Infrastructure as code drupal
Infrastructure as code drupalInfrastructure as code drupal
Infrastructure as code drupal
 
Mariadb une base de données NewSQL
Mariadb une base de données NewSQLMariadb une base de données NewSQL
Mariadb une base de données NewSQL
 
Open Source et contribution : Une association gagnante
Open Source et contribution : Une association gagnanteOpen Source et contribution : Une association gagnante
Open Source et contribution : Une association gagnante
 
Pentest bus pirate
Pentest bus piratePentest bus pirate
Pentest bus pirate
 
Peur de la migration vers l’open source ?
Peur de la migration vers l’open source ?Peur de la migration vers l’open source ?
Peur de la migration vers l’open source ?
 
La sécurité applicative par le design
La sécurité applicative par le designLa sécurité applicative par le design
La sécurité applicative par le design
 
Foxfooding semaine 3
Foxfooding semaine 3Foxfooding semaine 3
Foxfooding semaine 3
 
Foxfooding
FoxfoodingFoxfooding
Foxfooding
 
Accessibilite web wcag rgaa
Accessibilite web wcag rgaaAccessibilite web wcag rgaa
Accessibilite web wcag rgaa
 
Mozilla french speaking community activites
Mozilla french speaking community activitesMozilla french speaking community activites
Mozilla french speaking community activites
 
Monitoring dynamique : Grafana et Microsoft
Monitoring dynamique : Grafana et MicrosoftMonitoring dynamique : Grafana et Microsoft
Monitoring dynamique : Grafana et Microsoft
 
Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?
 
Le futur de l'authentification webAuthn
Le futur de l'authentification webAuthnLe futur de l'authentification webAuthn
Le futur de l'authentification webAuthn
 
Send large files with addons
Send large files with addonsSend large files with addons
Send large files with addons
 
Tests d'accessibilite par la pratique
Tests d'accessibilite par la pratiqueTests d'accessibilite par la pratique
Tests d'accessibilite par la pratique
 
Donnez la voix aux machines
Donnez la voix aux machinesDonnez la voix aux machines
Donnez la voix aux machines
 

Des tests modernes pour Drupal

  • 1. Des tests 'MODERNES' pour Drupal Christophe Villeneuve @hellosct1
  • 2. Qui... est Christophe Villeneuve ? << afup – lemug.fr – mysql – mariadb – drupal – demoscene – firefoxos – drupagora – phptour – forumphp – solutionlinux – demoinparis – ici et maintenant – eyrolles – editions eni – programmez – linux pratique – webriver – phptv – neuros - elephpant
  • 3. Support présentation aujourd'hui Disponible sur http://www.eyrolles.fr Drupal avancé – un CMS pour développeurs par Christophe Villeneuve et Vanessa Kovalsky David aux Editions EYROLLES
  • 4. Expérience sur... Les tests Citations ✔ « Des fois cela plante » ✔ « On a testé, … il y a 3 mois lors de la dernière livraison... Pas eu le temps... »
  • 5. L'importance des tests Pourquoi c'est utile ? Et L'intérêt... ✔ Le code peut casser ✔ Changer le nom d'un fichier ✔ Pas le temps d'en faire ✔ C'est long manuellement ✔ Coûte du temps au début ✔ En fait gain après ✔ Nécessite de la rigueur et de la constante
  • 6. Les différents types de tests Tests Unitaires ● Module / classe / méthode Tests fonctionnels ● l'interface utilisateur testée par le client Tests intégrations ● Tester la navigation, et l'interface utilisateur Tests Automatisés Tests de charges Tests d'ergonomie Tests de sécurité
  • 8. Tests unitaires Déroulement Quoi tester ? ✔ Existe-t-il ? ✔ Ecrire un test qui échoue ✔ Ecrire un test qui est bon ✔ Un test de sécurité ✔ Un test de contrôle ✔ Un module ✔ Une classe ✔ Une méthode ✔ Tester ✔ Ce qui est important ✔ Le risque de casser ✔ Les parties que vous touchez souvent
  • 9. Tests unitaires : Les API ✔ jUnit ✔ SimpleTest ✔ Zend_test ✔ PHPUnit ✔ Atoum Roadmap ✔ ... D7 D8 D9 SimpleTest PHPUnit
  • 10. Cas pratique avec PHPUnit
  • 11. Installation En ligne de commandes # sudo apt-get install phpunit # pear channel-discover pear.phpunit.de # pear channel-discover components.ez.no # pear channel-discover pear.symfony-project.com En mode assistée Avec IDE - Windows - Eclipse PDT - Linux - Netbeans - Mac
  • 12. Tests unitaires : cas 1 Du code... +ieurs commentaires <?php class calculs { public function add($a, $b) { return $a + $b; } } ?> <?php class calculs { /** * @assert (0, 0) == 0 * @assert (0, 1) == 1 * @assert (1, 0) == 1 * @assert (1, 1) == 2 * @assert (1, 2) == 3 */ public function add($a, $b) { return $a + $b; } } ?>
  • 13. Tests unitaires : cas 1 1 commentaire Passer au test <?php class calculs { /** * @assert (1, 1) == 2 */ public function add($a, $b) { return $a + $b; } } ?> <?php /** * Generated from @assert (1, 1) == 2 */ public function testAdd() { $this->assertEquals( 2, $this->object->add(1, 1) ); } ?>
  • 14. Fonctionnement PHPUnit avec Drupal ✔ Boostrap ✔ Script d'amorcage ✔ Construction autonome ✔ Etendre le Boostrap ✔ Emplacement du fichier ✔ Déclarer les SLASHs ✔ Recherche de racine Drupal ✔ Chargeons boostrap.inc ✔ Execution
  • 15. PHPUnit avec Drupal : Comprendre <?php define('DRUPAL_ROOT', realpath(dirname(__FILE__) ) . DS ); set_include_path(DRUPAL_ROOT . get_include_path()); include_once DRUPAL_ROOT . 'includes' . DS . 'bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); class base_test extends PHPUnit_Framework_TestCase { public function test_one_more_one_is_two() { $this->assertEquals(1+1,2); } } ?>
  • 16. Résultat . Le test est réussi F l'assertion a échoué E Erreur Exécution S Problème inconnu I Test incomplet
  • 17. Module & PHPUnit & Drupal
  • 18. Module & PHPUnit & Drupal (1/2) <?php /** * Implementation hook_help() */ function drupalcampmontreal_help($path, $arg) { switch ($path) { case 'admin/help#drupalcampmontreal': $output = '<h3>A propos de : DrupalCamp Montréal</h3>'; $output .= '<p>Exemple de module test DrupalCamp Montréal 2014</p>'; return $output; } } ✔ drupalmontreal.module
  • 19. Module & PHPUnit & Drupal (2/2) drupalcampmontreal.test.php <?php include_once DRUPAL_ROOT . 'includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); class drupalcampmontreal_test extends PHPUnit_Framework_TestCase { public function test_function_help() { $output = '<h3>A propos de : DrupalCamp Montréal</h3>'; $output .= '<p>Exemple de module test DrupalCamp Montréal 2014</p>'; $this->assertEquals(drupalcampmontreal_help('admin/help#drupalcampmontreal'), $output ); } ...
  • 22. Tests Fonctionnels Déroulement Quoi tester ? ✔ Prépare outil & API ✔ Vérifie l'intégration des différents composants ✔ On le partage ✔ On récupère le résultat ✔ Nous... Rien ✔ C'est le client
  • 23. Tests Fonctionnels : utilisation Outils ✔ Selenium ✔ Casper.js & Phantom.js ✔ Cucumber ✔ GreenPepper ✔ ... D7 D8 D9 Roadmap Selenium Casper.js Phantom.js
  • 24. Cas pratique avec Selenium
  • 25. Tests Fonctionnels : utilisation
  • 26. Différents Selenium ● Selenium *.jar ● Selenium IDE – Extension Firefox ● SeleniumHQ – Compatible avec tous les navigateurs http://www.seleniumhq.org/
  • 29. Selenium et Drupal ✔ Module selenium ✔ S'appuie sur SimpleTest Selenium pour PHPUnit
  • 30. Installation PHP Unit & Selenium # sudo apt-get install phpunit # sudo apt-get install php5-curl # sudo apt-get install php-selenium En mode assistée - Windows - Linux - Mac Avec IDE - Eclipse PDT - Netbeans
  • 31. Utilisation PHP Unit & Selenium (1/2) <?php class TestLogin extends PHPUnit_Extensions_Selenium2TestCase { public function setUp() { $this->setHost('localhost'); $this->setPort(4444); $this->setBrowser('firefox'); $this->setBrowserUrl('http://localhost/seleniumTut'); } public function testHasLoginForm() { $this->url('index.php'); $username = $this->byName('username'); $password = $this->byName('password'); $this->assertEquals('', $username->value()); $this->assertEquals('', $password->value()); }
  • 32. Utilisation PHP Unit & Selenium (2/2) <?php public function testSubmitButtonIsDisabledUntilFieldsAreFilled() { $this->url('index.php'); $username = $this->byName('username'); $password = $this->byName('password'); $submit = $this->byId('submit'); $this->assertFalse($submit->enabled()); $username->value('votreLogin'); $password->value('votrePassword'); $this->assertTrue($submit->enabled()); $username->clear(); $password->clear(); $username->value(' '); $this->assertFalse($submit->enabled()); } ?>
  • 33. PHPUnit / Selenium / Drupal (1/3)
  • 34. PHPUnit / Selenium / Drupal (2/3) <?php class drupalcampmontreal_test extends PHPUnit_Extensions_Selenium2TestCase { public function setUp() { $this->setHost('localhost'); $this->setPort(4444); $this->setBrowser('firefox'); $this->setBrowserUrl('http://localhost/drupal7'); } public function testSite() { $this->setBrowserurl ('index.php'); }
  • 35. PHPUnit / Selenium / Drupal (3/3) public function testOuverturePageTypeMenu() { $this->open ( "http://localhost/drupal-test/admin/menus/diner" ); $this->assertElementValueEquals ( 'name', '' ); $this->assertElementValueEquals ( 'listlieu', '' ); }
  • 36. Au final... les tests associés $ cd votreSite $ phpunit sites/all/modules/menus/menus.test.php
  • 38. Tests Intégrations Déroulement Pourquoi ? ✔ 1 Navigation de la prod. ✔ Générer le script pour repérer les modifications de comportement ✔ 1 exécution sur le nouveau serveur ✔ Simulation d'un être humain ✔ Détection des problèmes éventuels
  • 39. Tests Intégrations : utilisation Outils ✔ Selenium ✔ Sikuli ✔ Hudson / Jenkins ✔ PhpUnderControl ✔ Behat/Mink ✔ Sahi ✔ PHPCov ✔ ... D7 D8 D9 Roadmap Selenium Behat+mink
  • 41. Utilisation # pear channel-discover pear.symfony.com # pear channel-discover pear.behat.org # pear install behat/behat http://docs.behat.org/ { "require": { "behat/behat": "2.4.*@stable" }, "minimum-stability": "dev", "config": { "bin-dir": "bin/" } } Contexte Evénements Résultat
  • 42. Utilisation par le code Behat/Mink require_once 'mink/autoload.php'; class FeatureContext extends BehatMinkBehatContextMinkContext { /** * @Given /^Je suis identifie "([^"]*)"$/ */ public function jeSuisIdentifie($username) { return array( new StepGiven('I go to "login.php"') ,new StepWhen("I fill in 'Mon nom' with '$username' ") ,new StepWhen("I fill in 'Mon mot de passe' with '$password' ") ,new StepWhen('I press "Login"') ); } }
  • 43. Behat / Mint / Drupal (1/3) Module behat # curl -s https://getcomposer.org/installer | php # php composer.phar install # wget http://selenium...../selenium-server-standalone-2.26.0.jar Behat.yml default: context: extensions: BehatMinkExtensionExtension: base_url: 'http://localhost' goutte: ~ selenium2: ~
  • 44. Behat / Mint / Drupal (2/3) menus.feature Scenario: Submits diner when required fields are filled out Given I am on "/" When I follow "diner" And I fill in "Your name" with "#name" And I fill in "Your lieu" with "#lieu" And I press "add" Then I should see "diner ajouter"
  • 45. Behat / Mint / Drupal (3/3) $ bin/behat features/menus.feature © http://drupalwatchdog.com/volume-2/issue-2/behat-and-mink
  • 46. Les autres Tests …. Ils seront abordés dans la journée Ils seront abordés dans la journée