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.
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
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.
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..
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.
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)
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.
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
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..