ATOUMLe framework de tests unitaires pour PHP5.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 con...
Rapidité Lors de l’installation :   Une archive PHAR à télécharger. À l’utilisation :   Une archive PHAR à inclure dans le...
Exemple de testnamespace vendorprojecttestsunits;use mageekguyatoum, vendorproject;require_once(__DIR__ . /../../vendor/at...
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/PH...
Alternatives pourl’exécution# php atoum.phar -t path/to/tests/units/foo.php> Atoum version 325 by Frédéric Hardy (/Users/f...
Simplicité    Simplifier l’écriture et la maintenance des    tests      Grâce à une API naturelle,      Grâce à des assert...
Assertions expressives...$this->assert->object($foo->bar())->isIdenticalTo($foo)->string($foo->getBar())->isEqualTo(‘bar’)...
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 appel...
Principe des adaptateurs   Valeur de retour des fonctions/super-globales   définissables :      par valeur,      via l’exé...
Définition d’un adaptateurnamespace vendorprojectadapter;use mageekguyatoum;interface adapter implements atoumadapterdefin...
Utilisation de l’adaptateurdans une classenamespace vendorproject;class foo { ...       public function __construct(adapte...
Utilisation de l’adaptateurdans les testsnamespace vendorprojecttestsunits;...class foo ... { ...    public function testW...
BouchonnagesExtension de l’adaptateur.Possible de bouchonner :  des classes, des classes abstraites ou des classes  inconn...
Exemple de bouchonnagenamespace vendorprojecttestsunits;use mageekguyatoummock;...class foo ... { ...public function testW...
Annotations        Utilisées pour l’instant pour :            Ignorer une classe de test,            Ignorer une méthode d...
Fiabilité   Isolation des tests.   Traçage correct des erreurs et des   exceptions.   Rapports d’exécution simples et évol...
Isolation des tests Un processus PHP « vierge » est utilisé pour exécuter chaque méthode d’une classe de test.   Aucune in...
Traçage des erreurs et desexceptionsLocation précise des erreurs et des exceptions :  Dans la classe de tests d’origine pa...
Exemple de trace d’erreur> Atoum version XXX by Frédéric Hardy (/path/to/atoum)> vendorprojectfoo:=> Test duration: 0.00 s...
Rapports simples etévolutifsUn rapport est un ensemble de champs.Un champ correspond à un type de données :  Durée d’exécu...
Deux familles de rapportsTemps réel :  Le rapport est « écrit » au fur et à mesure de  l’exécution des tests.    Utilisé p...
Utilisation des rapports Possible de générer plusieurs rapport simultanément :   CLI,   CLI + xunit. Possible d’écrire sur...
Exemple de mise en œuvredes rapports...use mageekguyatoum;$mailer = new atoummailersmail();$mailer->to(‘dev@atoum.org’);->...
Exemple de rapport# php path/to/test.php> Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum)> PHP path: /Users/fch/PHP...
Fichier de configuration   Permet d’accéder au runner de tests   Le configuration du runner permet par exemple de   gérer ...
Intégration continue Compatible avec tous les serveurs d’intégration continue prenant en charge le format xUnit. Peut se c...
Intégration continue./mageekguy.atoum.phar -u builder -hUsage: phar:///home/usul/workspace/labs/mageekguy.atoum.phar/scrip...
Quelques statistiques       > 800 Ko de code.       > 25 000 lignes de code.       2 développeurs.       Utilisé chez F-Se...
Ressourceshttp://downloads.atoum.org/nightly.https://svn.mageekbox.net/repositories/atoum/trunk.Documentation en cours de ...
Questions ?
•    Cette conférence est maintenant terminée,•       Vous pouvez reprendre une activité normale.
Prochain SlideShare
Chargement dans…5
×

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

3 262 vues

Publié le

Présentation au Bordeaux PHP User Group d'Atoum, le nouveau framework de tests unitaires pour PHP 5.3+ simple, moderne et intuitif.

Publié dans : Technologie
0 commentaire
2 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
3 262
Sur SlideShare
0
Issues des intégrations
0
Intégrations
480
Actions
Partages
0
Téléchargements
17
Commentaires
0
J’aime
2
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

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

  1. 1. ATOUMLe framework de tests unitaires pour PHP5.3+ simple, moderne et intuitif. PHP User Group, Bordeaux, le 17 mai 2011
  2. 2. Mojo technique d’ATOUM Modernité, Rapidité, Simplicité, Fiabilité.
  3. 3. Modernité PHP ≥ 5.3 : Espaces de noms, Late State Binding, Fonctions anonymes et fermetures, PHAR.
  4. 4. Dépendances optionnelles Xdebug pour la couverture de code. XML pour le rapport xunit. SVN pour l’intégration continue.
  5. 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. 6. Exemple de testnamespace 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. 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. 8. Alternatives pourl’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. 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. 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. 11. Alias et labels...$this->define->leNouvelAlias = ‘ancienne notation’;;$this->define->mock($mock)->label = LeLabelQuiVaBIen;...
  12. 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. 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. 14. Définition d’un adaptateurnamespace 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. 15. Utilisation de l’adaptateurdans une classenamespace 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. 16. Utilisation de l’adaptateurdans les testsnamespace 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. 17. BouchonnagesExtension 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. 18. Exemple de bouchonnagenamespace 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. 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. 20. Fiabilité Isolation des tests. Traçage correct des erreurs et des exceptions. Rapports d’exécution simples et évolutifs.
  21. 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. 22. Traçage des erreurs et desexceptionsLocation 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. 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. 24. Rapports simples etévolutifsUn 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 del’exécution des tests.
  25. 25. Deux familles de rapportsTemps 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. 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. 27. Exemple de mise en œuvredes 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. 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. 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. 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. 31. Intégration continue./mageekguy.atoum.phar -u builder -hUsage: 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. 32. Quelques statistiques > 800 Ko de code. > 25 000 lignes de code. 2 développeurs. Utilisé chez F-Secure et PMSI Pilot.
  33. 33. Ressourceshttp://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.
  34. 34. Questions ?
  35. 35. • Cette conférence est maintenant terminée,• Vous pouvez reprendre une activité normale.

×