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

35
ATOUM Le framework de tests unitaires pour PHP 5.3+ simple, moderne et intuitif. PHP User Group, Bordeaux, le 17 mai 2011

description

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

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

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

ATOUMLe framework de tests unitaires pour PHP

5.3+ simple, moderne et intuitif.

PHP User Group, Bordeaux, le 17 mai 2011

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

Mojo technique d’ATOUM

Modernité,

Rapidité,

Simplicité,

Fiabilité.

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

Modernité

PHP ≥ 5.3 :

Espaces de noms,

Late State Binding,

Fonctions anonymes et fermetures,

PHAR.

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

Dépendances optionnelles

Xdebug pour la couverture de code.

XML pour le rapport xunit.

SVN pour l’intégration continue.

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

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.

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

Exemple de test

namespace vendor\project\tests\units;

use mageekguy\atoum, vendor\project;

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

class foo extends atoum\test {

public function testBar() {

$foo = new project\foo();

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

}

}

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

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

>vendor\project\tests\units\foo:

[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....

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

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)...

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

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.

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

Assertions expressives

Calquent le langage « naturel »,

Utilisent une interface fluide,

Permettent plusieurs tests sur une même variable,

Indépendantes de la classe de test.

...

$this->assert

->object($foo->bar())->isIdenticalTo($foo)

->string($foo->getBar())->isEqualTo(‘bar’)

->integer($foo->countBar()

->isGreaterThan(100)

->isLessThan(1000)

;

...

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

Alias et labels

...

$this->define

->leNouvelAlias = ‘ancienne notation’;

;

$this->define

->mock($mock)->label = 'LeLabelQuiVaBIen';

...

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

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.

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

Principe des adaptateurs

Valeur de retour des fonctions/super-globales

définissables :

par valeur,

via l’exécution d’une fonction anonyme.

$adapter = new project\adapter();

$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(‘’); };

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

Définition d’un adaptateur

namespace vendor\project\adapter;

use \mageekguy\atoum;

interface adapter implements atoum\adapter\definition {}

namespace vendor\project\tests\units;

use \vendor\project\adapter, \mageekguy\atoum\test;

class adapter extends test\adapter

implements adapter\definition {}

namespace vendor\project;

use \vendor\project\adapter, \mageekguy\atoum;

class adapter extends atoum\adapter

implements adapter\definition {}

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

Utilisation de l’adaptateur

dans une classenamespace vendor\project;

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’);

} ...

}

}

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

Utilisation de l’adaptateur

dans les testsnamespace vendor\project\tests\units;

...

class foo ... { ...

public function testWrite() {

$foo = new project\foo($adapter = new test\adapter());

$adapter->fopen = false;

$this->assert->exception(function() use ($foo) {

$foo->write(uniqid(), uniqid());

}

)

->isInstanceOf(‘\exception’)

->hasMessage(‘Unable to open’)

}

}

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

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.

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

Exemple de bouchonnage

namespace vendor\project\tests\units;

use \mageekguy\atoum\mock;

...

class foo ... { ...public function testWrite() {

$this->mock(‘\vendor\project\file’);

$file = new mock\file();

$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));

}

}

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

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 atoum\test {

/** @ignore on */

public function testBar { ... }

}

...

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

Fiabilité

Isolation des tests.

Traçage correct des erreurs et des

exceptions.

Rapports d’exécution simples et évolutifs.

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

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.

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

Traçage des erreurs et des

exceptionsLocation 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.

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

Exemple de trace d’erreur

> Atoum version XXX by Frédéric Hardy (/path/to/atoum)

> vendor\project\foo:

=> 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:

=> vendor\project\tests\units\foo::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()

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

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.

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

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

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

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.

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

Exemple de mise en œuvre

des rapports

...use \mageekguy\atoum;

$mailer = new atoum\mailers\mail();

$mailer

->to(‘[email protected]’);

->from(‘[email protected]’)

;

$report = new atoum\reports\asynchronous\vim();

$report->addWriter(new atoum\writers\std\out())

->addWriter(new atoum\writers\mail($mailer))

;

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

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

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

>vendor\project\tests\units\foo:[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.

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

Fichier de configurationPermet d’accéder au runner de tests

Le configuration du runner permet par exemple de

gérer les rapports

Utilisation :

...use \mageekguy\atoum;

$report = new atoum\reports\asynchronous\vim();

$report->addWriter(new atoum\writers\std\out())

;

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

# php path/to/test.php –c path/to/config.php

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

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

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

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

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

Quelques statistiques

> 800 Ko de code.

> 25 000 lignes de code.

2 développeurs.

Utilisé chez F-Secure et

PMSI Pilot.

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

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.

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

Questions ?

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

• Cette conférence est maintenant terminée,

• Vous pouvez reprendre une activité normale.