Dans la première partie de cette série, nous avons examiné de près les méthodologies de test et avons expliqué pourquoi il était avantageux pour nous de commencer à le faire dans nos projets WordPress. Nous avons également pris le temps de configurer PHPUnit et les tests WordPress afin de commencer à construire notre premier plugin testable..
Dans ce dernier article, nous allons définir une méthodologie pour les tests unitaires, commencer à l'intégrer à notre travail et proposer un plugin entièrement fonctionnel (bien que simple) qui comporte également un petit ensemble de tests garantissant son fonctionnement parfait. comme prévu.
Quand il s'agit de tester, il y a généralement deux façons de le faire:
D'après mon expérience, la première approche est toujours meilleure. Certes, il est pratiquement impossible de le faire dans le contexte d’une application déjà existante, mais si vous partez de l’avant, ce que nous sommes, c’est une meilleure approche et voici pourquoi: sais comment ça marche. En tant que tel, il peut être extrêmement difficile d’écrire des tests qui étendent l’application lorsque vous savez intrinsèquement comment elle est censée fonctionner..
À cette fin, je trouve préférable d'écrire les tests premier. De cette façon, vos tests incluent non seulement la façon dont le programme est supposé pour fonctionner, mais cela devient aussi une forme de documentation montrant quelle fonctionnalité est destinée et aboutira finalement à un échec lorsque la fonctionnalité ne fonctionne pas comme il se doit.
Dans cet esprit, nous allons construire avec cette méthodologie simple:
Enfin, en guise de mise à jour, notre plug-in va donner un message de bienvenue spécialisé au visiteur, basé sur le fait qu'il a cliqué sur le site depuis Google ou Twitter. Nous allons également écrire ceci de manière à ce qu'il soit plus facile de développer des services supplémentaires, si vous le souhaitez à l'avenir..
À ce stade, il est temps de commencer à écrire du code. Cependant, contrairement à la plupart des projets, nous n'allons pas nous lancer dans un code spécifique à WordPress. Au lieu de cela, nous allons remplacer notre classe de tests unitaires. Si vous avez structuré le répertoire de votre plugin en fonction de ce que nous avons partagé dans le premier post ou de la façon dont nous l'avons configuré sur GitHub, vous devriez avoir un hello_reader_tests.php fichier situé dans votre tests / tests wordpress annuaire. Vous n'êtes pas obligé de suivre cette organisation, bien sûr, mais cela vous aidera à progresser dans le projet..
Supposons la classe de tests unitaires:
require_once ('… /… /plugin.php'); La classe Hello_Reader_Tests étend WP_UnitTestCase // end class
Maintenant, essayez d'exécuter le test en utilisant le terminal en utilisant l'unité PHP. En supposant que vous utilisez l'unité PHP à partir de votre installation MAMP locale, vous devriez pouvoir entrer:
$ /Applications/MAMP/bin/php/php5.3.6/bin/phpunit ./hello_reader_tests.php
À ce stade, vous devriez voir un échec:
C'est bon! Cela signifie que PHPUnit est installé et en cours d'exécution et que votre infrastructure de test WordPress est prête à fonctionner. Le test a échoué simplement parce que nous n’avons réellement écrit aucun test. Commençons à faire ça.
Commençons par écrire un test pour nous assurer que notre plug-in est initialisé, instancié et prêt à être testé. Rappelez-vous plus tôt dans le premier article que nous avons stocké une référence à l'instance de Hello Reader dans PHP $ GLOBALS
tableau. Voici comment nous allons accéder à cette instance à l'aide du framework de test. Alors mettons à jour notre test unitaire pour ressembler à ceci:
Notez que pour des raisons d'espace, je vais laisser de côté les commentaires de code, mais le plugin et les tests entièrement commentés seront disponibles sur GitHub..
require_once ('… /… /plugin.php'); La classe Hello_Reader_Tests étend WP_UnitTestCase private $ plugin; fonction setUp () parent :: setUp (); $ this-> plugin = $ GLOBALS ['hello-reader']; // fin de la fonction d'installation testPluginInitialization () $ this-> assertFalse (null == $ this-> plugin); // end testPluginInitialization // end class
Ci-dessus, nous avons configuré une référence à l'instance du plug-in afin de pouvoir y accéder tout au long de nos tests unitaires. Nous utilisons le installer
méthode pour récupérer la référence au plugin $ GLOBALS
. Notez cependant que nous avons introduit une autre fonction appelée testPluginInitialization
. Cette fonction vérifie que la référence que nous avons configurée dans le installer
méthode n'est pas nulle.
Si vous relancez les tests, vous devriez maintenant obtenir un test réussi et votre terminal devrait ressembler à ceci:
Il y a une livraison importante ici: Notez que la fonction unique que nous avons fournie ci-dessus a un objectif clair: vérifier que le plug-in a été correctement initialisé. Son nom de fonction est clair et contient une seule déclaration d'assertion. C’est un excellent moyen de modéliser nos tests restants principalement parce qu’il est facile de trouver des bogues quand ils apparaissent. Pensez-y de cette façon: si vous incluez plusieurs déclarations d'assertion différentes dans une même fonction, il sera difficile de déterminer laquelle des déclarations d'assertion échoue..
Maintenant que nous avons appris à rédiger des tests unitaires, à les exécuter et à évaluer leur réussite ou leur échec, commençons à mettre en œuvre les fonctionnalités du plug-in. Tout d'abord, nous devrons configurer un filtre pour le contenu, car nous allons ajouter du texte au début du contenu. En suivant la méthodologie que nous avons définie plus haut dans cet article, écrivons d’abord notre test.
Ce test particulier va vérifier si nous avons ajouté un ensemble de texte spécifique à la première partie du message:
function testAddWelcomeMessage () $ this-> assertEquals ('TEST CONTENT', $ this-> plugin-> add_welcome_message ('Ceci est un exemple de contenu de publication. Ceci simule le retour de WordPress lors de la visualisation d'un message de blog.'), 'add_welcome_message ( ) ajoute un message de bienvenue au contenu du message. '); // end testAddWelcomeMessage
Si vous exécutez le test exactement tel qu'il est, il n'échouera même pas. Au lieu de cela, PHPUnit renverra une erreur fatale car la méthode n'est pas définie dans le plug-in. Alors ajoutons cela maintenant. Mettez à jour le plugin pour qu'il ressemble à ceci:
class Hello_Reader function __construct () add_filter ('the_content', array (& $ this, 'add_welcome_message')); // fin constructeur fonction publique add_welcome_message ($ content) // fin add_welcome_message // end class
Maintenant, essayez de lancer le test. Le test ne bombardera pas, mais vous devriez réellement voir un échec avec un message clair expliquant pourquoi le test a échoué:
1) Hello_Reader_Tests :: testAddWelcomeMessage add_welcome_message () ajoute un message de bienvenue au contenu du message. Échec de l'affirmation que null correspond au "CONTENU DU TEST" attendu
Donc, conformément à notre méthodologie, nous voulons que ce test réussisse. Pour ce faire, nous devons nous assurer que le contenu de l'article contient la chaîne de texte - dans ce cas, 'CONTENU DU TEST
', pour le faire passer. Alors essayons ceci. Mettez à jour la fonction correspondante dans le plugin pour ajouter la chaîne avant le contenu:
fonction publique add_welcome_message ($ content) return 'TEST CONTENT'. $ contenu; // fin add_welcome_message
Et encore une fois, nous relançons le test uniquement pour constater qu'il échoue. Si vous remarquez notre test, c'est parce qu'il cherche à voir notre contenu. équivaut à la 'CONTENU DU TEST
' chaîne. Au lieu de cela, nous devons nous assurer que la chaîne commence par le contenu. Cela signifie que nous devons mettre à jour notre test. Heureusement, PHPUnit a une fonction assertContains. Alors mettons à jour notre code pour l'utiliser:
function testAddWelcomeMessage () $ this-> assertContains ('TEST CONTENT', $ this-> plugin-> add_welcome_message ('Ceci est un exemple de contenu de publication. Ceci simule le retour de WordPress lors de la visualisation d'un message de blog.'), 'add_welcome_message ( ) ajoute un message de bienvenue au contenu du message. '); // end testAddWelcomeMessage
Encore une fois, relancez le test et vous devriez voir que le test réussit maintenant. Impressionnant! Nous devons maintenant écrire des messages personnalisés pour les utilisateurs de Twitter et ceux de Google..
Nous pouvons vérifier de différentes manières comment un utilisateur est arrivé à une page donnée. Parfois, nous pouvons vérifier les valeurs dans le $ _GET
tableau, parfois nous pouvons interroger le $ _SERVER
tableau, ou parfois nous pouvons vérifier la session d'un utilisateur. Pour les besoins de cet exemple, nous allons rechercher «twitter.com» dans le $ _SERVER ['HTTP_REQUEST']
. Je dis cela juste pour que vous puissiez suivre ce que nous faisons dans le code.
Donc, d’une manière générale, le add_welcome_message
devrait vérifier si la demande provient de Twitter, puis adapter le message de manière appropriée. Puisque nous sommes en train de tester chaque fonctionnalité, nous pouvons écrire une fonction permettant d’évaluer si la demande provient de Twitter. Alors écrivons un nouveau test:
Dans le plugin:
fonction publique is_from_twitter () // end is_from_twitter
Dans le test:
fonction testIsComingFromTwitter () $ _SERVER ['HTTP_REFERER'] = 'http://twitter.com'; $ this-> assertTrue ($ this-> plugin-> is_from_twitter (), 'is_from_twitter () deviendra vrai si le site référent est Twitter.'); // end testIsComingFromTwitter
Nous sommes évidemment spoofing la HTTP_REFERER
valeur, mais ce n'est pas grave pour les besoins de cet exemple. Le point demeure: lancer le test, il échouera et nous devrons donc implémenter la fonction dans le plug-in pour le faire passer:
fonction publique is_from_twitter () return strpos ($ _SERVER ['HTTP_REFERER'], 'twitter.com')> 0; // end is_from_twitter
La réexécution du test devrait maintenant aboutir à un test réussi. Mais attendez, nous devons être complets. Faisons en sorte de lancer un test pour vérifier que cette fonction échoue lorsque le référent est ne pas de Twitter.
function testIsNotComingFromTwitter () // Usurpation de HTTP_REFERER aux fins de ce test et de la publication de blog associée $ _SERVER ['HTTP_REFERER'] = 'http://facebook.com' '; $ this-> assertFalse ($ this-> plugin-> is_from_twitter (), 'is_from_twitter () deviendra vrai si le site référent est Twitter.'); // end testIsNotComingFromTwitter
Notez que nous avons mis à jour le HTTP_REFERER
et nous avons changé affirmer vrai
à affirmer
. Permettez que tout le reste soit correct, lancez les tests et ils devraient réussir.
Fournir un message personnalisé à Google nécessitera la même chose que pour Twitter, c’est-à-dire imiter le HTTP_REFERER
puis retourne vrai ou faux pour la fonction d'assistance. Donc, pour éviter de paraître redondant, je vais garder cette section aussi concise que possible. Les mêmes étapes que pour Twitter doivent être suivies.
Tout d’abord, nous décomposons la fonction d’aide dans le plugin:
fonction publique is_from_google () // end is_from_google
Ensuite, nous résumons le test:
fonction testIsComingFromGoogle () $ _SERVER ['HTTP_REFERER'] = 'http://google.com'; $ this-> assertTrue ($ this-> plugin-> is_from_google (), 'is_from_google () renverra la valeur true lorsque le site référent est Google.'); // end testIsComingFromGoogle
Exécuter le test tel qu'il est actuellement entraînera un échec. Alors, implémentons le is_from_google ()
une fonction:
fonction publique is_from_google () return strpos ($ _SERVER ['HTTP_REFERER'], 'google.com')> 0; // end is_from_twitter
Et maintenant, le test devrait passer. Mais, encore une fois, nous devons être complets. Écrivons le test d’échec pour supposer que la fonction ne sera pas vraie si les utilisateurs viennent d’autre part:
function testIsNotComingFromGoogle () // Usurpation de HTTP_REFERER aux fins de ce test et de l'article de blog associé $ _SERVER ['HTTP_REFERER'] = 'http://facebook.com' '; $ this-> assertFalse ($ this-> plugin-> is_from_google (), 'is_from_google () renverra la valeur true lorsque le site référent est Google.'); // end testIsNotComingFromGoogle
Enfin, lancez vos tests. Si tout le reste est correct, vous devez passer six tests..
À ce stade, nous avons tout ce dont nous avons besoin pour commencer à afficher des messages de bienvenue personnalisés à nos utilisateurs. La seule chose à faire est que nous devrons refactoriser notre test initial qui vérifie le contenu du test. Maintenant, nous devrons introduire des tests pour les cas suivants:
Supposons donc le test que nous avons créé précédemment testAddWelcomeMessage
au lieu d'ajouter trois nouveaux tests.
Tout d'abord, nous allons ajouter un test qui vérifie le message de bienvenue de Twitter.
Dans le plugin, nous allons réduire le add_welcome_message
pour ça:
fonction publique add_welcome_message ($ content) return $ content; // fin add_welcome_message
Et nous ajouterons d'abord le test Twitter:
function testDisplayTwitterWelcome () // Remplacez HTTP_REFERER pour Twitter $ _SERVER ['HTTP_REFERER'] = 'http://twitter.com'; $ this-> assertContains ('Bienvenue sur Twitter!', $ this-> plugin-> add_welcome_message ('Ceci est un exemple de contenu de publication. Ceci simule le retour de WordPress lors de la visualisation d'une publication de blog.') message au contenu du message. '); // end testDisplayTwitterWelcome
À ce stade, c'est vieux chapeau, non? Exécutez-le, le test échouera. Mettre en œuvre le add_welcome_message
ressembler à ceci:
fonction publique add_welcome_message ($ content) if ($ this-> is_from_twitter ()) $ content = 'Bienvenue sur Twitter!' . $ contenu; // end if return $ content; // fin add_welcome_message
Lancez-le à nouveau et ça passera. Le test de Google est le suivant:
function testDisplayGoogleWelcome () // falsifiez HTTP_REFERER pour Google $ _SERVER ['HTTP_REFERER'] = 'http://google.com'; $ this-> assertContains ('Bienvenue de Google!', $ this-> plugin-> add_welcome_message ('Ceci est un exemple de contenu de publication. Ceci simule le retour de WordPress lors de la visualisation d'une publication de blog.') message au contenu du message. '); // termine testDisplayGoogleWelcome
Exécutez le test, faites-le échouer, puis mettez à jour le add_welcome_message
dans le plugin pour contenir une vérification en utilisant la fonction d'assistance que nous avons écrite plus tôt:
fonction publique add_welcome_message ($ content) if ($ this-> is_from_twitter ()) $ content = 'Bienvenue sur Twitter!' . $ contenu; else if ($ this-> is_from_google ()) $ content = 'Bienvenue de Google!' . $ contenu; // end if return $ content; // fin add_welcome_message
À ce stade, vous devriez avoir un plugin entièrement fonctionnel avec sept tests unitaires réussis.!
Comme vous pouvez le constater, les tests unitaires introduisent un niveau de développement supplémentaire, mais peuvent s'avérer très rentables en termes de code maintenable, bien organisé et testable. Au fur et à mesure que votre application grandit, l'exécution de tests continus pour vérifier que vos projets fonctionnent comme prévu peut vous donner un sentiment d'esprit. Bien entendu, il ne s'agit que d'un petit exemple du fonctionnement des tests unitaires. L'application de ces pratiques peut porter ses fruits dans des projets beaucoup plus vastes et / ou compliqués.
Enfin, vous pouvez trouver ce plugin, les tests WordPress et les tests unitaires Hello Reader commentés sur GitHub.