des tests modernes pour drupal
DESCRIPTION
Présentation effectuée au DrupalCamp Montréal 2014 sur "des tests modernes pour Drupal"TRANSCRIPT
![Page 1: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/1.jpg)
Des tests 'MODERNES' pour Drupal
Christophe Villeneuve@hellosct1
![Page 2: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/2.jpg)
Qui... est Christophe Villeneuve ?
<<
afup – lemug.fr – mysql – mariadb – drupal – demoscene – firefoxos – drupagora – phptour – forumphp – solutionlinux – demoinparis – ici et maintenant – eyrolles – editions eni – programmez – linux pratique – webriver – phptv – neuros - elephpant
![Page 3: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/3.jpg)
Support présentation aujourd'hui
Disponible sur http://www.eyrolles.frDrupal avancé – un CMS pour développeurs par Christophe Villeneuve et Vanessa Kovalsky David aux Editions EYROLLES
![Page 4: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/4.jpg)
Expérience sur... 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 5: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/5.jpg)
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 gain après
✔ Nécessite de la rigueur et de la constante
![Page 6: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/6.jpg)
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és
Tests de charges
Tests d'ergonomie
Tests de sécurité
![Page 7: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/7.jpg)
Tests unitaires... En pratique
![Page 8: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/8.jpg)
Tests unitaires
✔ Existe-t-il ?
✔ 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 9: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/9.jpg)
Tests unitaires : Les API
✔ jUnit
✔ SimpleTest
✔ Zend_test
✔ PHPUnit
✔ Atoum
✔ ...D8D7 D9
SimpleTest
PHPUnit
Roadmap
![Page 10: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/10.jpg)
Cas pratique avec PHPUnit
![Page 11: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/11.jpg)
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 12: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/12.jpg)
Tests unitaires : cas 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) == 3
*/
public function add($a, $b)
{
return $a + $b;
}
}
?>
Du code... +ieurs commentaires
![Page 13: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/13.jpg)
Tests unitaires : cas 1
<?php
class calculs
{
/**
* @assert (1, 1) == 2
*/
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 14: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/14.jpg)
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 15: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/15.jpg)
PHPUnit avec Drupal : Comprendre
<?php
define('DRUPAL_ROOT', realpath(dirname(__FILE__) ) . DS );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_more_one_is_two() { $this->assertEquals(1+1,2); }}
?>
![Page 16: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/16.jpg)
Résultat
. Le test est réussiF l'assertion a échouéE Erreur ExécutionS Problème inconnu I Test incomplet
![Page 17: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/17.jpg)
Module & PHPUnit & Drupal
![Page 18: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/18.jpg)
Module & PHPUnit & Drupal (1/2)
<?php
/**
* Implementation hook_help()
*/
function drupalcampmontreal_help($path, $arg) {
switch ($path) {
case 'admin/help#drupalcampmontreal':
$output = '<h3>A propos de : DrupalCamp Montréal</h3>';
$output .= '<p>Exemple de module test DrupalCamp Montréal 2014</p>';
return $output;
}
}
✔
drupalmontreal.module
![Page 19: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/19.jpg)
Module & PHPUnit & Drupal (2/2)
<?php
include_once DRUPAL_ROOT . 'includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
class drupalcampmontreal_test extends PHPUnit_Framework_TestCase
{
public function test_function_help()
{
$output = '<h3>A propos de : DrupalCamp Montréal</h3>';
$output .= '<p>Exemple de module test DrupalCamp Montréal 2014</p>';
$this->assertEquals(drupalcampmontreal_help('admin/help#drupalcampmontreal'), $output );
}
...
drupalcampmontreal.test.php
![Page 20: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/20.jpg)
Résultat
![Page 21: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/21.jpg)
Tests Fonctionnels... En pratique
![Page 22: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/22.jpg)
Tests Fonctionnels
✔ Prépare outil & API✔ Vérifie l'intégration des
différents composants
✔ On le partage
✔ On récupère le résultat
Déroulement Quoi tester ?✔ Nous... Rien
✔ C'est le client
![Page 23: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/23.jpg)
Tests Fonctionnels : utilisation
✔ Selenium
✔ Casper.js & Phantom.js
✔ Cucumber
✔ GreenPepper
✔ ...
Outils
D8D7 D9
Selenium
Casper.js
Roadmap
Phantom.js
![Page 24: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/24.jpg)
Cas pratique avec Selenium
![Page 25: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/25.jpg)
Tests Fonctionnels : utilisation
![Page 26: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/26.jpg)
Différents Selenium
● Selenium *.jar
● Selenium IDE– Extension Firefox
● SeleniumHQ– Compatible avec tous les navigateurs
http://www.seleniumhq.org/
![Page 27: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/27.jpg)
Utilisation de Selenium
![Page 28: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/28.jpg)
Selenium seul
![Page 29: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/29.jpg)
Selenium et Drupal
✔ Module selenium
✔ S'appuie sur SimpleTest
Selenium pour PHPUnit
![Page 30: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/30.jpg)
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 31: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/31.jpg)
Utilisation PHP Unit & Selenium (1/2)<?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 32: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/32.jpg)
Utilisation PHP Unit & Selenium (2/2)<?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('votreLogin');
$password->value('votrePassword');
$this->assertTrue($submit->enabled());
$username->clear();
$password->clear();
$username->value(' ');
$this->assertFalse($submit->enabled());
}
?>
![Page 33: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/33.jpg)
PHPUnit / Selenium / Drupal (1/3)
![Page 34: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/34.jpg)
PHPUnit / Selenium / Drupal (2/3)<?php
class drupalcampmontreal_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 35: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/35.jpg)
PHPUnit / Selenium / Drupal (3/3)public function testOuverturePageTypeMenu() {
$this->open (
"http://localhost/drupal-test/admin/menus/diner" );
$this->assertElementValueEquals ( 'name', '' );
$this->assertElementValueEquals ( 'listlieu', '' );
}
![Page 36: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/36.jpg)
Au final... les tests associés$ cd votreSite
$ phpunit sites/all/modules/menus/menus.test.php
![Page 37: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/37.jpg)
Tests Intégrations... En pratique
![Page 38: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/38.jpg)
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 39: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/39.jpg)
Tests Intégrations : utilisation
✔ Selenium
✔ Sikuli
✔ Hudson / Jenkins
✔ PhpUnderControl
✔ Behat/Mink
✔ Sahi
✔ PHPCov
✔ ...
Outils
D8D7 D9
Selenium
Behat+mink
Roadmap
![Page 40: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/40.jpg)
Cas pratique avec Behat
![Page 41: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/41.jpg)
Utilisation
# pear channel-discover pear.symfony.com
# pear channel-discover pear.behat.org
# pear install behat/behat
http://docs.behat.org/
{ "require": { "behat/behat": "2.4.*@stable" }, "minimum-stability": "dev", "config": { "bin-dir": "bin/" }}
ContexteEvénementsRésultat
![Page 42: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/42.jpg)
Utilisation par le code Behat/Mink require_once 'mink/autoload.php';
class FeatureContext extends Behat\Mink\Behat\Context\MinkContext {
/** * @Given /^Je suis identifie "([^"]*)"$/ */public function jeSuisIdentifie($username){ return array( new Step\Given('I go to "login.php"') ,new Step\When("I fill in 'Mon nom' with '$username' ") ,new Step\When("I fill in 'Mon mot de passe' with '$password' ") ,new Step\When('I press "Login"') );}
}
![Page 43: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/43.jpg)
Behat / Mint / Drupal (1/3)
Module behat
# curl -s https://getcomposer.org/installer | php
# php composer.phar install
# wget http://selenium...../selenium-server-standalone-2.26.0.jar
default:
context:
extensions:
Behat\MinkExtension\Extension:
base_url: 'http://localhost'
goutte: ~
selenium2: ~
Behat.yml
![Page 44: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/44.jpg)
Behat / Mint / Drupal (2/3)
menus.featureScenario: Submits diner when required fields are filled out Given I am on "/" When I follow "diner" And I fill in "Your name" with "#name" And I fill in "Your lieu" with "#lieu" And I press "add" Then I should see "diner ajouter"
![Page 45: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/45.jpg)
Behat / Mint / Drupal (3/3)
$ bin/behat features/menus.feature
© http://drupalwatchdog.com/volume-2/issue-2/behat-and-mink
![Page 46: Des tests modernes pour Drupal](https://reader036.vdocuments.pub/reader036/viewer/2022062405/558543f6d8b42a4f018b4e54/html5/thumbnails/46.jpg)
Les autres Tests ….
Ils seront abordés dans la journée
Ils seront abordés dans la journée