Effectuer des tests modernes pour drupal

Preview:

DESCRIPTION

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

Citation preview

Effectuer des tests modernes pour Drupal

@hellosct1

2013

Qui ?

ChristopheVilleneuve

@hellosct1

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... »

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

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é

Tests unitaires... En pratique

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

Tests unitaires : Les API

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

D8

Cas pratique avec PHPUnit

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

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

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

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éussiF l'assertion a échouéE Erreur ExécutionS Problème inconnu I Test incomplet

Module & PHPUnit & 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

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

Résultat

Tests Fonctionnels... En pratique

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

Tests Fonctionnels : utilisation

✔ Selenium✔ Behat✔ Fitness✔ Cucumber✔ GreenPepper

Outils

Cas pratique avec Selenium

Tests Fonctionnels : utilisation

Utilisation de SeleniumSelenium *.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

✔ 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

Tests Intégrations : utilisation

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

Outils

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 / Drupalpublic 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

Les autres Tests ….

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

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

Merci

@hellosct1

http://www.webriver.eu

http://blog.hello-design.fr

@neuros_paris

http://www.neuros.fr