Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Black Friday: -25€ dès 75€ sur les livres en ligne, vidéos... avec le code BWEEK25. J'en profite !
  1. Livres et vidéos
  2. Laravel
  3. Tests automatisés
Extrait - Laravel Un framework efficace pour développer vos applications PHP
Extraits du livre
Laravel Un framework efficace pour développer vos applications PHP
2 avis
Revenir à la page d'achat du livre

Tests automatisés

Introduction

Tester une application web pour vérifier son bon fonctionnement peut se faire de diverses manières. La méthode la plus simple, qui sera suffisante dans de nombreux cas, consiste à lancer un navigateur, aller sur la page à tester et vérifier son comportement en regardant ce qui est affiché. Cette méthode ne permet cependant pas de garantir à elle seule la qualité d’un logiciel à moyen terme. Il faudra donc rapidement trouver autre chose.

Un processus de développement est fait d’itérations : on crée une fonctionnalité, puis on la modifie, puis on ajoute une deuxième fonctionnalité, puis on modifie à nouveau la première, puis on corrige une erreur sur la deuxième, etc. Rapidement, les fonctionnalités commencent à avoir des impacts les unes sur les autres, et modifier un comportement quelque part peut altérer un autre comportement ailleurs. C’est ce qu’on appelle communément les effets de bord.

Plus une application grossit, plus il est difficile de la tester manuellement de manière exhaustive. Théoriquement, à chaque nouvelle modification, il faudrait faire un nouveau test, mais également refaire tous les tests précédents, pour vérifier que tout fonctionne toujours, et qu’il n’y a pas eu d’effet de bord....

Tests unitaires

1. Introduction

Les tests unitaires permettent de vérifier une fonction ou un morceau de programme de manière atomique. Autrement dit, les tests unitaires assurent qu’une procédure se déroule bien comme prévu, peu importe son contexte.

Pour tester une fonction de manière unitaire, on écrira donc généralement une ou plusieurs fonctions de tests en miroir qui devront être le plus exhaustives possible. De la même manière, pour tester une classe, on créera un ensemble de tests unitaires qui couvrira l’ensemble des méthodes.

2. Créer un test unitaire

Un test unitaire vérifie le fonctionnement d’une portion de programme. Pour la suite de cette section, on va considérer que l’application contient une fonction euro, qui convertit un entier représentant un nombre de centimes en une chaîne de caractères avec deux chiffres après la virgule représentant des euros, telle que définie ci-dessous :

Fonction euro


function euro(int $cents)  
{  
    return number_format($cents / 100, 2, ',', ' ');  
}
 

On attend donc de cette fonction qu’elle ait le comportement suivant :

  • euro(100) doit retourner 1,00.

  • euro(15) doit retourner 0,15.

  • euro(2990) doit retourner 29,90.

Le comportement est connu par contrat. C’est-à-dire...

Base de données

Dans de nombreux cas, les tests sont exécutables de façon autonome et n’ont pas besoin de contexte. Il arrive cependant parfois qu’on ait besoin d’accéder à une base de données pour vérifier un comportement.

Dans un site e-commerce par exemple, on peut souhaiter vérifier le fonctionnement de la méthode Product::specialOffer() qui retourne la liste des produits en promotion présents en base de données.

Laravel fournit plusieurs outils pour tester des applications pilotées par une base de données.

Dans le contexte le plus strict des tests unitaires, on essaiera d’éviter au maximum la dépendance avec la base de données. Un test unitaire doit s’efforcer d’être autonome et atomique, il doit donc pouvoir s’exécuter sans avoir d’interactions en dehors de la fonction testée.

1. Configuration

Les tests ne doivent pas être dépendants de la configuration d’un poste de travail en particulier, pour être exécutables depuis le poste de n’importe quelle personne de l’équipe de développement, mais également sur une machine d’intégration continue (l’intégration continue sera étudiée rapidement en fin de chapitre). Il faut donc qu’ils aient une configuration propre. Cela évitera également de polluer la base de données d’un poste de travail avec des données de test.

Deux étapes sont nécessaires pour configurer une base de données de tests : modifier le fichier de configuration et mettre à jour le fichier phpunit.xml.

a. Modifier le fichier de configuration

La première étape consiste à ajouter une entrée dans le fichier config/database.php pour les tests, associée à la clé connections.

La configuration se fait exactement de la même manière que pour configurer la base de données de l’application. Il faut tout d’abord choisir un nom pour cette connexion, par exemple « testing », puis définir tous les paramètres de cette connexion.

Cela peut être un lien vers une base de données existante, qui devra donc être créée avec les bons identifiants sur chaque machine susceptible...

Tester des fonctionnalités

1. Introduction

Au-delà de traiter des fonctions une par une avec les tests unitaires, il est également possible de tester les fonctionnalités intégrées les unes avec les autres, pour vérifier le comportement d’un ensemble qui fait sens.

Souvent appelé test d’intégration, ce type de vérification valide le fonctionnement d’une partie de l’application sous la forme d’un scénario. Par exemple, on peut souhaiter vérifier qu’un utilisateur est créé en base de données quand la page users est appelée avec les bons paramètres.

Exemple de test d’une fonctionnalité


public function testCreateUser()  
{  
    $name = 'Émilie';  
   
    $this->post('users', ['name' => $name])  
         ->assertSuccessful();  
  
    // Comparaison entre le nom fourni en entrée  
    // et la dernière ligne insérée en base  
    $this->assertEquals(  
        $name,  
        User::latest()->first()->name  
    );  
}
 

Dans l’exemple ci-dessus, la page users est appelée en utilisant POST avec un nom passé en paramètre....

Laravel Dusk

1. Introduction

Tester le front-end d’une application web de manière automatisée est souvent une tâche difficile. Peu de frameworks fournissent des outils simples à utiliser pour y arriver. Laravel Dusk permet de tester une application dans des conditions réalistes, proches de l’expérience réelle des utilisateurs. Pour cela, Dusk utilise ChromeDriver, qui permet de piloter un navigateur Chrome sur le poste de travail, ou la machine de test. C’est-à-dire qu’un navigateur est réellement lancé et piloté par le code et qu’il suivra donc le scénario rédigé. Cela permet de réaliser en quelques secondes ce qui aurait pris des heures à une équipe de testeurs, pour un résultat identique, parfois meilleur.

Laravel Dusk met ainsi en quelque sorte à disposition un testeur fiable sur-vitaminé, qui navigue de page en page, remplit des champs, revient en arrière ou valide des formulaires.

Le code de pilotage est élégant, simple à rédiger, à relire et permet même de gérer la problématique du JavaScript chargé de manière asynchrone ou les SPA (Single Page Apps).

2. Installation

Pour commencer à utiliser Dusk, il faut d’abord installer la bibliothèque en question puis lancer son installation avec Artisan.

Installation de Dusk


composer require --dev laravel/dusk  
php artisan dusk:install
 

Pour vérifier que tout fonctionne, on peut ensuite lancer les tests grâce à la commande Artisan prévue à cet effet.

Lancement de Dusk


php artisan dusk
 

Laravel Dusk a créé par défaut lors de son installation un fichier tests/Browser/ExampleTest.php qui contient un simple test qui vérifie que le mot « Laravel » est bien affiché sur la page d’accueil. Cela sera le cas si vous venez d’installer Laravel, mais pas sur une application modifiée. Il est donc possible que le test échoue et qu’il faille le modifier. Dans tous les cas, Dusk aura lancé un navigateur Chrome et opéré une vérification.

3. Créer un test

a. Créer la classe

Lors de l’installation de Dusk, différents dossiers et fichiers ont été créés. Ainsi...

Simulation

Tester certaines parties d’une application qui font appel à des éléments extérieurs comme l’envoi d’un e-mail, la mise en file d’attente d’un traitement ou le stockage d’un fichier peut sembler difficilement réalisable. En effet, on ne souhaite pas réellement envoyer un e-mail sur une boîte externe lorsqu’on contrôle la création d’un compte dans un test fonctionnel. Et on ne souhaite pas réellement stocker des fichiers sur un serveur lors d’un upload quand on lance les tests unitaires.

Laravel fournit un système de « Mocking » (simulacre ou fantaisie en français selon les traductions) pour simuler ces fonctionnalités sans les exécuter réellement. Pour cela, il faut appeler une méthode nommée fake au début de la méthode de test qui nécessite de simuler certains aspects de l’application.

Utilisation de la méthode fake dans un test unitaire


<?php  
  
namespace Tests\Unit;  
  
use Tests\TestCase;  
  
class UserTest extends TestCase  
{  
  
    public function testCreateUser() {  
    {  
        // Aucun mail ne sera réellement envoyé à partir d'ici  
        Mail::fake();  
  ...

Automatiser le lancement des tests

Pour garantir le niveau de qualité et la non-régression de l’application, le lancement de l’intégralité des tests doit avoir lieu après chaque modification. Ainsi, avant chaque déploiement ou mise en production, on s’assure que toutes les vérifications unitaires, fonctionnelles ou à travers le navigateur, sont validées.

On pourrait lancer les tests manuellement, en appelant la commande Artisan ou PHPUnit correspondante avant de livrer. Cependant, cette approche pose plusieurs problèmes :

  • Il est possible d’oublier de lancer les tests.

  • Les tests étant longs à exécuter, cela peut temporairement paralyser le développeur ou la développeuse qui attend la fin de l’exécution avant de continuer.

  • Cette tâche est mécanique et fastidieuse : elle ne doit idéalement pas être confiée à un humain.

Il existe de nombreux outils auto-hébergés ou en ligne pour lancer les tests à chaque fois qu’un push est fait sur le dépôt GIT d’origine. Ce type d’outils exécute sur une machine dédiée à cet usage l’intégralité des tests à chaque modification et alerte l’équipe en cas d’échec des tests. De tels services permettent de rentrer dans un cycle...