SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
ATOUM
            Le framework de tests unitaires pour PHP 5.3+
            simple, moderne et intuitif.



                      PMSIpilot, Lyon, le 18 avril 2011

lundi 18 avril 2011
Mojo technique d’ATOUM

                      Modernité,
                      Rapidité,
                      Simplicité,
                      Fiabilité.




lundi 18 avril 2011
Modernité


                      PHP ≥ 5.3 :
                        Espaces de noms,
                        Late State Binding,
                        Fonctions anonymes et fermetures,
                        PHAR.



lundi 18 avril 2011
Dépendances optionnelles


                      Xdebug pour la couverture de code.
                      XML pour le rapport xunit.
                      SVN pour l’intégration continue.




lundi 18 avril 2011
Rapidité

                      Lors de l’installation :
                        Une archive PHAR à télécharger.
                      À l’utilisation :
                        Une archive PHAR à inclure dans le fichier de test,
                        Fichier de tests exécutable directement.




lundi 18 avril 2011
Exemple de test
           namespace vendorprojecttestsunits;
           use mageekguyatoum, vendorproject;

           require_once(__DIR__ . '/../../vendor/atoum.phar');

           class foo extends atoumtest {
           ! public function testBar() {
           ! ! $foo = new projectfoo();

                          $this->assert
                            ->object($foo->bar())->isIdenticalTo($foo)
                          ;
           !          }
           }




lundi 18 avril 2011
Exécution d’un test
           # php path/to/test.php
           > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum)
           > PHP path: /Users/fch/PHP/Install/5.3.6/bin/php
           > PHP version:
           => PHP 5.3.6 (cli) (built: Apr 3 2011 17:53:34)
           => Copyright (c) 1997-2011 The PHP Group
           => Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend
           Technologies
           > vendorprojecttestsunitsfoo:
           [S____________________________________________________][1/1]
           => Test duration: 0.14 second.
           => Memory usage: 1.00 Mb.
           > Total test duration: 0.1 second.
           > Total test memory usage: 1.00 Mb.
           > Running duration: 0.5 second.
           ...



lundi 18 avril 2011
Alternatives pour l’exécution
           # php atoum.phar -t path/to/tests/units/foo.php
           > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum)
           ...
           # php atoum.phar -d path/to/tests/units
           > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum)
           ...
           # ./atoum.phar path/to/test.php
           > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum)
           ...
           # ./atoum.phar -d path/to/tests/units
           > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum)
           ...




lundi 18 avril 2011
Simplicité
                      Simplifier l’écriture et la maintenance des
                      tests
                        Grâce à une API naturelle,
                        Grâce à des assertions expressives,
                        Grâce à la notion d’adaptateur,
                        Grâce à des bouchons simples à utiliser,
                        Grâce à des annotations.


lundi 18 avril 2011
Assertions expressives
           ...
           $this->assert
             ->object($foo->bar())->isIdenticalTo($foo)
             ->string($foo->getBar())->isEqualTo(‘bar’)
             ->integer($foo->countBar()
               ->isGreaterThan(100)
               ->isLessThan(1000)
           ;
           ...

                      Calquent le langage « naturel »,
                      Utilisent une interface fluide,
                      Permettent plusieurs tests sur une même variable,
                      Indépendantes de la classe de test.

lundi 18 avril 2011
Alias et labels
           ...
           $this->define
             ->alias(‘int’, ‘integer’)
             ->alias(‘str’, ‘string’)
             ->object($foo)->is(‘foo’)
           ;

           $this->assert
             ->foo->isIdenticalTo($foo->getBar())
             ->str($foo->getBar())->isEqualTo(‘bar’)
             ->int($foo->countBar()
               ->isGreaterThan(100)
               ->isLessThan(1000)
           ;
           ...




lundi 18 avril 2011
Adaptateur
                      Proxy indépendant et générique pour :
                        Les appels aux fonctions de PHP :
                          fopen(), etc.
                        Les appels aux super-globales de PHP :
                          $_SERVER, $_GET, etc.
                      Assertion dédiée.



lundi 18 avril 2011
Principe des adaptateurs
                 Valeur de retour des fonctions/super-globales
                 définissables :
                      par valeur,
                      via l’exécution d’une fonction anonyme.
           $adapter = new projectadapter();
           $adapter->_SERVER = array(‘foo’ => ‘bar’);
           $adapter->_GET = function() use ($request) {
             return $request->getValues();
           };
           $adapter->fopen = false;
           $adapter->fopen[1] = true;
           $adapter->md5 = function() { return md5(‘’); };

lundi 18 avril 2011
Définition d’un adaptateur
           namespace vendorprojectadapter;
           use mageekguyatoum;

           interface adapter implements atoumadapterdefinition {}

           namespace vendorprojecttestsunits;
           use vendorprojectadapter, mageekguyatoumtest;

           class adapter extends testadapter
                         implements adapterdefinition {}

           namespace vendorproject;
           use vendorprojectadapter, mageekguyatoum;

           class adapter extends atoumadapter
                         implements adapterdefinition {}



lundi 18 avril 2011
Utilisation de l’adaptateur
           dans une classe
           namespace vendorproject;

           class foo { ...
             public function __construct(adapter $adapter) {
               $this->adapter = $adapter;
             }

                public function write($string, $path) {
                  if ($this->adapter->fopen($path) === false) {
                    throw new exception(‘Unable to open’);
                  } ...
                }
           }




lundi 18 avril 2011
Utilisation de l’adaptateur
           dans les tests
           namespace vendorprojecttestsunits;
           ...
           class foo ... { ...
             public function testWrite() {
               $foo = new projectfoo($adapter = new testadapter());
               $adapter->fopen = false;
               $this->assert->exception(function() use ($foo) {
                   $foo->write(uniqid(), uniqid());
                 }
               )
                 ->isInstanceOf(‘exception’)
                 ->hasMessage(‘Unable to open’)
             }
           }




lundi 18 avril 2011
Bouchonnages
                 Extension de l’adaptateur.
                 Possible de bouchonner :
                      des classes, des classes abstraites ou des classes
                      inconnues,
                      des interfaces.
                 Espace de nom dédié.
                 Assertion dédiée.


lundi 18 avril 2011
Exemple de bouchonnage
          namespace vendorprojecttestsunits;

          use mageekguyatoummock;
          ...
          class foo ... { ...
            public function testWrite() {
               $this->mock(‘vendorprojectfile’);

                      $file = new mockfile();
                      $file->getMockController()->open = false;

                      $foo = new foo($path = uniqid());

                      $this->assert
                        ->exception(function() use ($foo)
                          { $foo->open($file); }
                        )
                           ->isInstanceOf(‘exception’)
                           ->hasMessage(‘Unable to open’)
                        ->mock($file)->call(‘open’, array($path))
                      ;
               }
          }


lundi 18 avril 2011
Annotations
                      Utilisées pour l’instant pour :
                        Ignorer une classe de test,
                        Ignorer une méthode de test dans une classe.

           ...
           /** @ignore off */
           class foo extends atoumtest {
             /** @ignore on */
             public function testBar { ... }
           }
           ...




lundi 18 avril 2011
Fiabilité


                      Isolation des tests.
                      Traçage correct des erreurs et des exceptions.
                      Rapports d’exécution simples et évolutifs.




lundi 18 avril 2011
Isolation des tests
                 Un processus PHP « vierge » est utilisé pour exécuter
                 chaque méthode d’une classe de test.
                      Aucune interaction entre les tests,
                      Pas de corruption de l’environnement,
                      Retour significatif en cas de crash de PHP,
                      Un crash ou une erreur dans une méthode ne
                      perturbe pas les autres tests.
                 En contrepartie, perte de performance.

lundi 18 avril 2011
Traçage des erreurs et des
           exceptions
                 Location précise des erreurs et des exceptions :
                      Dans la classe de tests d’origine par :
                        Méthode,
                        Numéro de ligne,
                        Assertion.
                      Dans la classe d’origine dans la mesure du possible.



lundi 18 avril 2011
Exemple de trace d’erreur
           > Atoum version XXX by Frédéric Hardy (/path/to/atoum)
           > vendorprojectfoo:
           => Test duration: 0.00 second.
           => Memory usage: 0.00 Mb.
           > Total test duration: 0.00 second.
           > Total test memory usage: 0.00 Mb.
           > Running duration: 0.08 second.
           > Success (1 test, 1 method, 0 assertion, 1 error, 0
           exception) !
           > There is 1 error:
           => vendorprojecttestsunitsfoo::testBar():
           ==> Error 255 in /path/to/project/vendor/tests/units/classes/
           foo.php on unknown line, generated by file /path/to/project/
           vendor/tests/units/classes/foo.php on line 15:
           Fatal error: Call to undefined function niqid()




lundi 18 avril 2011
Rapports simples et évolutifs
                 Un rapport est un ensemble de champs.
                 Un champ correspond à un type de données :
                      Durée d’exécution,
                      Assertion non vérifiée,
                      Erreur,
                      Etc.
                 Remplis en fonction d’événements déclenchés lors de
                 l’exécution des tests.
lundi 18 avril 2011
Deux familles de rapports
                 Temps réel :
                      Le rapport est « écrit » au fur et à mesure de
                      l’exécution des tests.
                        Utilisé par défaut en ligne de commande.
                 Asynchrone :
                      Le rapport est « écrit » à la fin de l’exécution des
                      tests.
                        xunit

lundi 18 avril 2011
Utilisation des rapports
                 Possible de générer plusieurs rapport simultanément :
                      CLI,
                      CLI + xunit.
                 Possible d’écrire sur plusieurs médias un même
                 rapport :
                      CLI,
                      CLI + mail,
                      Fichier + mail.
lundi 18 avril 2011
Exemple de mise en œuvre
           des rapports
           ...
           use mageekguyatoum;

           $mailer = new atoummailersmail();
           $mailer
             ->to(‘dev@atoum.org’);
             ->from(‘runner@atoum.org’)
           ;

           $report = new atoumreportsasynchronousvim();
           $report
             ->addWriter(new atoumwritersstdout());
             ->addWriter(new atoumwritersmail($mailer))
           ;

           $runner->addReport($report);
           ...

lundi 18 avril 2011
Exemple de rapport
           # php path/to/test.php
           > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum)
           > PHP path: /Users/fch/PHP/Install/5.3.6/bin/php
           > PHP version:
           => PHP 5.3.6 (cli) (built: Apr 3 2011 17:53:34)
           => Copyright (c) 1997-2011 The PHP Group
           => Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
           > vendorprojecttestsunitsfoo:
           [S____________________________________________________][1/1]
           => Test duration: 0.14 second.
           => Memory usage: 1.00 Mb.
           > Total test duration: 0.1 second.
           > Total test memory usage: 1.00 Mb.
           > Running duration: 0.5 second.




lundi 18 avril 2011
Quelques statistiques

                      > 800 Ko de code.
                      > 22 000 lignes de code.
                      2 développeurs.
                      Utilisé chez F-Secure.




lundi 18 avril 2011
Ressources
                 http://downloads.atoum.org/nightly.
                 https://svn.mageekbox.net/repositories/atoum/trunk.
                 Documentation en cours de rédaction mais :
                      php mageekguy.atoum.phar --help,
                      path/to/atoum/tests/units/classes.
                 Site en cours de réalisation.



lundi 18 avril 2011
Questions ?




lundi 18 avril 2011
Cette conférence est maintenant terminée,
                      vous pouvez reprendre une activité normale.




lundi 18 avril 2011

Contenu connexe

Tendances

Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++Fabio Hernandez
 
Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4halleck45
 
Partie 4: Fonctions - Programmation orientée objet en C++
Partie 4: Fonctions - Programmation orientée objet en C++Partie 4: Fonctions - Programmation orientée objet en C++
Partie 4: Fonctions - Programmation orientée objet en C++Fabio Hernandez
 
Les concepts de la programmation fonctionnelle illustrés avec Java 8
Les concepts de la programmation fonctionnelle illustrés avec Java 8Les concepts de la programmation fonctionnelle illustrés avec Java 8
Les concepts de la programmation fonctionnelle illustrés avec Java 8Yannick Chartois
 
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...MICHRAFY MUSTAFA
 
Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++Fabio Hernandez
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 
La référence Clear php
La référence Clear phpLa référence Clear php
La référence Clear phpDamien Seguy
 
Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5julien pauli
 
Chapitre4 cours de java
Chapitre4 cours de javaChapitre4 cours de java
Chapitre4 cours de javainfo1994
 
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Fabio Hernandez
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchronesAbdoulaye Dieng
 
PHP 7.0 : aperçu des nouveautés
PHP 7.0 : aperçu des nouveautésPHP 7.0 : aperçu des nouveautés
PHP 7.0 : aperçu des nouveautésDidcode
 

Tendances (19)

Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
 
Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4Programmation Orientée Objet et les Traits en PHP 5.4
Programmation Orientée Objet et les Traits en PHP 5.4
 
Partie 4: Fonctions - Programmation orientée objet en C++
Partie 4: Fonctions - Programmation orientée objet en C++Partie 4: Fonctions - Programmation orientée objet en C++
Partie 4: Fonctions - Programmation orientée objet en C++
 
Langage Perl
Langage PerlLangage Perl
Langage Perl
 
Les concepts de la programmation fonctionnelle illustrés avec Java 8
Les concepts de la programmation fonctionnelle illustrés avec Java 8Les concepts de la programmation fonctionnelle illustrés avec Java 8
Les concepts de la programmation fonctionnelle illustrés avec Java 8
 
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
 
Theme 7
Theme 7Theme 7
Theme 7
 
Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
Formation python 3
Formation python 3Formation python 3
Formation python 3
 
La référence Clear php
La référence Clear phpLa référence Clear php
La référence Clear php
 
Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5
 
Chapitre4 cours de java
Chapitre4 cours de javaChapitre4 cours de java
Chapitre4 cours de java
 
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
 
Python après 15 ans de JAVA
Python après 15 ans de JAVAPython après 15 ans de JAVA
Python après 15 ans de JAVA
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchrones
 
Cours php
Cours phpCours php
Cours php
 
PHP 7.0 : aperçu des nouveautés
PHP 7.0 : aperçu des nouveautésPHP 7.0 : aperçu des nouveautés
PHP 7.0 : aperçu des nouveautés
 

Similaire à Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuitif.+

PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP NextSQLI
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afupJulien Vinber
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptMicrosoft
 
Fondamentaux portée - contexte - function ms tech days
Fondamentaux   portée - contexte - function ms tech daysFondamentaux   portée - contexte - function ms tech days
Fondamentaux portée - contexte - function ms tech daysJean-Pierre Vincent
 
Traits : de la théorie à la pratique
Traits : de la théorie à la pratiqueTraits : de la théorie à la pratique
Traits : de la théorie à la pratiqueFrederic Hardy
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJean-Pierre Vincent
 
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Joël Séguillon
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend FrameworkMickael Perraud
 
Javascript Json artchitecture
Javascript  Json artchitecture Javascript  Json artchitecture
Javascript Json artchitecture zaghir
 
Intro sur les tests unitaires
Intro sur les tests unitairesIntro sur les tests unitaires
Intro sur les tests unitairesPHPPRO
 
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINEIntroduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINEMarouan OMEZZINE
 

Similaire à Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuitif.+ (20)

Php 5.3
Php 5.3Php 5.3
Php 5.3
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP Next
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afup
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Fondamentaux portée - contexte - function ms tech days
Fondamentaux   portée - contexte - function ms tech daysFondamentaux   portée - contexte - function ms tech days
Fondamentaux portée - contexte - function ms tech days
 
Traits : de la théorie à la pratique
Traits : de la théorie à la pratiqueTraits : de la théorie à la pratique
Traits : de la théorie à la pratique
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
Java Nio 2
Java Nio 2Java Nio 2
Java Nio 2
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
 
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend Framework
 
Drools
DroolsDrools
Drools
 
Javascript Json artchitecture
Javascript  Json artchitecture Javascript  Json artchitecture
Javascript Json artchitecture
 
Intro sur les tests unitaires
Intro sur les tests unitairesIntro sur les tests unitaires
Intro sur les tests unitaires
 
Nouveautés php 7
Nouveautés php 7Nouveautés php 7
Nouveautés php 7
 
Ruby Pour RoR
Ruby Pour RoRRuby Pour RoR
Ruby Pour RoR
 
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINEIntroduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
 
Living Documentation (TDD, BDD).pptx
Living Documentation (TDD, BDD).pptxLiving Documentation (TDD, BDD).pptx
Living Documentation (TDD, BDD).pptx
 
Des tests modernes pour Drupal
Des tests modernes pour DrupalDes tests modernes pour Drupal
Des tests modernes pour Drupal
 
Les tests en PHP
Les tests en PHPLes tests en PHP
Les tests en PHP
 

Plus de Frederic Hardy

Plus de Frederic Hardy (10)

Comment tester des services web ?
Comment tester des services web ?Comment tester des services web ?
Comment tester des services web ?
 
TDD avec atoum
TDD avec atoumTDD avec atoum
TDD avec atoum
 
TDD avec atoum
TDD avec atoumTDD avec atoum
TDD avec atoum
 
Anatomie du test
Anatomie du testAnatomie du test
Anatomie du test
 
Atoum
AtoumAtoum
Atoum
 
Plein PHAR !
Plein PHAR !Plein PHAR !
Plein PHAR !
 
Plein phar !
Plein phar !Plein phar !
Plein phar !
 
Plein phar
Plein pharPlein phar
Plein phar
 
PHP : retour vers le futur !
PHP : retour vers le futur !PHP : retour vers le futur !
PHP : retour vers le futur !
 
VIM puissance PHP = VI Improved !
VIM puissance PHP = VI Improved !VIM puissance PHP = VI Improved !
VIM puissance PHP = VI Improved !
 

Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuitif.+

  • 1. ATOUM Le framework de tests unitaires pour PHP 5.3+ simple, moderne et intuitif. PMSIpilot, Lyon, le 18 avril 2011 lundi 18 avril 2011
  • 2. Mojo technique d’ATOUM Modernité, Rapidité, Simplicité, Fiabilité. lundi 18 avril 2011
  • 3. Modernité PHP ≥ 5.3 : Espaces de noms, Late State Binding, Fonctions anonymes et fermetures, PHAR. lundi 18 avril 2011
  • 4. Dépendances optionnelles Xdebug pour la couverture de code. XML pour le rapport xunit. SVN pour l’intégration continue. lundi 18 avril 2011
  • 5. Rapidité Lors de l’installation : Une archive PHAR à télécharger. À l’utilisation : Une archive PHAR à inclure dans le fichier de test, Fichier de tests exécutable directement. lundi 18 avril 2011
  • 6. Exemple de test namespace vendorprojecttestsunits; use mageekguyatoum, vendorproject; require_once(__DIR__ . '/../../vendor/atoum.phar'); class foo extends atoumtest { ! public function testBar() { ! ! $foo = new projectfoo(); $this->assert ->object($foo->bar())->isIdenticalTo($foo) ; ! } } lundi 18 avril 2011
  • 7. Exécution d’un test # php path/to/test.php > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum) > PHP path: /Users/fch/PHP/Install/5.3.6/bin/php > PHP version: => PHP 5.3.6 (cli) (built: Apr 3 2011 17:53:34) => Copyright (c) 1997-2011 The PHP Group => Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies > vendorprojecttestsunitsfoo: [S____________________________________________________][1/1] => Test duration: 0.14 second. => Memory usage: 1.00 Mb. > Total test duration: 0.1 second. > Total test memory usage: 1.00 Mb. > Running duration: 0.5 second. ... lundi 18 avril 2011
  • 8. Alternatives pour l’exécution # php atoum.phar -t path/to/tests/units/foo.php > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum) ... # php atoum.phar -d path/to/tests/units > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum) ... # ./atoum.phar path/to/test.php > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum) ... # ./atoum.phar -d path/to/tests/units > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum) ... lundi 18 avril 2011
  • 9. Simplicité Simplifier l’écriture et la maintenance des tests Grâce à une API naturelle, Grâce à des assertions expressives, Grâce à la notion d’adaptateur, Grâce à des bouchons simples à utiliser, Grâce à des annotations. lundi 18 avril 2011
  • 10. Assertions expressives ... $this->assert ->object($foo->bar())->isIdenticalTo($foo) ->string($foo->getBar())->isEqualTo(‘bar’) ->integer($foo->countBar() ->isGreaterThan(100) ->isLessThan(1000) ; ... Calquent le langage « naturel », Utilisent une interface fluide, Permettent plusieurs tests sur une même variable, Indépendantes de la classe de test. lundi 18 avril 2011
  • 11. Alias et labels ... $this->define ->alias(‘int’, ‘integer’) ->alias(‘str’, ‘string’) ->object($foo)->is(‘foo’) ; $this->assert ->foo->isIdenticalTo($foo->getBar()) ->str($foo->getBar())->isEqualTo(‘bar’) ->int($foo->countBar() ->isGreaterThan(100) ->isLessThan(1000) ; ... lundi 18 avril 2011
  • 12. Adaptateur Proxy indépendant et générique pour : Les appels aux fonctions de PHP : fopen(), etc. Les appels aux super-globales de PHP : $_SERVER, $_GET, etc. Assertion dédiée. lundi 18 avril 2011
  • 13. Principe des adaptateurs Valeur de retour des fonctions/super-globales définissables : par valeur, via l’exécution d’une fonction anonyme. $adapter = new projectadapter(); $adapter->_SERVER = array(‘foo’ => ‘bar’); $adapter->_GET = function() use ($request) { return $request->getValues(); }; $adapter->fopen = false; $adapter->fopen[1] = true; $adapter->md5 = function() { return md5(‘’); }; lundi 18 avril 2011
  • 14. Définition d’un adaptateur namespace vendorprojectadapter; use mageekguyatoum; interface adapter implements atoumadapterdefinition {} namespace vendorprojecttestsunits; use vendorprojectadapter, mageekguyatoumtest; class adapter extends testadapter implements adapterdefinition {} namespace vendorproject; use vendorprojectadapter, mageekguyatoum; class adapter extends atoumadapter implements adapterdefinition {} lundi 18 avril 2011
  • 15. Utilisation de l’adaptateur dans une classe namespace vendorproject; class foo { ... public function __construct(adapter $adapter) { $this->adapter = $adapter; } public function write($string, $path) { if ($this->adapter->fopen($path) === false) { throw new exception(‘Unable to open’); } ... } } lundi 18 avril 2011
  • 16. Utilisation de l’adaptateur dans les tests namespace vendorprojecttestsunits; ... class foo ... { ... public function testWrite() { $foo = new projectfoo($adapter = new testadapter()); $adapter->fopen = false; $this->assert->exception(function() use ($foo) { $foo->write(uniqid(), uniqid()); } ) ->isInstanceOf(‘exception’) ->hasMessage(‘Unable to open’) } } lundi 18 avril 2011
  • 17. Bouchonnages Extension de l’adaptateur. Possible de bouchonner : des classes, des classes abstraites ou des classes inconnues, des interfaces. Espace de nom dédié. Assertion dédiée. lundi 18 avril 2011
  • 18. Exemple de bouchonnage namespace vendorprojecttestsunits; use mageekguyatoummock; ... class foo ... { ... public function testWrite() { $this->mock(‘vendorprojectfile’); $file = new mockfile(); $file->getMockController()->open = false; $foo = new foo($path = uniqid()); $this->assert ->exception(function() use ($foo) { $foo->open($file); } ) ->isInstanceOf(‘exception’) ->hasMessage(‘Unable to open’) ->mock($file)->call(‘open’, array($path)) ; } } lundi 18 avril 2011
  • 19. Annotations Utilisées pour l’instant pour : Ignorer une classe de test, Ignorer une méthode de test dans une classe. ... /** @ignore off */ class foo extends atoumtest { /** @ignore on */ public function testBar { ... } } ... lundi 18 avril 2011
  • 20. Fiabilité Isolation des tests. Traçage correct des erreurs et des exceptions. Rapports d’exécution simples et évolutifs. lundi 18 avril 2011
  • 21. Isolation des tests Un processus PHP « vierge » est utilisé pour exécuter chaque méthode d’une classe de test. Aucune interaction entre les tests, Pas de corruption de l’environnement, Retour significatif en cas de crash de PHP, Un crash ou une erreur dans une méthode ne perturbe pas les autres tests. En contrepartie, perte de performance. lundi 18 avril 2011
  • 22. Traçage des erreurs et des exceptions Location précise des erreurs et des exceptions : Dans la classe de tests d’origine par : Méthode, Numéro de ligne, Assertion. Dans la classe d’origine dans la mesure du possible. lundi 18 avril 2011
  • 23. Exemple de trace d’erreur > Atoum version XXX by Frédéric Hardy (/path/to/atoum) > vendorprojectfoo: => Test duration: 0.00 second. => Memory usage: 0.00 Mb. > Total test duration: 0.00 second. > Total test memory usage: 0.00 Mb. > Running duration: 0.08 second. > Success (1 test, 1 method, 0 assertion, 1 error, 0 exception) ! > There is 1 error: => vendorprojecttestsunitsfoo::testBar(): ==> Error 255 in /path/to/project/vendor/tests/units/classes/ foo.php on unknown line, generated by file /path/to/project/ vendor/tests/units/classes/foo.php on line 15: Fatal error: Call to undefined function niqid() lundi 18 avril 2011
  • 24. Rapports simples et évolutifs Un rapport est un ensemble de champs. Un champ correspond à un type de données : Durée d’exécution, Assertion non vérifiée, Erreur, Etc. Remplis en fonction d’événements déclenchés lors de l’exécution des tests. lundi 18 avril 2011
  • 25. Deux familles de rapports Temps réel : Le rapport est « écrit » au fur et à mesure de l’exécution des tests. Utilisé par défaut en ligne de commande. Asynchrone : Le rapport est « écrit » à la fin de l’exécution des tests. xunit lundi 18 avril 2011
  • 26. Utilisation des rapports Possible de générer plusieurs rapport simultanément : CLI, CLI + xunit. Possible d’écrire sur plusieurs médias un même rapport : CLI, CLI + mail, Fichier + mail. lundi 18 avril 2011
  • 27. Exemple de mise en œuvre des rapports ... use mageekguyatoum; $mailer = new atoummailersmail(); $mailer ->to(‘dev@atoum.org’); ->from(‘runner@atoum.org’) ; $report = new atoumreportsasynchronousvim(); $report ->addWriter(new atoumwritersstdout()); ->addWriter(new atoumwritersmail($mailer)) ; $runner->addReport($report); ... lundi 18 avril 2011
  • 28. Exemple de rapport # php path/to/test.php > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum) > PHP path: /Users/fch/PHP/Install/5.3.6/bin/php > PHP version: => PHP 5.3.6 (cli) (built: Apr 3 2011 17:53:34) => Copyright (c) 1997-2011 The PHP Group => Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies > vendorprojecttestsunitsfoo: [S____________________________________________________][1/1] => Test duration: 0.14 second. => Memory usage: 1.00 Mb. > Total test duration: 0.1 second. > Total test memory usage: 1.00 Mb. > Running duration: 0.5 second. lundi 18 avril 2011
  • 29. Quelques statistiques > 800 Ko de code. > 22 000 lignes de code. 2 développeurs. Utilisé chez F-Secure. lundi 18 avril 2011
  • 30. Ressources http://downloads.atoum.org/nightly. https://svn.mageekbox.net/repositories/atoum/trunk. Documentation en cours de rédaction mais : php mageekguy.atoum.phar --help, path/to/atoum/tests/units/classes. Site en cours de réalisation. lundi 18 avril 2011
  • 31. Questions ? lundi 18 avril 2011
  • 32. Cette conférence est maintenant terminée, vous pouvez reprendre une activité normale. lundi 18 avril 2011