Advertisement
  1. Code
  2. Web Development

Tests fonctionnels de base avec le robot d'indexation Symfony 2

by
Difficulty:BeginnerLength:LongLanguages:

French (Français) translation by Alexey Pyltsyn (you can also view the original English article)

Tester vos applications Web est l’une des meilleures choses que vous puissiez faire pour assurer sa santé, sa sécurité et sa sûreté, à la fois pour l’application et pour les visiteurs de votre application. Symfony 2 offre une suite complète de tests d’intégration que vous pouvez utiliser pour vous assurer que vos applications fonctionnent comme vous le souhaitez. Aujourd'hui, nous verrons comment utiliser Symfony 2 et PHPUnit, le framework de test utilisé, pour écrire des tests fonctionnels de base à l'aide du Crawler.

Installation

Avant de pouvoir commencer tout type de test, configurons notre projet en téléchargeant le framework Symfony 2, configurons-le puis téléchargeons PHPUnit.

Installation de Symfony 2

Le meilleur moyen de télécharger Symfony 2 est d'utiliser Composer. Si vous ne savez pas encore ce qu'est Composer, assurez-vous de commander quelques-uns des articles et des cours impressionnants de Tuts+, ils vous mettront rapidement au courant.

Nous voudrons d’abord ouvrir notre interface de terminal ou de ligne de commande afin d’émettre quelques commandes composer. Une fois dans votre terminal, changez de répertoire dans la racine Web de votre développement local. Pour moi, sous OS X, ce sera mon répertoire ~/Sites:

Une fois dans le répertoire approprié, nous pouvons maintenant utiliser Composer pour créer un nouveau projet Symfony 2 qui téléchargera et installera le framework ainsi que toutes ses dépendances.

Cette commande indique à composer de créer un nouveau projet à l'aide de la structure Symfony 2 dans un nouveau répertoire nommé crawling/, puis nous spécifierons également la version exacte à télécharger, version ~2.5. Si vous téléchargez le framework pour la première fois, cela peut prendre un certain temps, car de nombreuses bibliothèques sont téléchargées pour tous les fournisseurs. Donc, vous voudrez peut-être faire une pause et revenir dans quelques minutes.

Une fois le téléchargement terminé, votre terminal devrait maintenant afficher un assistant interactif qui vous aidera à configurer la configuration. C'est très explicite, entrez simplement dans vos propres informations d'identification ou prenez les valeurs par défaut comme je l'ai fait:

Configuring Crawler

Une fois que vous avez entré vos informations de configuration, Symfony 2 est téléchargé, installé et prêt à être utilisé. Maintenant nous avons juste besoin de PHPUnit pour pouvoir tester notre code.

Installer PHPUnit

Pour télécharger PHPUnit, nous pouvons utiliser une commande wget dans notre terminal pour récupérer le fichier .phar ou tout simplement le télécharger depuis leur site web, à vous de choisir:

Avec le fichier .phar téléchargé, nous devons maintenant ajuster ses autorisations et le déplacer vers un emplacement où notre terminal ou ligne de commande et PHP y auront accès. Sur ma machine sous OS X, j'ai déplacé cela dans mon répertoire /usr/local/bin. J'ai également renommé le fichier en phpunit, je n'ai donc pas à m'inquiéter de l'extension lorsque j'essaye d'exécuter mes tests, ce qui m'a fait gagner un peu de temps

Nous devrions maintenant être en mesure de vérifier que PHPUnit a été installé et est accessible via le terminal en exécutant la commande phpunit. Vous devriez voir quelque chose comme ça:

Running PHPUnit

Création du Crawling Bundle

Nous avons maintenant besoin d’un paquet pour contenir notre code d’application et de test. Créons-en un à l'aide de la console Symfony 2, depuis notre terminal:

Ici, nous modifions d’abord les répertoires dans notre projet crawling, puis nous utilisons la console pour générer un nouveau paquet. Nous spécifions également le nom du fournisseur et du fournisseur de cet ensemble, séparés par une barre oblique (/). Enfin, nous lui disons d'utiliser YAML comme format de notre configuration. Maintenant, vous pouvez utiliser le format de votre choix si vous ne voulez pas utiliser YAML et vous pouvez également nommer votre bundle comme vous le souhaitez, à condition de lui attribuer un nom de fournisseur et de terminer avec le suffixe Bundle.

Après avoir exécuté la commande ci-dessus, un nouvel assistant vous aide à terminer l’installation du bundle. Je viens d'appuyer sur Entrée pour que chaque invite prenne les valeurs par défaut, ce qui simplifie et simplifie le processus et lisse les problèmes de chemin en plaçant vos fichiers dans des emplacements personnalisés. Voici une capture d'écran de mon assistant bundle:

Creating the Crawling Bundle

Comment exécuter vos tests

Ok, nous avons Symfony 2, PHPUnit et notre bundle; Je pense que nous sommes prêts à apprendre comment exécuter nos tests PHPUnit aux côtés de Symfony. En fait, il est très facile de changer de répertoire dans votre projet crawling et d'émettre la commande phpunit -c app / pour exécuter tous les tests de votre application. Vous devriez obtenir le résultat suivant dans votre terminal:

Running PHPUnit Tests

Lorsque nous avons généré notre bundle, il a également généré un petit exemple de code pour nous. Le test que vous voyez exécuté ci-dessus fait partie de cet exemple de code. Vous pouvez voir que nous avons une barre verte, nous informant que nos tests ont réussi. Maintenant, juste au-dessus du Time: 1.97 seconds, nous avons également un seul point nous montrant qu'un seul test a été exécuté. La barre verte indique notre statut OK ainsi que le nombre de tests et d’affirmations exécutés.

Donc, en exécutant uniquement cette commande, nous savons que notre application Symfony 2 est installée, fonctionne correctement et testée!

Création d'un contrôleur, d'un modèle et d'un itinéraire

Nous avons maintenant besoin de code d'application réel que nous pouvons tester.

Le controlle

Commençons par créer un nouveau fichier de classe de contrôleur et une nouvelle action de contrôleur. Dans votre projet crawling, sous src/Crawling/FtestingBundle/Controller, créez un nouveau fichier nommé CrawlingController.php et insérez-y les éléments suivants:

Dans ce fichier, nous définissons simplement notre structure de classe de contrôleur de base, en lui donnant l’espace de nom approprié et en incluant la classe parent Controller nécessaire.

Les actions du contrôleur

Dans notre classe, définissons maintenant nos deux actions simples de contrôleur. Ils vont juste afficher deux pages différentes: une page home et une page other:

Les modèles

Nous devons maintenant créer les fichiers de modèle pour ces actions de contrôleur. Sous src/Crawling/Ftesting /Resources/views, créez un nouveau répertoire nommé Crawling pour contenir les fichiers modèles de notre CrawlingController. A l'intérieur, créez d'abord le fichier home.html.twig, avec le code HTML suivant:

Cela contient seulement du HTML de base et un lien vers la page other.

Maintenant, allez aussi de l'avant et créez le fichier other.html.twig, avec ce HTML à l'intérieur:

Les routes

Enfin, pour notre code d’application, définissons les itinéraires pour ces deux pages. Ouvrez src/Crawling/FtestingBundle/Resources/config/routing.yml et entrez les deux routes suivantes, sous la route générée par défaut fournie avec notre fichier route:

Ici, je définis deux routes, une pour chacune de nos actions de contrôleur. Nous commençons par le nom des routes, que nous pouvons utiliser dans les liens, etc., puis nous spécifions le chemin de la route, qui correspond à son URI, pour accéder à la page dans le navigateur, puis nous lui indiquons le contrôleur à mapper.

Maintenant, souvenez-vous avec YAML que vous ne voulez utiliser aucun onglet, utilisez toujours des espaces ou vos itinéraires ne fonctionneront pas!

Ainsi, avec ces deux pages seulement, même si elles sont basiques et statiques, nous pouvons toujours en apprendre beaucoup sur l’utilisation du robot Crawler de Symfony 2 pour tester le fonctionnement complet d’un contrôleur, d’un modèle, ensemble intégré (un test fonctionnel), ainsi que de nous assurer que nos pages affichent la structure HTML correcte.

Écrire un test fonctionnel

Nous sommes maintenant prêts à commencer à apprendre à écrire des tests fonctionnels à l'aide du Crawler. Tout d'abord, nous allons créer un fichier de test.

Créer notre fichier de test

Tous vos tests dans Symfony 2, les tests PHPUnit sont stockés dans le répertoire Tests/Controller de votre bundle. Chaque contrôleur doit avoir son propre fichier de test, nommé d'après la classe de contrôleurs qu'il teste. Puisque nous avons un CrawlingController, nous devrons créer un fichier CrawlingControllerTest.php dans src/Crawling/FtestingBundle/Tests/Controller, avec la définition de classe suivante:

Ici, nous faisons un espace de noms pour notre test, puis nous l'incluons dans la classe parent WebTestCase, ce qui nous donne notre fonctionnalité de test PHPUnit. Notre classe de test porte exactement le même nom que notre nom de fichier et nous étendons la classe parent WebTestCase afin d'hériter de ses fonctionnalités.

Créons maintenant une méthode de test pour conserver nos assertions que nous allons faire pour tester notre page d'accueil. Dans notre classe de test, créons la méthode suivante:

Chaque fois que vous créez une méthode de test à l'aide de PHPUnit dans Symfony 2, nous préfixons toujours notre nom de méthode par le mot test. Vous pouvez nommer le nom de la méthode à votre guise, bien que la convention préconise de lui attribuer le nom de l'action du contrôleur que vous testez. Donc ici, j'ai nommé mien testHome pour suivre cette convention.

Le client

Désormais, dans notre méthode de test, nous avons besoin d’un moyen de simuler un navigateur afin de pouvoir envoyer une demande HTTP à l’une de nos routes et vérifier que tout fonctionne comme prévu. Pour ce faire, nous allons créer un objet client en appelant une méthode statique createClient():

Nous pouvons maintenant utiliser cet objet $client pour effectuer cette requête HTTP et commencer à utiliser le Crawler.

Le Crawler

Le Crawler est au cœur des tests fonctionnels dans Symfony 2 et nous permet de parcourir et de collecter des informations sur la page de notre application Web, ainsi que d'effectuer des actions telles que cliquer sur des liens ou soumettre des formulaires. Définissons notre objet Crawler en faisant une requête HTTP en utilisant le client. Ajoutez ce qui suit sous votre objet $client, dans votre méthode testHome:

Cela renverra un objet Crawler pour tester notre page d'accueil. Cela nous permettra à la fois de savoir que notre page existe, qu'elle a le format HTML et le formatage correct et que le contrôleur, le modèle et la route fonctionnent tous comme une unité.

Tester le titre et le paragraphe

Pour commencer nos tests fonctionnels, nous voulons affirmer que notre page d'accueil contient l'en-tête approprié avec le contenu approprié à l'intérieur. Pour cela, nous utilisons notre objet $crawler et ses différentes méthodes. Ces méthodes nous renverront toutes un autre objet Crawler contenant la réponse réelle de la page testée. Nous testerons ensuite cette réponse pour nous assurer que tout se passe comme prévu.

Ajoutez le code suivant à votre méthode testHome:

Nous commençons par appeler la méthode filter() de notre objet $crawler pour filtrer la réponse de la page et sélectionner tous les éléments h1. Nous pouvons ensuite chaîner sur d'autres appels de méthode pour filtrer notre sélection encore plus bas. J'utilise ici la méthode eq() qui accepte la position d'index de l'élément h1 que nous voulons sélectionner. J'ai choisi de sélectionner l'index 0, le premier en-tête. Enfin, j'enchaîne l'appel de la méthode text qui renvoie le contenu textuel de cet élément HTML et stocke le résultat dans une variable $heading.

Après avoir filtré l'élément h1 que nous voulons tester, nous devons maintenant affirmer que nous avons le bon élément. Pour ce faire, nous utilisons la méthode assertEquals() qui accepte comme premier argument la valeur que nous attendons de l'en-tête, et comme second argument, la valeur réelle de la réponse renvoyée, qui est notre $header. Ce faisant, nous saurons que nous sommes sur la bonne page, si le contenu correspond à ce que nous attendons.

Exécution du test de cap

Donc, avec seulement quatre lignes simples de code PHP, nous pourrons tester notre contrôleur domestique, notre modèle et notre route. Lançons notre test pour nous assurer qu'il réussit. Dans votre terminal, à partir de votre projet crawling Symfony, exécutez phpunit -c app /. Vous devriez voir ce qui suit:

Running the Heading Test

Nous avons maintenant deux tests et deux affirmations, qui passent toutes! Vous pouvez maintenant tester le paragraphe unique sous l'en-tête de la même manière, mais cette fois, nous utiliserons la méthode first(), comme ceci:

Si vous réexécutez vos tests, nous avons maintenant trois assertions de réussite. Bon travail!

Test en cliquant sur un lien

Essayons maintenant de tester le processus consistant à cliquer sur notre lien vers cette autre page. Cela devrait nous amener à l'autre page et y afficher le contenu approprié. Insérez le code suivant dans votre méthode testHome:

Nous commençons par filtrer notre page d'accueil par des balises a. Nous utilisons la méthode de filtrage :contains() pour filtrer les balises a en fonction de leur contenu afin de nous assurer de sélectionner le lien correct. Nous enchaînons ensuite la méthode first() pour saisir la première et appelons la méthode link() pour créer un objet link afin que nous puissions simuler un clic dessus en utilisant notre $client.

Maintenant que nous avons un objet $link, nous devons cliquer dessus, en appelant la méthode click() de l'objet $client, en lui passant l'objet $link et en stockant la réponse dans le $otherPage. Comme pour tout autre objet Crawler, la méthode click renvoie la réponse. Très facile!

Et enfin, nous affirmons simplement que notre texte de titre $otherPage est égal à ce que nous nous attendons à utiliser avec la méthode assertEquals(). Si c'est le cas, nous savons que notre lien fonctionne!

Exécutez vos tests une dernière fois!

Exécutons maintenant nos tests une dernière fois pour nous assurer que notre lien fonctionne correctement et que nous sommes sur la bonne page après avoir cliqué dessus. Voici mes résultats de terminal:

Run Your Tests One Last Time

Nous avons deux tests et quatre assertions, qui passent tous. App complète!

Conclusion

Et c'est tout. Nous avons testé le bon fonctionnement de notre contrôleur, de ses actions, de nos modèles et de nos routes, et nous savons que le code HTML et le contenu de chaque élément s'affichent correctement sur la page, ainsi que notre lien, qui renvoie au bon emplacement. Travail bien fait.

Je vous encourage maintenant à essayer ce que vous avez appris en testant la other page, en ajoutant plus de HTML ou de liens vers celle-ci, et en général en vous faisant une idée de l'utilisation du Crawler pour vous assurer que votre page fonctionne correctement.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.