Cette semaine j'ai fait découvrir l'interface ArrayAccess à un des développeurs Parisiens que je coache.
Cette fonctionnalité lui a permis d'appréhender facilement les tests unitaires sur du code legacy, je reviens sur cette "expérience"
Tag - phpunit
vendredi, avril 9 2010
Interface ArrayAccess : où des objets que l'on utilise comme des array
Par Olivier Hoareau le vendredi, avril 9 2010, 22:26 - Méthodologie
dimanche, février 28 2010
Complémentarité PHPUnderControl / Phing
Par Olivier Hoareau le dimanche, février 28 2010, 22:56 - Outillage
Suite à une demande d'un internaute, j'explique la complémentarité entre PHPUnderControl et Phing
dimanche, février 21 2010
Capitaliser, Améliorer et Rationnaliser les développements PHP en interne
Par Olivier Hoareau le dimanche, février 21 2010, 17:36 - Outillage
samedi, janvier 9 2010
Incompatibilité Phing 2.3.3 et PHPUnit 3.4.x+
Par Olivier Hoareau le samedi, janvier 9 2010, 10:04 - Trucs et astuces
Phing, le port de Ant (java) en PHP, propose des tasks (balises xml) permettant d'exécuter des classes PHPUnit (tests unitaires en PHP). La version stable de Phing n'est maintenant plus compatible avec la dernière version stable de PHPUnit (3.4.3 actuellement) voir avec la branche 3.4.x, et on obtient l'erreur :
[PHP Error] require_once(PHPUnit/Util/Log/XML.php): failed to open stream: No such file or directory [line 22 of C:\Program Files\PHP\PEAR\phing\tasks\ext\phpunit\phpunit3\XMLPHPUnit3ResultFormatter.php]
Voici une piste pour y remédier :
mardi, novembre 17 2009
Session "Oui ! PHP est industriel !" au forum PHP 2009 @Paris
Par Olivier Hoareau le mardi, novembre 17 2009, 11:33 - Evènements
lundi, septembre 28 2009
PHP : Une plateforme industrialisable au service de l'Agilité
Par Olivier Hoareau le lundi, septembre 28 2009, 19:51 - Méthodologie
samedi, septembre 26 2009
Test unitaire: comment bouchonner ?
Par Olivier Hoareau le samedi, septembre 26 2009, 16:59 - Méthodologie
L'exécution d'un test unitaire nécessite en règle générale la mise en place de bouchon (mock en anglais) qui permettent de simuler les appels systèmes ou d'api sous jacent.
En effet, il peut être difficile de tester une partie de votre code qui a des impacts sur le système externe (enregistrement sur disque, appels réseaux / webservices, stockage mémoire vive, appels base de données...), le principe du bouchon est alors bien pratique pour tester la logique sans déclencher toutes les opérations.
vendredi, août 14 2009
Tests d'intégration, quézako ?
Par Olivier Hoareau le vendredi, août 14 2009, 11:17 - Méthodologie
Les tests unitaires c'est bien, mais ce n'est pas suffisant, surtout quand on a besoin de tester que notre application s'intègre effectivement bien avec un webservice d'un de nos fournisseurs... Parlons de tests d'intégration, donc.
lundi, août 10 2009
Tests Unitaires : ma philosophie via un exemple
Par Olivier Hoareau le lundi, août 10 2009, 08:38 - Méthodologie
Je vois souvent des tests dit unitaires chez mes clients, mais qui se connectent à la base de données, font des requêtes réseaux...
Voici une petite présentation de ce que personnellement j'appelle tests unitaires, par l'exemple.
mercredi, août 5 2009
Les fichiers de contextes : où comment utiliser la même appli sur le web, les tests unitaires, fonctionnels, la ligne de commande, ...
Par Olivier Hoareau le mercredi, août 5 2009, 09:03 - Trucs et astuces
Votre application peut être exécutée via :
* un navigateur (web) * une ligne de commande (batch) * PHPUnit (tests unitaires ou tests d'intégration) * GreenPepper / Fitnesse (tests fonctionnels) * ...
mercredi, juillet 22 2009
AgileTour 2009 @ Bordeaux : 3 sessions proposées
Par Olivier Hoareau le mercredi, juillet 22 2009, 08:15 - Evènements
Cette année l'AgileTour passe à Bordeaux le 29 Octobre, l'occasion pour moi de proposer quelques sujets de sessions...
mercredi, juillet 8 2009
Intégration PHPUnit dans Eclipse
Par Olivier Hoareau le mercredi, juillet 8 2009, 23:18 - Outillage
Une nouvelle intégration de PHPUnit 3.x dans Eclipse à la mode JUnit
mardi, avril 14 2009
"Injectabilité / Mockabilité" : Un indicateur simple de la qualité de votre design de code
Par Olivier Hoareau le mardi, avril 14 2009, 08:30 - Analyse
On parle souvent d'indicateur de qualité de code avec nombre de tests unitaires qui passent au vert, nombre d'erreurs détectées pour le non respect des standards, nombre de lignes de code...
Tous ces indicateurs donnent une information intéressante sur la qualité du code mais pas sur la qualité de l'architecture ou design du code, c'est à dire aucune évaluation de la conception de votre code.
mardi, avril 7 2009
Constuire une librairie "maison" : ou comment capitaliser à moyen terme
Par Olivier Hoareau le mardi, avril 7 2009, 14:53 - Méthodologie
Vous avez déjà développé des dizaines de milliers de ligne de code.
Vous avez déjà contribué à plusieurs (2, 5, 10 ...) projets d'applications PHP dans votre entreprise.
Vous avez déjà, comme moi, eu ce sentiment quand vous étiez sur le développement d'un morceau de code, que vous aviez déjà codé cela une fois, mais impossible de vous souvenir "comment" et "où" retrouver le code.
"Ah, si j'avais un listing bien organisé de tout ce que j'ai codé rangé par fonctionnalité..."
lundi, octobre 27 2008
Tests unitaires et Exception : attention aux try/catch !
Par Olivier Hoareau le lundi, octobre 27 2008, 09:00 - Trucs et astuces
Les tests unitaires, pour ceux qui les utilisent, sont bien pratiques pour tester notre code. Malheureusement ils peuvent introduire, si ils sont rédigés de façon maladroite des problèmes qui peuvent être compliqués à comprendre a posteriori. Imaginons le code suivant (volontairement) mal codé : ...
Commentaires récents
Ah oui je confirme, ne jamais utiliser Exception car PHPUnit lui même les attrape.
De manière générale utiliser Exception n'est pas correct de toute manière ;-)
$this->setExpectedException('MonException'); est aussi possible depuis un test.
Si le concept de packages pour PHP vous intéresse, jetez un coup d'oeil à http://webappkit.net
Il s'agit un système de paquets pour PHP, qui facilite la gestion des dépendances entre librairies et offre également une interface d'administration permettant de visualiser le tout et d'executer les tests unitaires.
Et bien sûr, c'est open source et quelques librairies sont déjà fournies.
Merci pour l'information sur webappkit !
Je testerais dès que possible.
Quelle est la particularité par rapport au système de gestion de dépendances et de packaging de PEAR ?
Olivier
PEAR s'installe au niveau système et ne gère que des librairies. Webappkit s'installe au niveau application web (simple dezippage), de telle manière qu'une appli construite sur Webappkit peut être entièrement installée via FTP.
De même, l'interface d'administration est une page web qui à terme permettra d'installer les librairies par upload de fichier zip. Pour l'instant elle permet de visualiser les tests, vérifier les dépendances, l'intégrité des paquets etc.
En outre, les paquets sont accessibles sous forme d'objets dont la classe est extensible, et auquels on peut adjoindre des objets services issus d'autres paquets. Un paquet peut ainsi contenir d'autres types de ressource que des scripts PHP, tel que des templates, etc. Ceci permet d'avoir une application complete sous forme de paquet.
Je ferai une nouvelle release (0.13) prochainement (une a deux semaines).
Je suis en train d'essayer, mais après avoir installé PHPUnitLaucher et les outils de dev Java, "Run As... Junit test" m'ouvre la console pour me dire "May be port 8888 in used, try another". Ou parfois il ne dit rien.
J'avoue que je ne sais pas quoi passer à -DphpunitArgs...
Plutot qu'écrire du code pour les Mock, PHPUnit a développé un système de bouchon assez puissant.
Voir la fonction getMock
Justement à propos de :
il manque un test (non unitaire cette fois-ci) qui nous permet de vérifier
Quelle serait sa forme idéale ? Implémentation, méthode, utilisation ?
@Bruno: un début de réponse dans mon post : http://blog.phppro.fr/?post/2009/08/14/Tests-d-integration-quezako
@jsh : tout à fait d'accord avec la présence de cette fonctionnalité intéressante de PHPUnit, pour ma part je préfère réaliser mes mocks moi même car sinon je ne peux pas utiliser de mock en dehors de mes tests unitaires, hors cela peut être intéressant d'utiliser un mock à certains moment du développement (au début du développement d'un webservices par exemple), ou bien dans un autre contexte d'appel que phpunit. D'autre part, je trouve le mécanisme de gestion de la pile d'appel assez verbeux à écrire pour le mock, et je préfère la notion de pile à la "addExpectedResult", plus brute mais plus simple. Mais la fonctionnalité reste intéressante ;)
@Cédric: je t'invite à ouvrir un ticket sur http://code.google.com/p/phpunit4eclipse/issues/list, ou à contacter Bertrand Paquet le développeur "bertrand point paquet at gmail point com"
merci pour cette article, c'est intéressant de trouver des sujets qui touche le monde professionel en plus autour de PHP. Ce qui est rare.
Mais c'est vrai qu'avoir des exemples concret c'est encore mieux. aussi je suis preneur
Complément d'information posté sur le blog de Clochix (http://www.clochix.net/post/2009/09...) concernant l'utilisation des fonctionnalité Mock de PHPUnit:
Pour ma part, j'évite de l'utiliser (i.e. la fonctionnalité Mock de PHPUnit) car je souhaite rester indépendant d'un quelconque framework lors de mon développement.
Les fonctionnalités Mock de PHPUnit sont très intéressantes, elles ont cependant de mon point de vue un défaut majeure dans l'utilisation que je fais des mocks. En effet, lorsque je développe j'utilise la version "mock" de mes classes (adapter) dans mon code tant que je n'ai pas développé la version native (standard). Cela me permet de prototyper / présenter rapidement les fonctionnalités "statiques" de mes développements et de "débrancher" lorsque je suis prêt le mock pour mettre la vraie implémentation (imaginez que je développe un webservice et que je doive rapidement fournir une version de mon webservice pour des consommateurs qui seraient "impatients"). Le problème avec le framework PHPUnit est qu'il n'est pas adapté a priori pour une utilisation en dehors des tests unitaires.
autre part les mocks peuvent être utiles dans d'autres cas encore que les tests unitaires et celui que je décris, par exemple certains tests d'intégration qui porte sur d'autres zones du code... même remarque dans ce cas.
Et vous quels sont vos pratiques pour mettre en place des bouchons dans les cas autres que les tests unitaires ?
Bonjour,
j'ai trouvé le slide excellent. cela correspond pile poil à ce que j'aimerai mettre en place dans mon entreprise.
ce n'est pas facile mais j'y crois dur comme fer.
est-ce que tu as quelques conseils sur la manière de procéder ?
merci d'avances
@jacko972: envoie moi un email sur contact at phppro point fr en me décrivant ton contexte, tes problématiques et tes questions
Merci pour cet article.
Il me servira de base pour l'intégration de ces outils.
Je n'utilise pas phing avec PUC, car PUC(CC) intègre déja Ant, je ne vois pas trop l'interêt de remplacer Ant par Phing ?
@jpauli: Phing étant écrit en PHP, il est 100% extensible en PHP (ce qui n'est pas le cas de Ant, qui nécessite Java). Ce qui permet de rapidement / facilement développer des tasks (classes) complémentaire pour rationnaliser certaines pratiques récurrentes dans les projets (mêmes internes). Dans mon cas, 80% des développeurs que je croise ne sont pas à l'aise avec Java, ca les rassure et les rend plus opérationnel d'utiliser un outil en PHP ;)
Merci pour l'article Olivier, comme d'habitude c'est intéressant
J'utilise ArrayAccess quand j'ai besoins de l'interface compatible array, à laquelle s'ajoutent généralement Countable et un Iterator. C'est d'une banalité affligeante ;)
Le gros défaut est que php interdit de redéfinir une méthode avec une signature différente. On ne peut donc pas y injecter du type hinting, ou alors on le fait de manière détournée dans le corps de la méthode.
Par exemple un ORM. Une property modélise une relation 1-N vers des types T. Celle-ci expose un "ArrayAccess" pour que l'utilisateur puisse y ajouter des types uniquement compatibles avec T. Ce comportement ne serait pas possible si la property n'était qu'un simple array dans lequel on peut ajouter ce qu'on veut.