Upload
christophe-villeneuve
View
992
Download
1
Embed Size (px)
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