SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
ATOUM
Le framework de tests unitaires pour PHP
5.3+ simple, moderne et intuitif.



     PHP User Group, Bordeaux, le 17 mai 2011
Mojo technique d’ATOUM

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


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


    Xdebug pour la couverture de code.
    XML pour le rapport xunit.
    SVN pour l’intégration continue.
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.
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);
       }
}
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....
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)...
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.
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.
Alias et labels

...
$this->define
->leNouvelAlias = ‘ancienne notation’;
;

$this->define
->mock($mock)->label = 'LeLabelQuiVaBIen';
...
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.
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(‘’); };
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 {}
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’);
             } ...
      }
}
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’)
    }
}
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.
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))
       ;
}
}
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 { ... }
}
...
Fiabilité


   Isolation des tests.
   Traçage correct des erreurs et des
   exceptions.
   Rapports d’exécution simples et évolutifs.
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.
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.
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()
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.
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
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.
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);...
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.
Fichier de configuration
   Permet d’accéder au runner de tests
   Le configuration du runner permet par exemple de
   gérer les rapports
   Utilisation :

...use mageekguyatoum;
$report = new atoumreportsasynchronousvim();
$report->addWriter(new atoumwritersstdout())
;
$runner->addReport($report);...



# php path/to/test.php –c path/to/config.php
Intégration continue

 Compatible avec tous les serveurs d’intégration
 continue prenant en charge le format xUnit.
 Peut se connecter sur un repository SVN pour faire des
 builds :
   checkout/update
   Execution des tests
   Envoi de rapport
Intégration continue
./mageekguy.atoum.phar -u builder -h
Usage: phar:///home/usul/workspace/labs/mageekguy.atoum.phar/scripts/builder.php [options]
Available options are:
                                 -h, --help: Display this help
            -c <file>, --configuration-file <file>: Use <file> as configuration file for builder
      -rc <file>, --runner-configuration-file <file>: Use <file> as configuration file for runner
                       -v <string>, --v <string>: Version <string> will be used as version name
               -rf <file>, --revision-file <file>: Save last revision in <file>
          -sd <file>, --score-directory <directory>: Save score in <directory>
                 -r <url>, --repository-url <url>: Url of subversion repository
     -w <directory>, --working-directory <directory>: Checkout file from subversion in <directory>
  -d <directory>, --destination-directory <directory>: Save phar in <directory>
     -ed <directory>, --errors-directory <directory>: Save errors in <directory>




*/5 * * * * /usr/local/www/tests/mageekguy.atoum.phar -- -rc /usr/local/tests/config/runner.php 2>&1
Quelques statistiques

       > 800 Ko de code.
       > 25 000 lignes de code.
       2 développeurs.
       Utilisé chez F-Secure et
       PMSI Pilot.
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,
Site en cours de réalisation.
Sortie publique en cours de planification.
Questions ?
•    Cette conférence est maintenant terminée,
•       Vous pouvez reprendre une activité normale.

Más contenido relacionado

La actualidad más candente

Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchronesAbdoulaye Dieng
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryneuros
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP NextSQLI
 
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
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmiqueAbdoulaye Dieng
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptAbdoulaye Dieng
 
Atelier symfony n 2
Atelier symfony n 2Atelier symfony n 2
Atelier symfony n 2Amir Souissi
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronestchappui
 
PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3Eddy RICHARD
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5halleck45
 
cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++Abdoulaye Dieng
 
Zend Framework 2
Zend Framework 2Zend Framework 2
Zend Framework 2epixelic
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015Stéphane Legrand
 
POO Java Chapitre 6 Exceptions
POO Java  Chapitre 6 ExceptionsPOO Java  Chapitre 6 Exceptions
POO Java Chapitre 6 ExceptionsMouna Torjmen
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDOAbdoulaye Dieng
 

La actualidad más candente (20)

Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchrones
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP Next
 
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
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Introduction au Jquery
Introduction au JqueryIntroduction au Jquery
Introduction au Jquery
 
Atelier symfony n 2
Atelier symfony n 2Atelier symfony n 2
Atelier symfony n 2
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
 
PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
 
Php 5.3
Php 5.3Php 5.3
Php 5.3
 
Des tests modernes pour Drupal
Des tests modernes pour DrupalDes tests modernes pour Drupal
Des tests modernes pour Drupal
 
cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++
 
Zend Framework 2
Zend Framework 2Zend Framework 2
Zend Framework 2
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015
 
POO Java Chapitre 6 Exceptions
POO Java  Chapitre 6 ExceptionsPOO Java  Chapitre 6 Exceptions
POO Java Chapitre 6 Exceptions
 
Cours php
Cours phpCours php
Cours php
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Introduction à jQuery
Introduction à jQueryIntroduction à jQuery
Introduction à jQuery
 

Destacado

Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !
Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !
Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !Caroline Damour-Nobi
 
BusinessCenter – Retour d’expérience
BusinessCenter – Retour d’expérienceBusinessCenter – Retour d’expérience
BusinessCenter – Retour d’expérienceFrench Scrum User Group
 
FKUG - Meetup du 12 mai 2015 : REX projet pilote ScrumBan
FKUG - Meetup du 12 mai 2015 : REX projet pilote ScrumBanFKUG - Meetup du 12 mai 2015 : REX projet pilote ScrumBan
FKUG - Meetup du 12 mai 2015 : REX projet pilote ScrumBanFrench Kanban User Group
 
Agile Coach Retreat Paris - The metaphor
Agile Coach Retreat Paris -  The metaphorAgile Coach Retreat Paris -  The metaphor
Agile Coach Retreat Paris - The metaphoroana Juncu
 
Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !
Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !
Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !Caroline Damour-Nobi
 
Cours EMI CFD - Mars 2012
Cours EMI CFD - Mars 2012Cours EMI CFD - Mars 2012
Cours EMI CFD - Mars 2012tdudouet
 
La commercialisation en ligne : créer la relation clients et fidéliser
La commercialisation en ligne : créer la relation clients et fidéliserLa commercialisation en ligne : créer la relation clients et fidéliser
La commercialisation en ligne : créer la relation clients et fidéliserEmilie64
 
Portfolio agile : de la visibilité au pilotage
Portfolio agile : de la visibilité au pilotagePortfolio agile : de la visibilité au pilotage
Portfolio agile : de la visibilité au pilotageCaroline Damour-Nobi
 

Destacado (8)

Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !
Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !
Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !
 
BusinessCenter – Retour d’expérience
BusinessCenter – Retour d’expérienceBusinessCenter – Retour d’expérience
BusinessCenter – Retour d’expérience
 
FKUG - Meetup du 12 mai 2015 : REX projet pilote ScrumBan
FKUG - Meetup du 12 mai 2015 : REX projet pilote ScrumBanFKUG - Meetup du 12 mai 2015 : REX projet pilote ScrumBan
FKUG - Meetup du 12 mai 2015 : REX projet pilote ScrumBan
 
Agile Coach Retreat Paris - The metaphor
Agile Coach Retreat Paris -  The metaphorAgile Coach Retreat Paris -  The metaphor
Agile Coach Retreat Paris - The metaphor
 
Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !
Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !
Agile Tour Bordeaux - Octobre 2012 - Des mots, des maux ? Demo !
 
Cours EMI CFD - Mars 2012
Cours EMI CFD - Mars 2012Cours EMI CFD - Mars 2012
Cours EMI CFD - Mars 2012
 
La commercialisation en ligne : créer la relation clients et fidéliser
La commercialisation en ligne : créer la relation clients et fidéliserLa commercialisation en ligne : créer la relation clients et fidéliser
La commercialisation en ligne : créer la relation clients et fidéliser
 
Portfolio agile : de la visibilité au pilotage
Portfolio agile : de la visibilité au pilotagePortfolio agile : de la visibilité au pilotage
Portfolio agile : de la visibilité au pilotage
 

Similar a Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuitif. Bordeaux PUG

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
 
Comment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguerComment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguerDamien Seguy
 
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
 
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
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?Fou Cha
 
Intro sur les tests unitaires
Intro sur les tests unitairesIntro sur les tests unitaires
Intro sur les tests unitairesPHPPRO
 
Service WEB de type REST avec Java
Service WEB de type REST avec JavaService WEB de type REST avec Java
Service WEB de type REST avec JavaFrancois ANDRE
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application javaAntoine Rey
 
Optimiser son environnement de développement PHP (Tuto NetBeans v4.4)
Optimiser son environnement de développement PHP (Tuto NetBeans v4.4)Optimiser son environnement de développement PHP (Tuto NetBeans v4.4)
Optimiser son environnement de développement PHP (Tuto NetBeans v4.4)Nicolas Defay
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyHugo Hamon
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !Paris Salesforce Developer Group
 
Sécurité et Quaité de code PHP
Sécurité et Quaité de code PHPSécurité et Quaité de code PHP
Sécurité et Quaité de code PHPJean-Marie Renouard
 
ALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowMathias Kluba
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Dr Samir A. ROUABHI
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Jean-Michel Doudoux
 

Similar a Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuitif. Bordeaux PUG (20)

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
 
Comment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguerComment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguer
 
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
 
Playing With PHP 5.3
Playing With PHP 5.3Playing With PHP 5.3
Playing With PHP 5.3
 
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
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?
 
Intro sur les tests unitaires
Intro sur les tests unitairesIntro sur les tests unitaires
Intro sur les tests unitaires
 
Service WEB de type REST avec Java
Service WEB de type REST avec JavaService WEB de type REST avec Java
Service WEB de type REST avec Java
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 
threads.pdf
threads.pdfthreads.pdf
threads.pdf
 
Optimiser son environnement de développement PHP (Tuto NetBeans v4.4)
Optimiser son environnement de développement PHP (Tuto NetBeans v4.4)Optimiser son environnement de développement PHP (Tuto NetBeans v4.4)
Optimiser son environnement de développement PHP (Tuto NetBeans v4.4)
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec Symfony
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
 
Les tests en PHP
Les tests en PHPLes tests en PHP
Les tests en PHP
 
Apache ANT
Apache ANTApache ANT
Apache ANT
 
Sécurité et Quaité de code PHP
Sécurité et Quaité de code PHPSécurité et Quaité de code PHP
Sécurité et Quaité de code PHP
 
ALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - Specflow
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
 

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

  • 1. ATOUM Le framework de tests unitaires pour PHP 5.3+ simple, moderne et intuitif. PHP User Group, Bordeaux, le 17 mai 2011
  • 2. Mojo technique d’ATOUM Modernité, Rapidité, Simplicité, Fiabilité.
  • 3. Modernité PHP ≥ 5.3 : Espaces de noms, Late State Binding, Fonctions anonymes et fermetures, PHAR.
  • 4. Dépendances optionnelles Xdebug pour la couverture de code. XML pour le rapport xunit. SVN pour l’intégration continue.
  • 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.
  • 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); } }
  • 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....
  • 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)...
  • 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.
  • 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.
  • 11. Alias et labels ... $this->define ->leNouvelAlias = ‘ancienne notation’; ; $this->define ->mock($mock)->label = 'LeLabelQuiVaBIen'; ...
  • 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.
  • 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(‘’); };
  • 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 {}
  • 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’); } ... } }
  • 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’) } }
  • 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.
  • 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)) ; } }
  • 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 { ... } } ...
  • 20. Fiabilité Isolation des tests. Traçage correct des erreurs et des exceptions. Rapports d’exécution simples et évolutifs.
  • 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.
  • 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.
  • 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()
  • 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.
  • 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
  • 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.
  • 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);...
  • 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.
  • 29. Fichier de configuration Permet d’accéder au runner de tests Le configuration du runner permet par exemple de gérer les rapports Utilisation : ...use mageekguyatoum; $report = new atoumreportsasynchronousvim(); $report->addWriter(new atoumwritersstdout()) ; $runner->addReport($report);... # php path/to/test.php –c path/to/config.php
  • 30. Intégration continue Compatible avec tous les serveurs d’intégration continue prenant en charge le format xUnit. Peut se connecter sur un repository SVN pour faire des builds : checkout/update Execution des tests Envoi de rapport
  • 31. Intégration continue ./mageekguy.atoum.phar -u builder -h Usage: phar:///home/usul/workspace/labs/mageekguy.atoum.phar/scripts/builder.php [options] Available options are: -h, --help: Display this help -c <file>, --configuration-file <file>: Use <file> as configuration file for builder -rc <file>, --runner-configuration-file <file>: Use <file> as configuration file for runner -v <string>, --v <string>: Version <string> will be used as version name -rf <file>, --revision-file <file>: Save last revision in <file> -sd <file>, --score-directory <directory>: Save score in <directory> -r <url>, --repository-url <url>: Url of subversion repository -w <directory>, --working-directory <directory>: Checkout file from subversion in <directory> -d <directory>, --destination-directory <directory>: Save phar in <directory> -ed <directory>, --errors-directory <directory>: Save errors in <directory> */5 * * * * /usr/local/www/tests/mageekguy.atoum.phar -- -rc /usr/local/tests/config/runner.php 2>&1
  • 32. Quelques statistiques > 800 Ko de code. > 25 000 lignes de code. 2 développeurs. Utilisé chez F-Secure et PMSI Pilot.
  • 33. 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, Site en cours de réalisation. Sortie publique en cours de planification.
  • 35. Cette conférence est maintenant terminée, • Vous pouvez reprendre une activité normale.