SlideShare une entreprise Scribd logo
1  sur  39
Télécharger pour lire hors ligne
2013

Effectuer des tests modernes
pour Drupal
@hellosct1
Qui ?

Christophe
Villeneuve

@hellosct1
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 ?
✔

✔

✔

Le code peut casser
Changer le nom d'un
fichier

Et L'intérêt...
✔

✔

En fait gagner
ensuite

Pas le temps d'en faire
✔

✔

Coûte du temps au
début

C'est long
manuellement

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
Tests
Tests
Tests

Automatisés
de charges
d'ergonomie
de sécurité
Tests unitaires... En pratique
Tests unitaires
Déroulement
✔

✔

✔
✔

Ecrire un test qui
échoue
Ecrire un test qui
est bon
Un test de sécurité
Un test de
contrôle

Quoi tester ?
✔
✔
✔

✔

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
D8
✔
✔
✔
✔
✔
✔

jUnit
SimpleTest
Zend_test
PHPUnit
Atoum
...
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
- Windows
- Linux
- Mac

Avec IDE
- Eclipse PDT
- Netbeans
Tests unitaires : 1
Du code...
<?php
class calculs
{

+ieurs commentaires

<?php
class calculs
{
/**
* @assert (0, 0) == 0

public function add($a, $b)

* @assert (0, 1) == 1

{

* @assert (1, 0) == 1

return $a + $b;

* @assert (1, 1) == 2
* @assert (1, 2) == 4

}

*/

}

public function add($a, $b)

?>

{
return $a + $b;
}
}
?>
Tests unitaires : 1
1 commentaire
<?php

Passer au test
<?php

class calculs

/**

{

* Generated from @assert (1, 1) == 2
*/

/**
* @assert (0, 0) == 0
*/

public function testAdd()
{
$this->assertEquals(

public function add($a, $b)

2,

{

$this->object->add(1, 1)

return $a + $b;
}
}
?>

);
}
?>
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
<?php
define('DRUPAL_ROOT', realpath(dirname(__FILE__) ) . PATH );
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_plus_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)
drupagora.module
<?php
/**
* Implementation hook_help()
*/
function drupagora_help($path, $arg) {
switch ($path) {
case 'admin/help#drupagora':
$output = '<h3>A propos du module : Drupagora</h3>';
$output .= '<p>Exemple de module pour le livre : Drupal Avancé
aux éditions Eyrolles</p>';
return $output;
}
}
✔
Module & PHPUnit & Drupal (2/2)
drupagora.test.php
<?php
include_once DRUPAL_ROOT . 'includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
class drupagora_test extends PHPUnit_Framework_TestCase
{
public function test_function_help()
{
$output = '<h3>A propos du module : Drupagora</h3>';
$output .= '<p>Exemple de module pour le livre : Drupal Avancé aux
éditions Eyrolles</p>';
$this->assertEquals(
$output
);
}
...

menu_for_all_help('admin/help#drupagora'),
Résultat
Tests Fonctionnels... En pratique
Tests Fonctionnels
Déroulement
✔
✔
✔

Prépare outil & API
On le partage
On récupère le
résultat

Quoi tester ?
✔
✔

Nous... Rien
C'est le client
Tests Fonctionnels : utilisation
Outils
✔
✔
✔
✔
✔

Selenium
Behat
Fitness
Cucumber
GreenPepper
Cas pratique avec Selenium
Tests Fonctionnels : utilisation
Utilisation de Selenium
Selenium *.jar
Selenium IDE... Extension Firefox
Selenium HQ... Compatible avec les browsers
Utilisation de Selenium
Selenium et Drupal
✔

Module selenium
✔
S'appuie sur SimpleTest
Tests Intégrations... En pratique
Tests Intégrations
Déroulement
✔

✔

✔

1 Navigation de la
prod.
Générer le script
pour repérer les
modifications de
comportement
1 exécution sur le
nouveau serveur

Pourquoi ?
✔

✔

Simulation d'un
être humain
Détection des
problèmes
éventuels
Tests Intégrations : utilisation
Outils
✔
✔
✔
✔
✔
✔

Selenium
Sikuli
Hudson
Jenkins
PhpUnderControl
...
Cas pratique avec PHPUnit & Selenium
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
<?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
<?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('hello');
$password->value('1234');
$this->assertTrue($submit->enabled());
$username->clear();
$password->clear();
$username->value(' ');
$this->assertFalse($submit->enabled());
}
?>
PHPUnit / Selenium / Drupal
<?php
class drupagora_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
public function testOuverturePageTypeMenu() {
$this->open (
"http://localhost/drupal7/admin/menus/diner" );
$this->assertElementValueEquals ( 'name', '' );
}
Au final... les tests associés
$ cd votreSite
$ phpunit sites/all/modules/menus/menus.test.php
Ils ont été
Ils ont été
abordés
abordés
toute la
toute la
journée
journée

Les autres Tests ….
Merci
@neuros_paris
http://www.neuros.fr

@hellosct1
http://www.webriver.eu
http://blog.hello-design.fr

Contenu connexe

Similaire à Effectuer des tests modernes pour drupal

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
 
Université de la performance - Devoxx France
Université de la performance - Devoxx FranceUniversité de la performance - Devoxx France
Université de la performance - Devoxx France
Marc Bojoly
 
Formation tests decembre2010
Formation tests decembre2010Formation tests decembre2010
Formation tests decembre2010
Fou Cha
 
Industrialisation Du Logiciel - Introduction Et Bonnes Pratiques
Industrialisation Du Logiciel  - Introduction Et Bonnes PratiquesIndustrialisation Du Logiciel  - Introduction Et Bonnes Pratiques
Industrialisation Du Logiciel - Introduction Et Bonnes Pratiques
Emmanuel Hugonnet
 

Similaire à Effectuer des tests modernes pour drupal (20)

Déployer avec les tests
Déployer avec les testsDéployer avec les tests
Déployer avec les tests
 
Automatisation des tests - objectifs et concepts - partie 1
Automatisation des tests  - objectifs et concepts - partie 1Automatisation des tests  - objectifs et concepts - partie 1
Automatisation des tests - objectifs et concepts - partie 1
 
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
 
Les aventuriers des tests exploratoires : à la poursuite du bug perdu V. Théa...
Les aventuriers des tests exploratoires : à la poursuite du bug perdu V. Théa...Les aventuriers des tests exploratoires : à la poursuite du bug perdu V. Théa...
Les aventuriers des tests exploratoires : à la poursuite du bug perdu V. Théa...
 
Guide tests fonctionnels
Guide tests fonctionnelsGuide tests fonctionnels
Guide tests fonctionnels
 
Test unitaires
Test unitairesTest unitaires
Test unitaires
 
Présentation projet de fin d'étude
Présentation projet de fin d'étudePrésentation projet de fin d'étude
Présentation projet de fin d'étude
 
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...
 
On test quoi - DCLannion 2017
On test quoi - DCLannion 2017On test quoi - DCLannion 2017
On test quoi - DCLannion 2017
 
Field research and interaction design: course #6
Field research and interaction design: course #6Field research and interaction design: course #6
Field research and interaction design: course #6
 
Perf university
Perf universityPerf university
Perf university
 
Université de la performance - Devoxx France
Université de la performance - Devoxx FranceUniversité de la performance - Devoxx France
Université de la performance - Devoxx France
 
Toolbox du designer : Useberry
Toolbox du designer : UseberryToolbox du designer : Useberry
Toolbox du designer : Useberry
 
13-Cours de Géniel Logiciel
13-Cours de Géniel Logiciel13-Cours de Géniel Logiciel
13-Cours de Géniel Logiciel
 
Les tests utilisateurs pour les petits budgets
Les tests utilisateurs pour les petits budgetsLes tests utilisateurs pour les petits budgets
Les tests utilisateurs pour les petits budgets
 
Comment réussir son projet en Angular 1.5 ?
Comment réussir son projet en Angular 1.5 ?Comment réussir son projet en Angular 1.5 ?
Comment réussir son projet en Angular 1.5 ?
 
Les cinq bonnes pratiques des Tests Unitaires dans un projet Agile
Les cinq bonnes pratiques des Tests Unitaires dans un projet AgileLes cinq bonnes pratiques des Tests Unitaires dans un projet Agile
Les cinq bonnes pratiques des Tests Unitaires dans un projet Agile
 
Formation tests decembre2010
Formation tests decembre2010Formation tests decembre2010
Formation tests decembre2010
 
Industrialisation Du Logiciel - Introduction Et Bonnes Pratiques
Industrialisation Du Logiciel  - Introduction Et Bonnes PratiquesIndustrialisation Du Logiciel  - Introduction Et Bonnes Pratiques
Industrialisation Du Logiciel - Introduction Et Bonnes Pratiques
 
Industrialisation Du Logiciel Introduction Et Bonnes Pratiques V1.4
Industrialisation Du Logiciel   Introduction Et Bonnes Pratiques   V1.4Industrialisation Du Logiciel   Introduction Et Bonnes Pratiques   V1.4
Industrialisation Du Logiciel Introduction Et Bonnes Pratiques V1.4
 

Plus de neuros

Plus de neuros (20)

Solution pour un Réseau Social d'Entreprise (RSE)
Solution pour un Réseau Social d'Entreprise (RSE)Solution pour un Réseau Social d'Entreprise (RSE)
Solution pour un Réseau Social d'Entreprise (RSE)
 
Le service workers
Le service workersLe service workers
Le service workers
 
Proteger votre vie privee sur internet
Proteger votre vie privee sur internetProteger votre vie privee sur internet
Proteger votre vie privee sur internet
 
Le pouvoir d'être Visible ou Invisible sur Internet
Le pouvoir d'être Visible ou Invisible  sur InternetLe pouvoir d'être Visible ou Invisible  sur Internet
Le pouvoir d'être Visible ou Invisible sur Internet
 
Vos projets web sur les plateformes ouvertes
Vos projets web sur les plateformes ouvertesVos projets web sur les plateformes ouvertes
Vos projets web sur les plateformes ouvertes
 
Livre Drupal avance, un CMS pour développeurs
Livre Drupal avance, un CMS pour développeursLivre Drupal avance, un CMS pour développeurs
Livre Drupal avance, un CMS pour développeurs
 
Http2 les impacts dans le web
Http2 les impacts dans le webHttp2 les impacts dans le web
Http2 les impacts dans le web
 
Php 7 Think php7
Php 7 Think php7Php 7 Think php7
Php 7 Think php7
 
RGAA 3 dans un Web Accessible
RGAA 3 dans un Web AccessibleRGAA 3 dans un Web Accessible
RGAA 3 dans un Web Accessible
 
Les effets de la loi Hamon
Les effets de la loi HamonLes effets de la loi Hamon
Les effets de la loi Hamon
 
La sécurité et php
La sécurité et phpLa sécurité et php
La sécurité et php
 
Les protocoles temps réels
Les protocoles temps réelsLes protocoles temps réels
Les protocoles temps réels
 
Vectoriel et 3d en html5 - Animation newschool (partie 2)
Vectoriel et 3d en html5 - Animation newschool (partie 2)Vectoriel et 3d en html5 - Animation newschool (partie 2)
Vectoriel et 3d en html5 - Animation newschool (partie 2)
 
Améliorer les performances SQL
Améliorer les performances SQLAméliorer les performances SQL
Améliorer les performances SQL
 
Newschool partie1 methode HTML5
Newschool partie1 methode HTML5Newschool partie1 methode HTML5
Newschool partie1 methode HTML5
 
Integrons en mode continu
Integrons en mode continuIntegrons en mode continu
Integrons en mode continu
 
Integration Drupal systemes d'informations
Integration Drupal systemes d'informationsIntegration Drupal systemes d'informations
Integration Drupal systemes d'informations
 
La maitrise des contenus hors internet
La maitrise des contenus hors internetLa maitrise des contenus hors internet
La maitrise des contenus hors internet
 
La mémoire et PHP
La mémoire et PHPLa mémoire et PHP
La mémoire et PHP
 
Pourquoi Firefox OS
Pourquoi Firefox OSPourquoi Firefox OS
Pourquoi Firefox OS
 

Effectuer des tests modernes pour drupal

  • 1. 2013 Effectuer des tests modernes pour Drupal @hellosct1
  • 3. 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... »
  • 4. L'importance des tests Pourquoi c'est utile ? ✔ ✔ ✔ Le code peut casser Changer le nom d'un fichier Et L'intérêt... ✔ ✔ En fait gagner ensuite Pas le temps d'en faire ✔ ✔ Coûte du temps au début C'est long manuellement Nécessite de la rigueur et de la constante
  • 5. 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 Tests Tests Tests Automatisés de charges d'ergonomie de sécurité
  • 7. Tests unitaires Déroulement ✔ ✔ ✔ ✔ Ecrire un test qui échoue Ecrire un test qui est bon Un test de sécurité Un test de contrôle Quoi tester ? ✔ ✔ ✔ ✔ Un module Une classe Une méthode Tester ✔ ✔ ✔ Ce qui est important Le risque de casser Les parties que vous touchez souvent
  • 8. Tests unitaires : Les API D8 ✔ ✔ ✔ ✔ ✔ ✔ jUnit SimpleTest Zend_test PHPUnit Atoum ...
  • 10. 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 - Windows - Linux - Mac Avec IDE - Eclipse PDT - Netbeans
  • 11. Tests unitaires : 1 Du code... <?php class calculs { +ieurs commentaires <?php class calculs { /** * @assert (0, 0) == 0 public function add($a, $b) * @assert (0, 1) == 1 { * @assert (1, 0) == 1 return $a + $b; * @assert (1, 1) == 2 * @assert (1, 2) == 4 } */ } public function add($a, $b) ?> { return $a + $b; } } ?>
  • 12. Tests unitaires : 1 1 commentaire <?php Passer au test <?php class calculs /** { * Generated from @assert (1, 1) == 2 */ /** * @assert (0, 0) == 0 */ public function testAdd() { $this->assertEquals( public function add($a, $b) 2, { $this->object->add(1, 1) return $a + $b; } } ?> ); } ?>
  • 13. 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
  • 14. PHPUnit avec Drupal <?php define('DRUPAL_ROOT', realpath(dirname(__FILE__) ) . PATH ); 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_plus_one_is_two() { $this->assertEquals(1+1,2); } } ?>
  • 15. Résultat . Le test est réussi F l'assertion a échoué E Erreur Exécution S Problème inconnu I Test incomplet
  • 16. Module & PHPUnit & Drupal
  • 17. Module & PHPUnit & Drupal (1/2) drupagora.module <?php /** * Implementation hook_help() */ function drupagora_help($path, $arg) { switch ($path) { case 'admin/help#drupagora': $output = '<h3>A propos du module : Drupagora</h3>'; $output .= '<p>Exemple de module pour le livre : Drupal Avancé aux éditions Eyrolles</p>'; return $output; } } ✔
  • 18. Module & PHPUnit & Drupal (2/2) drupagora.test.php <?php include_once DRUPAL_ROOT . 'includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); class drupagora_test extends PHPUnit_Framework_TestCase { public function test_function_help() { $output = '<h3>A propos du module : Drupagora</h3>'; $output .= '<p>Exemple de module pour le livre : Drupal Avancé aux éditions Eyrolles</p>'; $this->assertEquals( $output ); } ... menu_for_all_help('admin/help#drupagora'),
  • 21. Tests Fonctionnels Déroulement ✔ ✔ ✔ Prépare outil & API On le partage On récupère le résultat Quoi tester ? ✔ ✔ Nous... Rien C'est le client
  • 22. Tests Fonctionnels : utilisation Outils ✔ ✔ ✔ ✔ ✔ Selenium Behat Fitness Cucumber GreenPepper
  • 23. Cas pratique avec Selenium
  • 24. Tests Fonctionnels : utilisation
  • 25. Utilisation de Selenium Selenium *.jar Selenium IDE... Extension Firefox Selenium HQ... Compatible avec les browsers
  • 27. Selenium et Drupal ✔ Module selenium ✔ S'appuie sur SimpleTest
  • 29. Tests Intégrations Déroulement ✔ ✔ ✔ 1 Navigation de la prod. Générer le script pour repérer les modifications de comportement 1 exécution sur le nouveau serveur Pourquoi ? ✔ ✔ Simulation d'un être humain Détection des problèmes éventuels
  • 30. Tests Intégrations : utilisation Outils ✔ ✔ ✔ ✔ ✔ ✔ Selenium Sikuli Hudson Jenkins PhpUnderControl ...
  • 31. Cas pratique avec PHPUnit & Selenium
  • 32. 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
  • 33. Utilisation PHP Unit & Selenium <?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()); }
  • 34. Utilisation PHP Unit & Selenium <?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('hello'); $password->value('1234'); $this->assertTrue($submit->enabled()); $username->clear(); $password->clear(); $username->value(' '); $this->assertFalse($submit->enabled()); } ?>
  • 35. PHPUnit / Selenium / Drupal <?php class drupagora_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'); }
  • 36. PHPUnit / Selenium / Drupal public function testOuverturePageTypeMenu() { $this->open ( "http://localhost/drupal7/admin/menus/diner" ); $this->assertElementValueEquals ( 'name', '' ); }
  • 37. Au final... les tests associés $ cd votreSite $ phpunit sites/all/modules/menus/menus.test.php
  • 38. Ils ont été Ils ont été abordés abordés toute la toute la journée journée Les autres Tests ….