Le développement basé sur des tests (TDD) est un concept de développement logiciel qui repose sur lrsquoécriture de tests avant drsquoécrire des fonctionnalités ou des corrections de bogues. Crsquoest une grande différence dans la façon dont envisagez le développement. Jrsquoai eu du mal à passer à TDD, à la fois parce qursquoil srsquoagit drsquoun modèle mental différent et parce qursquoil est difficile de changer la façon dont les bibliothèques sont traitées. Avant TDD, jrsquoai écrit le Code qui devrait fonctionner, je lrsquoai testé manuellement dans mon navigateur, jrsquoai vu pourquoi il ne fonctionnait pas, je lrsquoai réparé, et jrsquoai écrit le test. Avec TDD, jrsquoécris des énoncés de fonctions et des tests qui décrivent comment le code devrait fonctionner et qui déterminent les critères qui me font croire que le code fonctionne. Crsquoest le seul moyen pour que ça marche. La définition du terme « oeuvre » nrsquoest plus ambiguë et jrsquoai un critère qui peut être jugé par la programmation. En écrivant mes critères de test dans le Code, la personne qui regarde le Code peut déterminer si les critères de test sont corrects. Cette dernière section évite lrsquoambiguïté de lrsquoexpression « utile pour moi » entre les membres de lrsquoéquipe et permet ensuite de comprendre les différences: lrsquoenvironnement drsquoessai ou les critères drsquoessai. En utilisant le contrôle manuel de la qualité, nrsquoen avez pas du tout à moins que nrsquoayez documenté chaque étape du test.
Dans je vais étudier comment utiliser lrsquoexemple de mon plug in Caldera forms pour écrire une requête TDD pull en utilisant phpunit. Ce n’est pas un article sur la façon d’exécuter des tests dans le développement WordPress. Jrsquoai écrit des tests drsquoentraînement PHP, des tests drsquointégration PHP, des tests drsquoentraînement Javascript, des tests drsquointégration JavaScript Torque. Cet article est basé sur mon expérience avec TDD dans le plug in Caldera forms. Je préfère TDD et je pense qursquoil est plus rapide que les tests manuels de navigateur, en particulier dans le développement JavaScript. Srsquoil est bien fait, il rend le code plus facile à gérer.
TD Introduction
Q si êtes nouveau au TDD, pourriez trouver plus facile de lrsquoutiliser comme première chose à essayer. Voici les étapes drsquoune liste facile à suivre: écrivez assez de fonctions pour les décrire dans votre test. Écrire les tests échoués. Réussir le test. Révision du Code. Lorsque utilisez TDD, devez effectuer et envoyer une soumission inopérante. Pousser la branche principale ou la branche de développement avant que le test soit réussi signifie que chaque changement interrompt la branche principale, ce qui est un problème. Crsquoest pourquoi le flux GIT a du sens. Ouvrez une nouvelle branche, effectuez des changements incrémentaux et fusionnez les changements seulement après avoir réussi des vérifications automatiques telles que les étapes de test, Lint, Code Quality Scan et Manuel Code Check.
Parlons drsquoun exemple simple, puis regardons un exemple du monde réel. Supposons que votre besoin soit de créer un objet pour ajouter deux nombres. Drsquoabord, jrsquoécrirai une fonction sans corps: ensuite, jrsquoajouterai deux tests pour mrsquoassurer que les règles mathématiques établies sont respectées: ensuite, je changerai ma fonction originale en une seule fonction de commit pour travailler réellement: Pourquoi commit les tests échoués avant drsquoexécuter le Code pour deux raisons. Tout drsquoabord, devrait, dans la mesure du possible, ne faire qursquoune seule chose. Deuxièmement, une fois le test réussi, votre code ou celui de la personne qui examine le changement peut déterminer que le test est correct, mais que la mise en oeuvre nrsquoest pas correcte. cela se produit, pouvez utiliser lrsquoimplémentation pour récupérer la soumission sans perdre le test ou exécuter un git plus complexe, puis recommencer.
TDD paie après que le Code teste maintenant JavaScript. Mais il y a une fonction bien validée qui permet drsquoitérer en toute sécurité. Supposons que deviez ajouter un troisième paramètre pour
Le résultat conserve le nombre de décimales spécifié. Changez drsquoabord la signature de la fonction: Je lrsquoutilise comme paramètre optionnel pour maintenir la compatibilité avec les versions précédentes. Pour mrsquoassurer que mes hypothèses sont correctes, je ne modifierai pas les tests existants. Ils ont démontré la compatibilité avec les versions précédentes. Changer un test existant sent mauvais, ce qui indique que votre test est trop rigide.
Au lieu de cela, jrsquoajouterai deux autres tests: en mettant en œuvre des tests à chaque étape, je suis convaincu que mes améliorations sont réelles et nrsquoentraîneront pas de nouveaux défauts. Le temps consacré aux tests vaut la peine de changer votre Code existant à lrsquoavenir. Combien drsquoassurance faut il pour lrsquoexamen? Ça dépend de ce que construisez. Les règles de TDD les plus orthodoxes que jrsquoai pu trouver proviennent drsquooncle Bob: il nrsquoest pas permis drsquoécrire un code de production à moins qursquoun test de conduite échoué ne soit nécessaire. Il suffit de ne pas autoriser lrsquoécriture de plusieurs tests unitaires pour échouer, et une erreur de compilation est un échec. Il nrsquoest pas permis drsquoécrire plus de code de production que nécessaire pour réussir un seul test drsquoUnit é défaillante. Il srsquoagit drsquoune norme très stricte qui peut facilement conduire à des tests qui rendent plus difficile la modification de la base de code. Nrsquooubliez pas que lrsquoobjectif est drsquoaugmenter, pas de ralentir, le rythme de développement.
Lrsquoingénieur de paypal, kentc.dobbs, auteur du cours de test drsquoapplication Javascript, a publié un excellent billet sur ce sujet. Dans il affirme que « votre taux de rendement des tests diminue à mesure que la couverture augmente de plus de 70%. Je nrsquoaime pas ça, mais il est plus expérimenté que moi. Notez que ses projets open source ont une couverture de 100% parce qursquoils « sont des outils réutilisables dans de nombreux cas différents (la rupture peut causer de graves problèmes dans de nombreux projets de consommation) », il semble
Comme règle pour les plugins WordPress. Il a également écrit que son projet OSS « permet relativement facilement une couverture de code de 100%. Cela ne ressemble pas à beaucoup de plugins WordPress.
Personnellement, mes règles sont plus larges que celles que nous avons actuellement. Le manque de preuves est une dette technique qui expire plus tard. lrsquoécriture des tests prend maintenant plus de temps, cela en vaut la peine. Pour le nouveau Code, il force à écrire le code à lrsquoaide drsquoun modèle vérifiable. Parfois, il est difficile de refaire le Code pour le rendre testable en premier. Tester des disques isolés dans WordPress n’est pas facile. En général, Cypress est utilisé pour effectuer des tests automatisés drsquointerface utilisateur. Moi ou lrsquoInspecteur Wraith mrsquoavons aidé. Je peux rapidement introduire de nombreuses fonctionnalités sans mrsquoinquiéter du fait que le Code nrsquoest pas testable.
En utilisant TDD pour ajouter une fonctionnalité, je voudrais voir un exemple de ma demande de traction TDD pour le formulaire cratère. Dans cet exemple, il srsquoagit drsquoune nouvelle fonctionnalité: ajouter un paramètre pour la taille maximale de téléchargement du fichier. Une partie que jrsquoaime chez TDD, crsquoest qursquoelle force à découvrir les nouvelles fonctionnalités dont avez besoin avant de les écrire. Je ne sais pas pour toi, mais jrsquoai écrit beaucoup de code et ça mrsquoa pris beaucoup de temps pour commencer à travailler, juste pour réaliser que je nrsquoen avais pas besoin. TDD mrsquoa forcé à réfléchir à mon plan avant de continuer. souhaitez lire la requête pull sur github, regardez ce qui suit: https:github.comCalderaWPCaldera-Formspull2823
Je dois souligner que ce pr est étrange parce que nous devons fusionner plusieurs branches avec des changements connexes en cours. Lrsquoadoption de la DTD est confuse et je ne prétends pas qursquoelle respecte pleinement ses lois. Écrire des tests échoués peut parfois être difficile à terminer en même temps. Par exemple, dans ce cas, je dois développer des méthodes pratiques pour lire les paramètres de champ et
En vérifiant la taille du fichier, je dois intégrer ces méthodes utilitaires dans le Code existant. Jrsquoai choisi de le faire en deux étapes. Jrsquoai lancé et testé des méthodes pratiques, puis je suis passé à ces nouvelles méthodes.
Crsquoest ma première promesse: https:github.comCalderaWPCaldera-Formspull2823commitsd878e9d501af6aae92d72e45340a185dea1e9c69 regardez le Code, jrsquoa i ajouté deux méthodes pratiques à une classe, mais je ne leur ai donné aucun corps fonctionnel: Crsquoest tout ce que je développe. Jrsquoai également effectué des tests pour montrer comment ces fonctions devraient fonctionner: ces tests montrent comment les nouvelles méthodes devraient fonctionner. Les commentaires en ligne expliquent pourquoi chaque mot est ainsi. Ce processus mrsquoa forcé à réfléchir à la façon dont les paramètres devraient être construits, à lrsquoabsence drsquointerface utilisateur pour le moment et à la façon de les utiliser plus tard. Ma règle générale est que la soumission ne devrait faire qursquoune seule chose. Cette soumission ajoute de nouvelles méthodes et des tests échoués.
Voulez utiliser lrsquoentier 1 ou la chaîne lsquo1rsquo ou lsquotruersquo au lieu du bouton droit booléen? Je pense, bien sûr, que crsquoest simple et que je nrsquoai pas besoin de tests pour utiliser ces méthodes. De plus, ma première tentative nrsquoa pas été couronnée de succès, et tout ce que je sais, crsquoest que mon test a échoué et que la façon dont il a échoué mrsquoa aidé à comprendre pourquoi. Jusqu’à présent, il y a eu des tests d’intégration technique en plus des tests d’isolement, car l’environnement a besoin de wordpress pour fonctionner, et je ne pense pas que l’utilisation de Mock pour les tests unitaires en vaille la peine. Les autres tests sont principalement des tests drsquointégration réels. Pour le champ de fichier Caldera forms, nous avons un paramètre distinct pour le fichier. Dans ce cas, je nrsquoai pas besoin de contacter le gestionnaire pour ce paramètre parce que je nrsquoai pas mélangé cette logique dans le gestionnaire API. La responsabilité du gestionnaire d’api est d’interagir avec l’api WordPress rest avec une classe séparée, le « uploadhandler», qui effectue le téléchargement à l’aide des données transmises par l’api rest. Cela signifie que je nrsquoai qursquoà faire des changements dans le gestionnaire de téléchargement. Ce cours change. Les modifications apportées sont nécessaires pour imposer une limite de taille de fichier. La logique drsquoentreprise est ailleurs. Je dois juste mrsquoassurer que je lui ai donné un gros dossier. Je dois mrsquoassurer que le fichier de la bonne taille fonctionne de la même façon et génère une exception si le fichier est trop grand. Voici trois nouveaux tests: le premier test testknowsfileistoolarge () nrsquoa pas effectué toutes les permutations de test pour la méthode utilitaire que jrsquoai créée plus tôt parce que je savais déjà qursquoelle était valide. Je vérifie juste si la fonction fonctionne dans ce cas. Le deuxième test testexception when fileistoolarge () assure que le résultat du test réussi est une exception générée. Notez que je nrsquoutilise pas le modèle try catch. Jrsquoai utilisé expectexception en phpunit. Crsquoest la bonne approche.
TDD pour les plug ins existants