Code coverage des tests unitaires d’un projet symfony et intégration dans Hudson CI
Après avoir écrit quelques tests unitaires, on peut se demander si les tests écrits couvrent
une partie assez importante du code de la classe testée, quelles peuvent être les classes restantes à tester ou tout simplement avoir une idée de l’étendue du projet couverte par des tests unitaires.
Pour cela nous utiliseront le plugin Hudson Emma pour l’affichage dans Hudson, ainsi que le plugin symfony agEmmaCoverageReport pour générer le fichier xml au format emma.
Le format « emma » est à la basée utilisé en java, plus d’infos sur le site du projet.
Utilisation de la tache de génération du rapport xml
L’extension xdebug doit être installée (mais pas forcément activée).
Les fichiers testés sont trouvés en utilisant l’autoload, les fichiers de tests doivent être nommés de la façon suivante : nomDeLaClasseTesteeTest.php, par exemple le classe « qualifactCellFormatterEuro » aura pour fichier de test « qualifactCellFormatterEuroTest.php ».
Voyons tout d’abord comment fonctionne la génération du fichier xml de rapport :
Si xdebug est activé par défaut :
./symfony ecr:report --xml=cheminOuSauverLeXml.xml
Mais sur le serveur d’intégration cela n’est probablement pas le cas, et il serait
gênant d’avoir à l’activer pour les autres tests alors que qu’il est seulement utilisé pour le coverage.
Pour cela on peut indiquer à la tache le chemin ou se situe l’extension xdebug (par exemple sur une Mandriva il se situe ici : « /usr/lib/php/extensions/xdebug.so »). La tâche sera alors appelée de cette façon.
./symfony ecr:report --xml=cheminOuSauverLeXml.xml --xdebug-extension-path=/usr/lib/php/extensions/xdebug.so
Intégration dans Hudson CI
Création et configuration du job
- Dans le menu de gauche : « Nouvelle Tache »
- Cliquez sur « Construire un projet free-style »
- Donnez un nom au job
- Entrez alors l’url du dépôt
- Après checkout nous voulons lancer les tests unitaires ainsi que la tache créant
- Dans la liste des commandes nous allons donc lancer les tests et le coverage de cette façon :
- Pour les résultats des tests unitaires, cochons la case « Publier le rapport des résultats de tests JUnit » puis dans « XML des rapports de test » nous indiquons ou chercher le fichier XML en saisissant : « log/unit.xml »
- Pour le code coverage, cochons la case « Record Emma coverage report » puis dans « Folders or files containing Emma XML reports » nous indiquons où chercher le fichier XML en saisissant : « log/coverage.xml »
- Il faudra ensuite exécuter le job
le rapport de coverage, nous allons donc ajouter une étape au build. Celle ci sera de
type « Executer un script shell »
$WORKSPACE/symfony test:unit --xml=log/unit.xml
$WORKSPACE/symfony ecr:report --xml=log/coverage.xml
Affichage du rapport de code coverage
Après lancement du job les résultats du code coverage apparaissent dans la section « Coverage Trend ».
Pour un détail du coverage il faut cliquer sur le graphique.
La couverture du code par les tests unitaire est alors présentée par package ainsi que par classe, méthode, bloc et ligne.
Les blocs sont tous à 0 car c’est une notion seulement utilisée en java. Une méthode ou une classe est couverte si toutes les lignes qui la contiennent sont couvertes. Ainsi certaines classes, ne contenant aucune ligne de code, ayant juste leur déclaration, seront indiquées comme couvertes à 100%.

