Boire ou coder ... Pourquoi choisir?
Publié le 09 juillet 2009 22:00

Symfony et Zend Framework : veuillez exécuter nos tests correctement

S'il vous plait ! Et je m'explique.

J'utilise, comme outil d'intégration continue, Integrity. Avec un "post-receive" sur le repository github, à chacun de mes commits, Integrity est mis au courant et il exécute les tests.

Ca fonctionne à merveille avec mes projets Rails (l'API RefStats et mon portfolio); mes projets Django (la documentation de RefStats). Mais pour les projets Zend Framework (l'appli web RefStats) et un autre sur lequel je vais bosser en aout et qui sera fait avec Symfony, c'est pas cool. Les tests, bien qu'ils ne passent pas tous, sont considérés par Integrity, comme valides.

La raison de cela est très simple : lorsqu'un processus console est exécuté, il peut retourner un code de status. Un peu comme le code HTTP sur les pages web. Ce code doit être à 0 pour que les tests soient valides et à une autre valeur, quelconque, si les tests ne passent pas. Voir notamment la documentation Integrity. En PHP, un simple exit(0) ou exit(1) à la fin des tests suffirait à exécuter la chose correctement.

Et vraissemblablement, Symfony tout comme le Zend Framework ne renvoient pas le bon code de status. Alors s'il vous plait, PHP a déjà pas mal de retard au niveau des tests automatisés d'applications, qu'il serait cool de rattraper. Faire ceci serait déjà un premier pas :)

Commentaires

Philippe
Philippe dit: 09 juillet 2009 22:00 Site web

Comme dit de vive voix, une solution est de créer un script qui interprète la sortie standard de l'execution des tests pour renvoyer le code de statut correspondant. Puis de l'ajouter à la ligne de commande utilisée par integrity pour tester l'application.

^_^

Damien
Damien dit: 09 juillet 2009 22:00 Site web

Ouais. Mais c'est lourd quand on sait qu'un simple exit dans le processus d'exécution des tests permettrait de résoudre le problème.

Jean-Marc Fontaine
Jean-Marc Fontaine dit: 09 juillet 2009 22:00 Site web

Je te trouve encore une fois bien prompt à critiquer PHP et plus particulièrement Zend Framework et maintenant Symfony.

Comme tu le sais probablement, Zend Framework utilise PHPUnit pour ses tests unitaires. Le manque fonctionnel que tu soulèves est donc dans PHPUnit et non Zend Framework. Symfony quant à lui utilise un framework de tests maison.

Ce qui serait bien c'est de faire une demande d'amélioration auprès de ces deux projets mais je ne doute pas que tu l'aies fait.

Enfin, pourrais-tu détailler ta remarque "PHP a déjà pas mal de retard au niveau des tests automatisés d’applications" ?

Damien
Damien dit: 09 juillet 2009 22:00 Site web

C'est plus le Zend Framework qui a du retard d'un point de vue des tests. Il faut, pour écrire des tests, implémenter entièrement PHPUnit en utilisant Zend_Test. Il existe très peu d'outils permettant d'avoir à uniquement écrire les tests et qu'ils soient exécutés.

Le fait que l'on doive, pour chaque application, mettre en place le système de tests a deux conséquences : - Cela ne pousse pas à écrire des tests. C'est trop compliqué. - Des tests peuvent parfois échouer alors que la chose testée est fonctionnelle.

On voit d'ailleurs assez aisément que l'équipe de développement du ZF ne s'attache pas spécialement à être TDD compliant. Plusieurs tests dans plusieurs modules échouent dans le ZF 1.8 (sans parler de ZF_Gdata qui nécessite de monter le memory_limit à 40Mo).

Donc oui, je dis que PHP et plus particulièrement le Zend Framework (sur Symfony ça passe, bien que j'ai des problèmes pour tester une page qui me renvoie des données binaires). Pas parce que l'on ne peut pas faire de tests. Mais parce que l'on est pas poussé à en faire.

Jean-Marc Fontaine
Jean-Marc Fontaine dit: 09 juillet 2009 22:00 Site web

Après vérification, PHPUnit renvoie bien un code de sortie de 0 en cas de succès et différent de 0 en cas d'échec, en l'occurrence 2 lors de mes tests.

Ton problème avec Zend Framework devait venir d'ailleurs.

Jean-Marc Fontaine
Jean-Marc Fontaine dit: 09 juillet 2009 22:00 Site web

Je suis d'accord avec toi sur le fait que mettre en place la structure de test d'une application avec PHPUnit est un peu fastidieux et donc peu motivant.

Par contre, là où je ne suis pas d'accord c'est que le problème vient de PHPUnit et qu'au contraire Zend_Test est là pour simplifier certains aspects notamment le test des contrôleurs.

Concernant, le fait que des tests unitaires échouent sur des versions dites stables du Zend Framework, cela m'énerve autant que toi.

Damien
Damien dit: 09 juillet 2009 22:00 Site web

Je n'ai jamais dit que tout était mauvais ;) Zend_Test facilite fortement les choses. Mais il y a encore énormément de travail à faire pour avoir quelque chose de correctement utilisable.

Fabien
Fabien dit: 09 juillet 2009 22:00 Site web

Symfony renvoie bien 1 ou 0 en fonction du résultat des tests. Il doit donc fonctionner correctement avec Integrity. D'ailleurs, et pour l'anecdote, j'ai déjà utilisé Integrity, et les projets symfony fonctionnents à merveille.

Pour preuve, le serveur d'intégration continue de symfony, qui fonctionne, comme integrity, grâce au code retour de la ligne de commande : http://ci.symfony-project.org/

Damien
Damien dit: 09 juillet 2009 22:00 Site web

@Fabien il y a un problème quelque part alors car je reviens de tester et, même lorsque les tests échouent, j'ai toujours un code 0.

Maxence
Maxence dit: 09 juillet 2009 22:00 Site web

Tu dois avoir un exit quelque part dans ton code qui est lancé avant que PHPUnit ne termine ses tests.

Damien
Damien dit: 09 juillet 2009 22:00 Site web

Je me contenterai d'un :roll: Non, je n'ai pas d'exit.

Maxence
Maxence dit: 09 juillet 2009 22:00 Site web

Je confirme ce que dit Jean-Marc.

PHPUnit renvoie bien un code 1 si un test échoue et 2 si il rencontre une exception.

J'ai eu d'ailleurs un mal de chien pour trouver une méthode me permettant de déterminer quel est le code erreur retourné sous Windows. En fait, c'est tout con, il suffit de lancer la commande suivante après l'exécution :

echo %ERROR_LEVEL%

Donc le problème ne vient pas de PHPUnit, ni de ZF et ni de Symfony, mais plutôt de la config d'integrity.

Le ZF utilise Bamboo comme CIS et à mon avis il doit utiliser également le code d'exit de PHPUnit.

Postez un commentaire

Markdown activé