Tester un bundle Symfony 2
Nous y voilà. Vous avez créé votre premier bundle Symfony2, vous avez évidemment rédigé des tests automatisés qui tournent et vous vous apprêtez à publier votre création sur GitHub et Packagist. Oui mais voilà, le bundle n’est pas autonome. Il doit être intégré dans un projet Symfony2 pour que les tests automatisés puissent être lancés. Comment donc passer ce bundle par une plateforme d’intégration continue et ainsi vérifier la qualimétrie et les tests automatisés ? Voici la méthode que j’utilise actuellement. Elle n’est peut être pas parfaite je l’améliorerai donc au fur et à mesure mais elle fonctionne. Cet exemple est implémenté sur le bundle “NotJaxbBundle” présent sur GitHub : https://github.com/Level42/NotJaxbBundle
Principe
La méthode consiste à rendre le bundle autonome. Il doit donc être capable de rapatrier Symfony2 et l’ensemble des bundles dont il a besoin. On se base donc sur le fichier “composer.json”. Ça a comme autre avantage de s’assurer que ce fichier est complet et propre et que les règles PSR sont correctes.
phpunit.xml
Donc, à la racine de notre bundle, nous avons le fichier “phpunit.xml” qui permet de définir la configuration des tests automatisés. ex : https://github.com/Level42/NotJaxbBundle/blob/1.4/phpunit.xml Dans ce fichier il faudra ajouter le lien vers le boostrap :
1 |
<phpunit bootstrap="<strong>./Tests/bootstrap.php</strong>"> |
Il faudrai également exclure de la couverture des tests les dossiers “Tests” et “vendor” sinon cela fera baisser inutilement votre taux de couverture :
1 2 3 4 |
<exclude> <directory>./Tests</directory> <directory>./vendor</directory> </exclude> |
Boostrap
Le fichier boostrap doit être capable de charger un “kernel” de test Symfony2. On chargera donc l’autoloader de Composer et on implémentera la méthode spl_autoload_register. ex : https://github.com/Level42/NotJaxbBundle/blob/1.4/Tests/bootstrap.php Toutes les classes à utiliser doivent être chargées dans cet “autoloader”.
NB : Dans cet exemple, j’ai été obligé d’ajouter un loader pour les classes de mon bundle (fonction loadClasses). Je ne sais pas trop pourquoi mais je cherche 🙂
Kernel de test
Il faudra alors créer un dossier “app” qui correspondra au dossier présent dans Sf2. Dans ce dossier, il faudra créer le kernel de test, la configuration etc… ex : https://github.com/Level42/NotJaxbBundle/blob/1.4/Tests/app/NotJaxbTestKernel.php Ce kernel de test étend “SymfonyComponentHttpKernelKernel”. La méthode “registerBundles” permet d’enregistrer les bundles que vous utilisez dans votre propre bundle (dans mon cas Symfony2 et Doctrine). On ajoute évidemment le bundle à tester. Dans le dossier “app/config” il faudra au minimum déposer un fichier “config.yml” qui contiendra la configuration de Symfony2 pour les tests.
Pour finir
Une fois tout ça terminé, un petit “composer install” va créer un dossier “vendor” contenant les bundles et le framework nécessaire aux tests du bundle. Le kernel de test va être utilisé vos tests vont tourner sans être obligé d’intégrer le bundle dans un projet Sf2 (ça tombe bien c’était l’objectif).
1 2 3 |
wget http://getcomposer.org/composer.phar composer.phar install phpunit --log-junit=tests/phpunit-result.xml --coverage-clover=tests/phpunit-coverage.xml --coverage-html=tests/coverage --configuration=phpunit.xml |