3. Support présentation aujourd'hui
Disponible sur http://www.eyrolles.fr
Drupal avancé – un CMS pour développeurs par Christophe Villeneuve et Vanessa Kovalsky David aux Editions EYROLLES
4. Expérience sur... 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... »
5. L'importance des tests
Pourquoi c'est utile ? Et L'intérêt...
✔ Le code peut casser
✔ Changer le nom d'un fichier
✔ Pas le temps d'en faire
✔ C'est long manuellement
✔ Coûte du temps au début
✔ En fait gain après
✔ Nécessite de la rigueur et
de la constante
6. 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é
8. Tests unitaires
Déroulement Quoi tester ?
✔ Existe-t-il ?
✔ Ecrire un test qui échoue
✔ Ecrire un test qui est bon
✔ Un test de sécurité
✔ Un test de contrôle
✔ Un module
✔ Une classe
✔ Une méthode
✔ Tester
✔ Ce qui est important
✔ Le risque de casser
✔ Les parties que vous
touchez souvent
11. 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
Avec IDE
- Windows
- Eclipse PDT
- Linux
- Netbeans
- Mac
12. Tests unitaires : cas 1
Du code... +ieurs commentaires
<?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;
}
}
?>
13. Tests unitaires : cas 1
1 commentaire Passer au test
<?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)
);
}
?>
14. 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
15. 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);
}
}
?>
16. Résultat
. Le test est réussi
F l'assertion a échoué
E Erreur Exécution
S Problème inconnu
I Test incomplet
22. Tests Fonctionnels
Déroulement Quoi tester ?
✔ Prépare outil & API
✔ Vérifie l'intégration des
différents composants
✔ On le partage
✔ On récupère le résultat
✔ Nous... Rien
✔ C'est le client
38. Tests Intégrations
Déroulement Pourquoi ?
✔ 1 Navigation de la prod.
✔ Générer le script pour
repérer les modifications
de comportement
✔ 1 exécution sur le
nouveau serveur
✔ Simulation d'un être
humain
✔ Détection des problèmes
éventuels
42. Utilisation par le code Behat/Mink
require_once 'mink/autoload.php';
class FeatureContext extends BehatMinkBehatContextMinkContext {
/**
* @Given /^Je suis identifie "([^"]*)"$/
*/
public function jeSuisIdentifie($username)
{
return array(
new StepGiven('I go to "login.php"')
,new StepWhen("I fill in 'Mon nom' with '$username' ")
,new StepWhen("I fill in 'Mon mot de passe' with '$password' ")
,new StepWhen('I press "Login"')
);
}
}
44. Behat / Mint / Drupal (2/3)
menus.feature
Scenario: 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"