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 ...
L'importance des tests
Pourquoi c'est utile ?
✔

✔

✔

Le code peut casser
Changer le nom d'un
fichier

Et L'intérêt...
✔
...
Les différents types de tests
Tests Unitaires
• Module / classe / méthode

Tests fonctionnels
• l'interface utilisateur te...
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...
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-d...
Tests unitaires : 1
Du code...
<?php
class calculs
{

+ieurs commentaires

<?php
class calculs
{
/**
* @assert (0, 0) == 0...
Tests unitaires : 1
1 commentaire
<?php

Passer au test
<?php

class calculs

/**

{

* Generated from @assert (1, 1) == 2...
Fonctionnement PHPUnit avec Drupal
✔

Boostrap
✔
✔

✔

Script d'amorcage
Construction autonome

Etendre le Boostrap
✔
✔
✔
...
PHPUnit avec Drupal
<?php
define('DRUPAL_ROOT', realpath(dirname(__FILE__) ) . PATH );
set_include_path(DRUPAL_ROOT . get_...
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, ...
Module & PHPUnit & Drupal (2/2)
drupagora.test.php
<?php
include_once DRUPAL_ROOT . 'includes/bootstrap.inc';
drupal_boots...
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.....
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
compo...
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 ph...
Utilisation PHP Unit & Selenium
<?php
class TestLogin extends
PHPUnit_Extensions_Selenium2TestCase {
public function setUp...
Utilisation PHP Unit & Selenium
<?php
public function testSubmitButtonIsDisabledUntilFieldsAreFilled()
{
$this->url('index...
PHPUnit / Selenium / Drupal
<?php
class drupagora_test extends
PHPUnit_Extensions_Selenium2TestCase {
public function setU...
PHPUnit / Selenium / Drupal
public function testOuverturePageTypeMenu() {
$this->open (
"http://localhost/drupal7/admin/me...
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
Prochain SlideShare
Chargement dans…5
×

Effectuer des tests modernes pour drupal

1 803 vues

Publié le

Présentation effectuée lors de la conférence Drupagora 2013

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
1 803
Sur SlideShare
0
Issues des intégrations
0
Intégrations
4
Actions
Partages
0
Téléchargements
15
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Effectuer des tests modernes pour drupal

  1. 1. 2013 Effectuer des tests modernes pour Drupal @hellosct1
  2. 2. Qui ? Christophe Villeneuve @hellosct1
  3. 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. 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. 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é
  6. 6. Tests unitaires... En pratique
  7. 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. 8. Tests unitaires : Les API D8 ✔ ✔ ✔ ✔ ✔ ✔ jUnit SimpleTest Zend_test PHPUnit Atoum ...
  9. 9. Cas pratique avec PHPUnit
  10. 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. 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. 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. 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. 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. 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. 16. Module & PHPUnit & Drupal
  17. 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. 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'),
  19. 19. Résultat
  20. 20. Tests Fonctionnels... En pratique
  21. 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. 22. Tests Fonctionnels : utilisation Outils ✔ ✔ ✔ ✔ ✔ Selenium Behat Fitness Cucumber GreenPepper
  23. 23. Cas pratique avec Selenium
  24. 24. Tests Fonctionnels : utilisation
  25. 25. Utilisation de Selenium Selenium *.jar Selenium IDE... Extension Firefox Selenium HQ... Compatible avec les browsers
  26. 26. Utilisation de Selenium
  27. 27. Selenium et Drupal ✔ Module selenium ✔ S'appuie sur SimpleTest
  28. 28. Tests Intégrations... En pratique
  29. 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. 30. Tests Intégrations : utilisation Outils ✔ ✔ ✔ ✔ ✔ ✔ Selenium Sikuli Hudson Jenkins PhpUnderControl ...
  31. 31. Cas pratique avec PHPUnit & Selenium
  32. 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. 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. 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. 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. 36. PHPUnit / Selenium / Drupal public function testOuverturePageTypeMenu() { $this->open ( "http://localhost/drupal7/admin/menus/diner" ); $this->assertElementValueEquals ( 'name', '' ); }
  37. 37. Au final... les tests associés $ cd votreSite $ phpunit sites/all/modules/menus/menus.test.php
  38. 38. Ils ont été Ils ont été abordés abordés toute la toute la journée journée Les autres Tests ….
  39. 39. Merci @neuros_paris http://www.neuros.fr @hellosct1 http://www.webriver.eu http://blog.hello-design.fr

×