Test automatique pour TDD avec PHP

Un développement traditionnel basé sur des tests peut parfois être lourd. Vous devez arrêter d'écrire du code pour pouvoir exécuter vos tests. Heureusement, il existe des solutions qui permettent d'exécuter automatiquement vos tests lorsque vous codez. Dans ce tutoriel, vous apprendrez à utiliser une gemme Ruby, appelée regarder, pour surveiller votre code et exécuter automatiquement les tests appropriés chaque fois que vous enregistrez votre travail.


Étape 1: Configuration logicielle requise

Tout outil qui vous aide à obtenir des commentaires plus rapidement est un atout précieux.

Ce didacticiel utilise PHP pour l’exemple de code. Cependant, les techniques sont applicables à n’importe quel langage, qui offre un utilitaire CLI pour les tests unitaires. Ruby est requis parce que nous allons utiliser la gemme watchr. Donc, assurez-vous que vous avez une installation fonctionnelle de Ruby et PHP avec PHPUnit.

Ensuite, assurez-vous d'avoir libnotify installé, si vous êtes sous Linux; Les utilisateurs Windows et Mac OSX ont besoin de "Growl". Ce tutoriel est directement applicable sur Linux, mais je suggérerai des commandes et des réglages alternatifs si possible.

Maintenant, il est temps d'installer la gemme watchr. Ouvrez une console et assurez-vous que vous êtes dans le dossier où vous pouvez exécuter directement gemme. Tapez la commande suivante:

bijou installer watchr

Étape 2: Contexte technique

Lorsqu'un fichier ou un dossier est modifié, watchr peut déclencher une fonction de rappel..

Watchr gem est un programme exécutable écrit en Ruby. Il englobe les fonctionnalités présentes dans le système de fichiers d’un système d’exploitation pour permettre de surveiller les modifications apportées à un fichier ou à un dossier spécifique. Naturellement, ces fonctionnalités de système de fichiers diffèrent selon les systèmes d'exploitation et les systèmes de fichiers..

watchr fournit une interface de programmation d'application (API) unifiée pour tous les systèmes d'exploitation. Sous Linux, il utilise inotifier, la bibliothèque d'événements du système de fichiers du noyau; sur d'autres systèmes d'exploitation, il utilise l'alternative appropriée. Si, pour une raison quelconque, le système d'exploitation ne dispose pas d'un service d'événements, watchr interroge périodiquement le fichier ou le dossier surveillé..

Lorsqu'un fichier ou un dossier est modifié, watchr peut déclencher une fonction de rappel. Nous allons utiliser cette fonction pour exécuter nos tests.


Étape 3: Créer un projet PHP

Notre projet est plutôt simple. Répliquez la structure de répertoires simple présentée dans l'image suivante:

dans le Nettuts.php fichier, ajoutez le code suivant:

Ensuite, ajoutez le code suivant à NettutsTest.php:

objet = new Nettuts;  fonction protégée tearDown () ?>

À ce stade, le fichier de test est simplement un squelette et, comme vous pouvez le voir dans l'image ci-dessus, les tests réussissent..


Étape 4: Créez le premier script watchr

Maintenant, nous devons créer un fichier Ruby dans le dossier de notre projet. appelons ça autotest_watchr.rb. Ensuite, ajoutez le code suivant au fichier:

watch ("Classes /(.*). php") fait | match | run_test% Tests / # match [1] Test.php end

Les tests automatisés sont indépendants de l'IDE - un gros avantage dans mon livre.

Ce code utilise le regarder méthode pour regarder tous les .php fichiers dans notre projet Des classes dossier. Lorsqu'un .php modifications apportées aux fichiers, le système d'exploitation émet un événement et notre regarder la méthode sera déclenchée. Le nom du .php fichier est renvoyé (moins l'extension) dans la position d'un tableau de correspondance 1. Comme pour toute expression régulière, les parenthèses sont utilisées pour spécifier une variable de correspondance. Dans ce code, nous les utilisons dans la condition de correspondance pour extraire le nom du fichier. Ensuite, nous appelons le run_test méthode avec le chemin du nom du fichier de test composé.

Nous devrions également regarder nos fichiers de test; alors, ajoutez le code suivant au fichier Ruby:

watch ("Tests /.* Test.php") fait | match | run_test match [0] end

Notez que le rencontre tableau contient le nom de fichier complet à la position 0, et nous passons directement à la run_test méthode.


Étape 5: Faire en sorte que le script exécute les tests

Le script Ruby est configuré pour regarder notre .php fichiers, et maintenant nous devons mettre en œuvre la run_test méthode. Dans notre cas, nous voulons exécuter PHPUnit pour le fichier spécifique.

def run_test (fichier) sauf si File.exist? (fichier) met "# fichier n'existe pas", retour retour met "En cours d'exécution # fichier" resultat '' phpunit # fichier 'met le résultat final

Nous nous assurons d’abord que le fichier existe, et le renvoyons simplement s’il n’existe pas. Ensuite, nous lançons le test avec PHPUnit et envoyons le résultat à la console. Lançons notre script watchr. Ouvrez votre console, accédez au répertoire de votre projet, puis exécutez:

watchr ./autotest_watchr.rb

Les utilisateurs Windows doivent omettre "./" de la commande ci-dessus..

Maintenant, modifiez l'un des .php fichiers (ajoutez juste une ligne vide à la fin du fichier), enregistrez-le et observez le résultat dans la console. Vous devriez voir quelque chose de similaire à ce qui est montré ci-dessous:

Exécution de Tests / NettutsTest.php PHPUnit 3.6.0 de Sebastian Bergmann. F Temps: 0 secondes, Mémoire: 3,75 Mo Il y a eu 1 échec: 1) Avertissement Aucun test trouvé dans la classe "NettutsTest". / usr / bin / phpunit: 46 ECHECS! Tests: 1, Assertions: 0, Échecs: 1.

Oui, nous n'avons pas encore de test à exécuter; alors mettons dans un test factice. Ajoutez le code suivant au fichier test PHP:

fonction testDummyPassingTest () $ this-> assertTrue (true); 

Exécutez le script Ruby à nouveau et vous devriez voir:

Exécution des tests / NettutsTest.php PHPUnit 3.6.0 de Sebastian Bergmann… Durée: 0 secondes, Mémoire: 3,75 Mo OK (1 test, 1 assertion)

Étape 6: Analyser la sortie du test

Avertissons l'utilisateur, via le mécanisme de notification du système, des résultats du test. Nous allons modifier le run_tests méthode pour déclencher une méthode, appelée notifier. Ci-dessous la modification run_tests:

def run_tests (fichier) sauf si File.exist? (fichier) met "# fichier n'existe pas", retour retour met "En cours d'exécution # fichier" result = 'phpunit # fichier' met le résultat si result.match (/ OK /) notifier "# fichier", "Tests réussis", "success.png", fin 2000

Le nom du fichier image, success.png, pointe sur l'image que vous souhaitez afficher dans la zone de notification. Cette image n'est pas fournie dans ce tutoriel. vous devrez donc trouver le vôtre. Maintenant, écrivons le notifier méthode:

def notifie le titre, msg, img, show_time images_dir = "~ / .autotest / images" system "notifie-envoie '# titre" # msg' -i # images_dir / # img -t #  show_time "end

Utilisateurs Mac OSX et Windows: remplacez le notifier-envoyer commande avec l'alternative Growl appropriée. Modifiez quelque chose dans votre test ou dans le fichier de code afin que le test soit toujours réussi. Enregistrez le fichier PHP modifié et regardez la magie opérer. Ci-dessous une image du résultat sur mon système:

Ensuite, nous devons attraper les échecs. Le code suivant ajoute quelques lignes à run_tests:

def run_tests (fichier) sauf si File.exist? (fichier) met "# fichier n'existe pas", retour retour met "En cours d'exécution # fichier" result = 'phpunit # fichier' met le résultat si result.match (/ OK /) notifier "# fichier", "Tests réussis", "success.png", 2000 elsif result.match (/ FAILURES \! /) Fichier notify_failed, fin du résultat

Aussi, ajoutons le notify_failed méthode pour le fichier:

def notify_failed cmd, result failure_examples = result.scan (/ échec: \ n \ n (. *) \ n /) notifier "# cmd", échouant_examples [0], "échec.png", fin 6000

Modifiez l'un de vos fichiers PHP pour que le test échoue. enregistrer le fichier modifié. Observez le message de notification. Il contient le nom du premier test ayant échoué. Ce nom est sélectionné par l'expression régulière dans la méthode notify_failed, qui analyse la sortie de PHPUnit.


Étape 7: Effacez la console avant chaque test.

Ajoutez la méthode suivante à votre script Ruby et assurez-vous de l’appeler de la manière suivante: run_test méthode. Le code devrait fonctionner sous Linux et Mac OSX, mais vous devrez peut-être faire des recherches pour Windows..

def clear_console met "\ e [H \ e [2J" # extrémité de la console claire

Conclusion

Chaque fois que vous programmez en utilisant TDD, tout outil qui vous aide à obtenir des commentaires plus rapidement est un atout précieux. Mes collègues utilisent des scripts similaires avec watchr ou des alternatives (certains sont écrits autour fs_event sur MacOS). Inutile de dire que nous sommes gâtés maintenant et que nous ne pouvons imaginer développer quoi que ce soit sans l'exécution automatique de tests..

Les tests automatisés sont indépendants de l'IDE - un gros avantage dans mon livre. Trop d'EDI vous obligent à utiliser un framework de test spécifique et ne me lancez pas dans les tests à distance. Je préfère utiliser des scripts comme celui-ci tous les jours et je les recommande certainement à tout développeur de logiciel agile..