ATOUM            Le framework de tests unitaires pour PHP 5.3+            simple, moderne et intuitif.                    ...
Mojo technique d’ATOUM                      Modernité,                      Rapidité,                      Simplicité,    ...
Modernité                      PHP ≥ 5.3 :                        Espaces de noms,                        Late State Bindi...
Dépendances optionnelles                      Xdebug pour la couverture de code.                      XML pour le rapport ...
Rapidité                      Lors de l’installation :                        Une archive PHAR à télécharger.             ...
Exemple de test           namespace vendorprojecttestsunits;           use mageekguyatoum, vendorproject;           requir...
Exécution d’un test           # php path/to/test.php           > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum)   ...
Alternatives pour l’exécution           # php atoum.phar -t path/to/tests/units/foo.php           > Atoum version 325 by F...
Simplicité                      Simplifier l’écriture et la maintenance des                      tests                     ...
Assertions expressives           ...           $this->assert             ->object($foo->bar())->isIdenticalTo($foo)       ...
Alias et labels           ...           $this->define             ->alias(‘int’, ‘integer’)             ->alias(‘str’, ‘st...
Adaptateur                      Proxy indépendant et générique pour :                        Les appels aux fonctions de P...
Principe des adaptateurs                 Valeur de retour des fonctions/super-globales                 définissables :     ...
Définition d’un adaptateur           namespace vendorprojectadapter;           use mageekguyatoum;           interface adap...
Utilisation de l’adaptateur           dans une classe           namespace vendorproject;           class foo { ...        ...
Utilisation de l’adaptateur           dans les tests           namespace vendorprojecttestsunits;           ...           ...
Bouchonnages                 Extension de l’adaptateur.                 Possible de bouchonner :                      des ...
Exemple de bouchonnage          namespace vendorprojecttestsunits;          use mageekguyatoummock;          ...          ...
Annotations                      Utilisées pour l’instant pour :                        Ignorer une classe de test,       ...
Fiabilité                      Isolation des tests.                      Traçage correct des erreurs et des exceptions.   ...
Isolation des tests                 Un processus PHP « vierge » est utilisé pour exécuter                 chaque méthode d...
Traçage des erreurs et des           exceptions                 Location précise des erreurs et des exceptions :          ...
Exemple de trace d’erreur           > Atoum version XXX by Frédéric Hardy (/path/to/atoum)           > vendorprojectfoo:  ...
Rapports simples et évolutifs                 Un rapport est un ensemble de champs.                 Un champ correspond à ...
Deux familles de rapports                 Temps réel :                      Le rapport est « écrit » au fur et à mesure de...
Utilisation des rapports                 Possible de générer plusieurs rapport simultanément :                      CLI,  ...
Exemple de mise en œuvre           des rapports           ...           use mageekguyatoum;           $mailer = new atoumm...
Exemple de rapport           # php path/to/test.php           > Atoum version 325 by Frédéric Hardy (/Users/fch/Atoum)    ...
Quelques statistiques                      > 800 Ko de code.                      > 22 000 lignes de code.                ...
Ressources                 http://downloads.atoum.org/nightly.                 https://svn.mageekbox.net/repositories/atou...
Questions ?lundi 18 avril 2011
Cette conférence est maintenant terminée,                      vous pouvez reprendre une activité normale.lundi 18 avril 2...
Upcoming SlideShare
Loading in …5
×

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

7,752 views
7,638 views

Published on

Présentation d'Atoum à travers sa philosophie de développement.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,752
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
37
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

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

  1. 1. ATOUM Le framework de tests unitaires pour PHP 5.3+ simple, moderne et intuitif. PMSIpilot, Lyon, le 18 avril 2011lundi 18 avril 2011
  2. 2. Mojo technique d’ATOUM Modernité, Rapidité, Simplicité, Fiabilité.lundi 18 avril 2011
  3. 3. Modernité PHP ≥ 5.3 : Espaces de noms, Late State Binding, Fonctions anonymes et fermetures, PHAR.lundi 18 avril 2011
  4. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. xunitlundi 18 avril 2011
  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.lundi 18 avril 2011
  27. 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. 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. 29. Quelques statistiques > 800 Ko de code. > 22 000 lignes de code. 2 développeurs. Utilisé chez F-Secure.lundi 18 avril 2011
  30. 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. 31. Questions ?lundi 18 avril 2011
  32. 32. Cette conférence est maintenant terminée, vous pouvez reprendre une activité normale.lundi 18 avril 2011

×