39
Effectuer des tests modernes pour Drupal @hellosct1 2013

Effectuer des tests modernes pour drupal

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Effectuer des tests modernes pour drupal

Effectuer des tests modernes pour Drupal

@hellosct1

2013

Page 2: Effectuer des tests modernes pour drupal

Qui ?

ChristopheVilleneuve

@hellosct1

Page 3: Effectuer des tests modernes pour drupal

Les tests

✔ « Des fois cela plante »

Citations

✔ « On a testé, …il y a 3 mois lors de la dernière livraison... Pas eu le temps... »

Page 4: Effectuer des tests modernes pour drupal

L'importance des tests

✔ Le code peut casser

✔ Changer le nom d'un fichier

✔ Pas le temps d'en faire

✔ C'est long manuellement

Pourquoi c'est utile ? Et L'intérêt...✔ Coûte du temps au

début

✔ En fait gagner ensuite

✔ Nécessite de la rigueur et de la constante

Page 5: Effectuer des tests modernes pour drupal

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ésTests de chargesTests d'ergonomieTests de sécurité

Page 6: Effectuer des tests modernes pour drupal

Tests unitaires... En pratique

Page 7: Effectuer des tests modernes pour drupal

Tests unitaires

✔ Ecrire un test qui échoue

✔ Ecrire un test qui est bon

✔ Un test de sécurité✔ Un test de

contrôle

Déroulement Quoi tester ?✔ Un module✔ Une classe✔ Une méthode

✔ Tester✔ Ce qui est important✔ Le risque de casser✔ Les parties que vous

touchez souvent

Page 8: Effectuer des tests modernes pour drupal

Tests unitaires : Les API

✔ jUnit✔ SimpleTest✔ Zend_test✔ PHPUnit✔ Atoum✔ ...

D8

Page 9: Effectuer des tests modernes pour drupal

Cas pratique avec PHPUnit

Page 10: Effectuer des tests modernes pour drupal

InstallationEn 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

Page 11: Effectuer des tests modernes pour drupal

Tests unitaires : 1

<?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) == 4

*/

public function add($a, $b)

{

return $a + $b;

}

}

?>

Du code... +ieurs commentaires

Page 12: Effectuer des tests modernes pour drupal

Tests unitaires : 1

<?php

class calculs

{

/**

* @assert (0, 0) == 0

*/

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)

);

}

?>

1 commentaire Passer au test

Page 13: Effectuer des tests modernes pour drupal

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

Page 14: Effectuer des tests modernes pour drupal

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); }}

?>

Page 15: Effectuer des tests modernes pour drupal

Résultat

. Le test est réussiF l'assertion a échouéE Erreur ExécutionS Problème inconnu I Test incomplet

Page 16: Effectuer des tests modernes pour drupal

Module & PHPUnit & Drupal

Page 17: Effectuer des tests modernes pour drupal

Module & PHPUnit & Drupal (1/2)

<?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;

}

}✔

drupagora.module

Page 18: Effectuer des tests modernes pour drupal

Module & PHPUnit & Drupal (2/2)

<?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( menu_for_all_help('admin/help#drupagora'), $output );

}

...

drupagora.test.php

Page 19: Effectuer des tests modernes pour drupal

Résultat

Page 20: Effectuer des tests modernes pour drupal

Tests Fonctionnels... En pratique

Page 21: Effectuer des tests modernes pour drupal

Tests Fonctionnels

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

résultat

Déroulement Quoi tester ?✔ Nous... Rien✔ C'est le client

Page 22: Effectuer des tests modernes pour drupal

Tests Fonctionnels : utilisation

✔ Selenium✔ Behat✔ Fitness✔ Cucumber✔ GreenPepper

Outils

Page 23: Effectuer des tests modernes pour drupal

Cas pratique avec Selenium

Page 24: Effectuer des tests modernes pour drupal

Tests Fonctionnels : utilisation

Page 25: Effectuer des tests modernes pour drupal

Utilisation de SeleniumSelenium *.jar

Selenium IDE... Extension Firefox

Selenium HQ... Compatible avec les browsers

Page 26: Effectuer des tests modernes pour drupal

Utilisation de Selenium

Page 27: Effectuer des tests modernes pour drupal

Selenium et Drupal

✔ Module selenium✔ S'appuie sur SimpleTest

Page 28: Effectuer des tests modernes pour drupal

Tests Intégrations... En pratique

Page 29: Effectuer des tests modernes pour drupal

Tests Intégrations

✔ 1 Navigation de la prod.

✔ Générer le script pour repérer les modifications de comportement

✔ 1 exécution sur le nouveau serveur

Déroulement Pourquoi ?✔ Simulation d'un

être humain✔ Détection des

problèmes éventuels

Page 30: Effectuer des tests modernes pour drupal

Tests Intégrations : utilisation

✔ Selenium✔ Sikuli✔ Hudson✔ Jenkins✔ PhpUnderControl✔ ...

Outils

Page 31: Effectuer des tests modernes pour drupal

Cas pratique avec PHPUnit & Selenium

Page 32: Effectuer des tests modernes pour drupal

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

Page 33: Effectuer des tests modernes pour drupal

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());

}

Page 34: Effectuer des tests modernes pour drupal

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());

}

?>

Page 35: Effectuer des tests modernes pour drupal

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');

}

Page 36: Effectuer des tests modernes pour drupal

PHPUnit / Selenium / Drupalpublic function testOuverturePageTypeMenu() {

$this->open (

"http://localhost/drupal7/admin/menus/diner" );

$this->assertElementValueEquals ( 'name', '' );

}

Page 37: Effectuer des tests modernes pour drupal

Au final... les tests associés$ cd votreSite

$ phpunit sites/all/modules/menus/menus.test.php

Page 38: Effectuer des tests modernes pour drupal

Les autres Tests ….

Ils ont été abordés toute la journée

Ils ont été abordés toute la journée

Page 39: Effectuer des tests modernes pour drupal

Merci

@hellosct1

http://www.webriver.eu

http://blog.hello-design.fr

@neuros_paris

http://www.neuros.fr