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
  • le rapport de coverage, nous allons donc ajouter une étape au build. Celle ci sera de
    type « Executer un script shell »

  • Dans la liste des commandes nous allons donc lancer les tests et le coverage de cette façon :
  • $WORKSPACE/symfony test:unit --xml=log/unit.xml
    $WORKSPACE/symfony ecr:report --xml=log/coverage.xml

    executer_script

  • 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

Affichage du rapport de code coverage

Après lancement du job les résultats du code coverage apparaissent dans la section « Coverage Trend ».

graph

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

tableau_floute

 

Serv-Tech

 

5 thoughts on “Code coverage des tests unitaires d’un projet symfony et intégration dans Hudson CI

  1. Bonsoir,

    Excellent article.
    Je viens de mettre en place tout ceci, et la tâche me paraît prendre énormément de temps…
    J’ai vu qu’il était prévu une optimisation de cette tâche dans la milestone de la 0.3, c’est toujours le cas ?

    Merci encore pour cet article.

  2. Bonjour,

    article très instructif, j’ai cependant une question, lorsque j’essaie d’exécuter cette ligne :

    ./symfony ecr:report ‘etc.’

    Il refuse l’accès à l’utilisateur prétextant un problème de droit.

    J’ai installé Hudson sur une machine virtuelle Debian, mais je ne vois pas comment sur Hudson je peux exécuter cette requête en admin.

    Voici l erreur :

    Unable to open PDO connection [wrapped: SQLSTATE[28000] [1045] Access denied for user ‘admin’@’localhost’ (using password: YES)]

    Si jamais quelqu’un a une idée…

    Merci d’avance

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *