WCEU : Unit testing like a pirate
Plus de 4 minutes đ
Comme vous le savez peut ĂȘtre le WordCamp Europe s’est dĂ©roulĂ© Ă Leiden du 5 au 7 octobre 2013. Durant ces 2 jours les confĂ©rences Ă©taient rassemblĂ©es par thĂšme. Celle-ci fait partie des confĂ©rences LEARN et le sujet est le test unitaire et elle est prĂ©sentĂ©e par Ptah Dunbar.
Tout d’abord vous pouvez retrouver la confĂ©rence ici :
Mais que nous dit notre orateur ?
WordPress devient de plus en plus une plateforme pour crĂ©er des applications. La simplicitĂ© de lâadministration permet de manier ses donnĂ©es de façon simple et surtout la plĂ©thore des plugins d’Ă©tendre ses possibilitĂ©s. Par exemple la plateforme live ninja qui utilise WP avec BuddyPress mais aussi nodejs. Doonc il est possible d’utiliser WordPress comme App.
Les plugins
Les plugins sont le coeur de WordPress, leur multiplicitĂ© permet de rĂ©pondre aux diffĂ©rents besoin. La question est : Votre plugin peut-il ĂȘtre utilisĂ© dans une grosse structure de Webapp ? On trouve beaucoup de plugins mais la qualitĂ© du code du repository de WordPress n’est pas bonne, alors qu’il faut se concentrer sur cette qualitĂ©. DĂ©ployer du nouveau code peut avoir des effets indĂ©sirables sur d’autres fonctionnalitĂ©s, c’est ce que l’on appelle des effets de bord et il n’est pas facile de les dĂ©tecter.
Actuellement :
- Tests fonctionnalités par fonctionnalités, une fonctionnalité finie, on valide puis on passe à la seconde
- C’est lent, il faut aller les faire soit mĂȘme, cliquer, mettre les donnĂ©es, valider etc.
- On va surtout manquer des choses, on ne peut pas gérer tous les effets de bord
On a besoin de tester nos plugins, d’ĂȘtre sĂ»r que tout fonctionne parfaitement, que nos clients soient contents.Il faut que se soit rapide et que la rĂ©ponse soit claire, que tout soit rĂ©utilisable, donc que tout soit fiable.
Cependant PHP comparĂ© aux autres langages n’est pas mature par rapport a ces demandes. On voit bien que Ruby, Python et autres sont bien adaptĂ©s pour gĂ©rer ce genre de choses.
La solution :
Le Unit testing bien sĂ»r ! ( ou les tests unitaires ). On va donc Ă©crire des test unitaires, ils  vont donner une rĂ©ponse fiable sur ce qu’il s’est passĂ©. Un test va tester une fonctionnalitĂ© et une seule fonctionnalitĂ© ! Ces test permettent de sĂ©parer le design du code, bien sĂ»r ça ne teste pas le code javascript mais on est sĂ»rs que le processus PHP s’est bien passĂ©.
Les tests unitaires dans PHP :
Le framework de tests unitaires présenté est PHPunit et il y a le petit framework français atoum qui utilise les fonctionnalités de PHP 5.3 pour créer les tests.
DĂ©finition :
Un test unitaire : c’est un bout de code qui s’execute des certaines conditions, il y a ne valeur attendue et une valeur reçue, on vĂ©rifie donc que ce que l’on attend et ce que l’on reçoit est exactement pareil. MĂȘme si le rĂ©sultat attendu est une erreur. Pour savoir si en passant un certain argument on retourne bien une WP_Error, on peut et on doit le tester.
Une suite de tests : Un ensemble de tests unitaire qui sâexĂ©cutent. Nous pouvons donc crĂ©er un ensemble de tests qui vont vĂ©rifier un ensemble de fonctionnalitĂ©s comme par exemple un panier de site ecommerce etc.
Assertion : ce que l’on attend, on attend donc une valeur et la teste dans l’environnement rĂ©el pour savoir si tout s’est bien passĂ©. Si on attend 56 mais que la fonction renvoie 10 alors le test Ă©choue !
Un ensemble de fonctionnalitĂ©s inhĂ©rentes au framework sont disponibles comme tester si on retourne bien true ou false que ce n’est pas NULL ou que le rĂ©sultat contient une certaine valeur etc. (Voir la page 31 de la prĂ©sentation )
La crĂ©ation d’un test unitaire :
Pour crĂ©er un test unitaire c’est simple, il ne faut que 3 choses : Une assertion ( ce que je veux ), une action ( ce que le code fait ) et un contexte dâexĂ©cution.
Exemple :
On veut tester une fonction d’addition, on va donc crĂ©er deux variables que l’on veut additionner par exemple 3 et 4 (contexte), on va exĂ©cuter notre fonction d’addition sur notre contexte (action) et vĂ©rifier que l’on va bien obtenir notre rĂ©sultat, 7 (assertion). Si le test se passe bien alors il va signaler que tout s’est dĂ©roulĂ© comme prĂ©vu.
Par contre il est plus difficile d’appliquer ça Ă WordPress car les plugins sont souvent mis dans des contextes ( hooks ). C’est donc dans la derniĂšre partie(assertion) que la difficultĂ© se trouve, il faut pouvoir prĂ©voir ce que WordPress va nous retourner. Le plus simple est de dĂ©couper son code de façon Ă ce qu’il soit testable de façon facile.
On peut donc tester son cache, vĂ©rifier des requĂȘtes SQL etc. La meilleure façon d’Ă©crire ses tests est de faire la liste des donnĂ©es requises et des conditions requises pour chaque fonctionnalitĂ© pour bien crĂ©er le bon contexte et crĂ©er l’interface utilisateur d’abord puis d’ajouter le code par dessus par la suite.
Je vous conseille de parcourir sa confĂ©rence pour avoir plus d’exemples.
L’auteur a crĂ©Ă© un squelette de plugin qui va prendre en compte les tests unitaires :
https://github.com/ptahdunbar/wp-skeleton-plugin/
Conclusion :
Ce que nous pouvons retenir de cette confĂ©rence est qu’il est nĂ©cessaire et mĂȘme indispensable de crĂ©er des tests unitaires, nous passons beaucoup de temps pour les Ă©crire mais c’est la garantie d’Ă©viter le maximum d’erreurs de syntaxe, de variable mal Ă©crite etc.
Donc les tests unitaire bouffez-en et surtout habituez vous Ă en faire, qui sait ? Peut ĂȘtre un jour un de vos plugin deviendra payant et demandera d’avoir une qualitĂ© professionnelle et avoir un gros bug d’une version vous fera perdre des clients.
Hey Nicolas!
Amazing translation of my presentation in french (I can understand fluently, but not write :/)! You’ve really captured the main points and what I was trying to convey. Like I mentioned in the talk, it was the first of many to address the quality of plugins we develop for WordPress.
It is the quality of our plugins that will ultimately determine whether WordPress is suitable as a mainstream application platform.
Cheers!
Hi !
Thank you very much for you conference, very interesting and I really appreciate it :).
I hope your message will be heard in french too !
Nicolas đ