Jérôme Cutrona

Version statique de l'intranet de Jérôme Cutrona - Rejoindre la version dynamique 🔒

Les exemples et corrections sont potentiellement non fonctionnels.

B.U.T. Informatique - IUT de Reims - Université de Reims

Structure HTML, CSS et tests d'acceptation

Navigation

Objectifs de la séance

  • Élaborer des conceptions simples
  • Concevoir une interface utilisateur
  • Développer une application Web
  • Faire des essais et évaluer leurs résultats en regard des spécifications
  • Mettre en place les outils de gestion de projet
  • Être sensibilisé à la production de tests unitaires

Introduction

L'accès aux données est maintenant séparé de la logique et de la présentation de l'application qui sont réalisées en PHP objet. La validité des entités d'abstraction d'accès aux données est vérifiée par des tests qui peuvent être exécutés à tout moment.

L'interface utilisateur fournie par l'application est sommaire et demande donc un effort de structuration et de mise en forme. La validité des classes et programmes sera contrôlée par de nouveaux tests automatisés.

Versionnage du projet

Ce sujet est une partie du sujet principal. Vous poursuivrez avec le même dépôt Git et la même méthodologie.

Spécialisation de la classe WebPage pour l'application

La classe « WebPage » propose des fonctionnalités utiles. Elle n'est cependant pas pratique pour la structuration d'un site Web complet, dans la mesure où chaque programme doit « configurer » à l'identique les feuilles de styles ou la structure HTML propre au site. « WebPage » reste néanmoins intéressante puisqu'il suffit de la dériver en une classe spécifique répondant aux besoins de l'application.

Maquette de l'application

L'application sera basée sur une structure imposée qui permettra de mettre en place des tests automatisés qui valideront vos productions.

La maquette générale est la suivante : Maquette de l'application

Classe AppWebPage

La classe « AppWebPage » est dérivée de « WebPage » pour répondre aux besoins de l'application. Son diagramme de classe est donné ci-après. Diagramme de la classe AppWebPage

Travail à réaliser
  1. À l'aide de PhpStorm, créez la classe « AppWebPage »
  2. Redéfinissez le constructeur de « AppWebPage » :
    1. appelez le constructeur de la classe parente
    2. ajoutez la feuille de style « /css/style.css »
  3. Redéfinissez la méthode « toHtml() » qui produira une structure HTML complète, conforme à la maquette de l'application
    Remarque importante

    Pour faciliter la création du contenu et homogénéiser les diverses productions, le titre « h1 » prendra la valeur du titre « title » de la page Web.

  4. Modifiez le programme « index.php » pour qu'il utilise la nouvelle classe « AppWebPage »

Mise en forme de la liste des artistes

La maquette de la liste des artistes est la suivante : Maquette de la page d'accueil de l'application (liste des artistes)

Travail à réaliser
  1. Créez la feuille de style « css/style.css »
  2. Modifiez « index.php » pour le rendre conforme à la maquette
  3. Définissez le style, en utilisant le modèle « flexbox », pour obtenir un rendu agréable et fonctionnel en accord avec la maquette

Mise en forme de la liste des albums d'un artiste

La maquette de la liste des albums d'un artiste est la suivante : Maquette de la page des albums d'un artiste

Travail à réaliser
  1. Utilisez « AppWebPage » dans « artist.php »
  2. Modifiez « artist.php » pour le rendre conforme à la maquette
  3. Définissez le style, en utilisant le modèle « flexbox », pour obtenir un rendu agréable et fonctionnel en accord avec la maquette

Mise en place de tests automatisés

Codeception propose des tests d'acceptation qui permettent de valider le fonctionnement de l'application en production, ou en quasi-production en lançant un serveur Web local.

Principe des tests d'acceptation

Les tests d'acceptation s'attachent à interroger un serveur Web à l'aide de PHP et à vérifier la réponse HTTP : code de réponse HTTP, présence d'entêtes, nature de la charge utile, structure du DOM si la charge utile contient du texte HTML, … Codeception propose de lancer automatiquement un serveur web avant de déclencher les tests d'acceptation. Il y a donc deux environnements PHP différents, celui qui exécute Codeception et celui qui propulse le serveur Web. Pour que ce fonctionnement corresponde aux choix faits pour ce projet, le serveur Web devra être lancé en environnement de test pour se connecter à la base de données de test (variable d'environnement « MYPDO_ENV »).

Le principe général est résumé dans le schéma suivant : Principe de lancement du serveur web par Codeception

Création d'une nouvelle suite de tests « Browse »

Les tests d'acceptation seront regroupés dans une suite « Browse ».

Travail à réaliser
  1. Lancez la commande de création d'une nouvelle suite de tests « Browse » :
    php vendor/bin/codecept generate:suite Browse
  2. Observez l'apparition du fichier « Browse.suite.yml » dans le répertoire « tests »
  3. Observez l'apparition du fichier « Browse.php » dans le répertoire « tests/_support/Helper »

Configuration, démarrage et extinction du serveur Web local de test

Les tests d'acceptation interrogent un serveur Web. Pour que les tests soient automatiques, ils doivent eux-mêmes lancer un serveur Web local dédié. La démarche va être un peu plus complexe qu'elle ne devrait, car l'extension en charge du démarrage et de l'extinction du serveur Web n'arrête pas toujours le serveur Web après les tests sur Linux. Cela produit des comportements incohérents vis-à-vis de certaines modifications. Une solution de contournement existe heureusement.

Travail à réaliser
  1. Placez le script shell « run-test-server.sh » (télécharger) dans le répertoire « bin » du projet
    Information

    Ce serveur Web local sera différent de celui que vous utilisez pour consulter le résultat de vos programmes dans le navigateur Web. Il écoute sur le port « 8080 », différent du port « 8000 » utilisé par le serveur Web local pour ne pas entrer en conflit avec lui.

    Si vous observez le script, vous constaterez qu'il reprend la solution de contournement au problème de fermeture du serveur après les tests.

    La variable d'environnement MYPDO_ENV=test va amener « MyPdo » à chercher la configuration dans le fichier « .mypdo.test.ini ».

  2. Rendez le script exécutable :
    setfacl -m u::rwx bin/run-test-server.sh
    Information

    « setfacl » est une commande Linux, n'essayez pas si vous êtes sur Windows.

  3. Placez le fichier de configuration de la base de données en environnement de test « .mypdo.test.ini » (télécharger) à la racine du projet
    Remarque importante

    Le fichier à télécharger doit s'appeler « .mypdo.test.ini », même si votre navigateur a décidé de supprimer le « . » initial. Renommez le fichier si nécessaire.

  4. Vérifiez qu'il se lance correctement :
    bin/run-test-server.sh
    Information

    Si vous êtes sur Windows, utilisez « run-test-server.bat » fourni un peu plus loin.

  5. Interrogez le serveur Web de test « http://localhost:8080/ » et vérifiez sa réponse
  6. Placez le script batch « run-test-server.bat » (télécharger) dans le répertoire « bin » du projet
  7. Quand vous serez sur votre ordinateur personnel, vous pourrez lancer le serveur Web local de test grâce au script batch « bin\run-test-server.bat »

Configuration de la suite de tests « Browse »

Vous allez configurer la suite de tests « Browse » pour qu'elle active les modules Codeception utiles et qu'elle lance automatiquement le serveur Web de test.

Travail à réaliser
  1. Éditez le fichier « Browse.suite.yml » pour activer les modules « Asserts » et « PhpBrowser » :
    modules:
        enabled:
            - \Tests\Helper\Browse
            - Asserts
            - PhpBrowser:
                  url: http://localhost:8080
    Information

    Le module « PhpBrowser » utilise PHP comme navigateur Web pour interroger et contrôler le fonctionnement de l'application. le paramètre de configuration « url » précise l'URL du serveur qui sera interrogé. Le port choisi est ici « 8080 », différent du port « 8000 » utilisé par le serveur Web local pour ne pas entrer en conflit avec lui.

  2. Toujours dans « Browse.suite.yml », activez l'extension « RunProcess » qui permet de démarrer (et normalement d'arrêter…) des processus :
    extensions:
        enabled:
            - Codeception\Extension\RunProcess:
                # Run server on Windows platform (won't start on Linux)
                0: bin\\run-test-server.bat
                # Run server on Linux platform (won't start on Windows)
                1: bin/run-test-server.sh
                sleep: 1 # wait for php local web server to start
    Information

    L'extension « RunProcess » va permettre de lancer un serveur Web local avant les tests.

    Les scripts Linux et Windows cohabitent facilement puisque le script Windows échoue sur Linux et inversement. Ainsi, seul le script Linux est lancé sur Linux et il en va de même pour Windows.

Tests de la liste des artistes

La suite « Browse » a pour objectif de tester tous vos programmes. Commençons par « index.php ».

Travail à réaliser
  1. Placez le fichier de tests d'acceptation du programme « index.php » (télécharger) dans le répertoire des « Cests » de la suite « Browse »
  2. Lancez les tests de la suite « Browse » :
    php vendor/bin/codecept run Browse
  3. Corrigez vos classes / programmes si nécessaire

Fonctionnement de Codeception en cas d'échec d'un « Cest » d'acceptation

Les tests d'acceptation vérifient le comportement du site Web en production. Aussi, la plupart des contrôles portent sur du contenu HTML et il est difficile de cerner le problème à la seule lecture d'une assertion invalide. Il est souvent indispensable de disposer de la charge utile reçue par le client. En cas d'échec d'un « Cest » d'acceptation, Codeception enregistre la ressource reçue (la charge utile) dans le répertoire « tests/_output/ » sous le nom de fichier générique « Namespace.Complet.Du.Cest.nomDeLaMéthodeDeTest.fail.html ». Vous allez volontairement faire échouer le dernier « Cest » mis en place pour le constater.

Travail à réaliser
  1. Ouvrez le fichier « tests/Browse/IndexCest.php »
  2. Afin de la faire échouer, modifiez l'assertion
    $I->seeResponseCodeIs(200);
    en
    $I->seeResponseCodeIs(201);
  3. Observez le contenu du répertoire « tests/_output »
  4. Consultez le contenu du fichier « Tests.Browse.IndexCest.listAllArtists.fail.html » et constatez qu'il correspond à la page d'accueil de votre application Web
  5. Rétablissez le code HTTP original du « Cest »
  6. Relancez les tests et constatez que le fichier « tests/_output/Tests.Browse.IndexCest.listAllArtists.fail.html » est toujours présent
  7. Afin de nettoyer ces fichiers avant de lancer de nouveaux tests, ajoutez la commande
    php vendor/bin/codecept clean
    au début du script Composer « test:codecept »

Ajout de scripts Composer

La nouvelle suite de tests va vous conduire à ajouter un nouveau script Composer permettant de la déclencher indépendamment des autres tests.

Travail à réaliser
  1. Ajoutez un nouveau script Composer « test:browse » qui nettoie les fichiers de « tests/_output » avant de tester la suite « Browse »
  2. Lancez l'ensemble de vos tests avec la commande :
    composer test
  3. Vérifiez qu'ils passent tous
  4. Corrigez vos classes / programmes si nécessaire
  5. Mettez à jour la documentation du projet dans « README.md »

Tests de la liste des albums d'un artiste

La suite « Browse » a pour objectif de tester tous vos programmes. Après « index.php », poursuivons avec « artist.php ».

Travail à réaliser
  1. Placez le fichier de tests d'acceptation du programme « artist.php » (télécharger) dans le répertoire des « Cests » de la suite « Browse »
  2. Lancez les tests de la suite « Browse » :
    composer test:browse
  3. Corrigez vos classes / programmes si nécessaire

Pochette d'un album

Les programmes « index.php » et « artist.php » produisent de façon classique un contenu de type texte contenant du HTML. La base de données contient une table « cover » possédant une colonne « jpeg » de type « mediumblob ». Les données de ces enregistrements sont l'exact équivalent du contenu d'un fichier JPEG de pochette d'album. Vous allez développer une classe « Cover » pour l'abstraction de l'accès aux données de la table « cover » et écrire un programme PHP dont la réponse HTTP portera une charge utile de type image JPEG.

Entité Cover

Comme précédemment, une ligne de la table « cover », composée des champs « id » et « jpeg » sera représentée par une instance de l'entité « Cover » dont les propriétés sont « id » et « jpeg ».

Le diagramme de la classe « Cover » est donné ci-après. Diagramme de la classe Cover

Travail à réaliser

Créez la classe « Cover » en suivant la même démarche que pour la classe « Artist »

Tests de l'entité Cover

Les tests doivent vérifier le fonctionnement de la nouvelle classe « Cover ». Puisque la classe comporte un attribut qui contient une longue chaîne de caractères représentant le contenu d'un fichier JPEG, c'est à partir d'un fichier JPEG que la comparaison sera faite. Vous devrez donc le télécharger.

Travail à réaliser
  1. Créez le répertoire « tests/_data/cover »
  2. Placez le fichier JPEG « cover411.jpeg » de la pochette « 411 » dans le répertoire « tests/_data/cover »
  3. Placez le fichier de tests « Crud » de la classe « Cover » (télécharger) dans « tests/Crud »
  4. Lancez les tests « Crud »
  5. Vérifiez que les tests passent et corrigez votre code si besoin
  6. Lancez tous les tests
  7. Vérifiez que les tests passent et corrigez votre code si besoin

Programme « cover.php » de production d'une image de pochette

La classe « Cover » apporte la couche d'abstraction d'accès aux données de la table « cover ». Il faut à présent écrire un programme qui récupère une pochette donnée et place le contenu JPEG dans la charge utile de la réponse HTTP. Ce programme nécessite un paramètre HTTP GET pour désigner l'identifiant de la pochette d'intérêt. Ce paramètre et le test de sa présence vont nous conduire à créer une classe « ParameterException » pour gérer l'absence ou l'incohérence des paramètres de requête.

Travail à réaliser
  1. Créez, à l'aide de PhpStorm, la classe « ParameterException » : Diagramme de la classe ParameterException
  2. Créez le programme « cover.php » dont la structure de base sera :
  3. Testez la présence et la forme numérique du paramètre GET « coverId » et levez une « ParameterException » en cas de non conformité
    Information

    Le principe général du programme principal dont le code est encadré par « try » associé à des instructions « throw » en cas de détection d'erreur devrait être systématique pour que les types d'erreurs soient gérés, ici par des codes de réponse HTTP spécifiques.

    Vous pouvez, si vous êtes en avance dans le sujet de TP, refactoriser « artist.php » selon ce modèle.

  4. Utilisez le paramètre GET « coverId » pour créer une instance de « Cover » à partir des données de la base de données
  5. Modifiez le type mime de la réponse HTTP en « image/jpeg »
  6. Remplissez la charge utile de la réponse HTTP avec le contenu JPEG de la pochette
  7. Vérifiez que votre programme fonctionne et que la pochette « 411 » est bien la suivante :Pochette 411

Tests de la pochette d'album

Vous allez compléter la suite « Browse » pour lui ajouter les tests de « cover.php ».

Travail à réaliser
  1. Placez le fichier de tests d'acceptation du programme « cover.php » (télécharger) dans le répertoire des « Cests » de la suite « Browse »
  2. Ajoutez la méthode « seeResponseContentIs » à la classe d'assistant « Tests\Helper\Browse »
    public function seeResponseContentIs(string $expected, string $message='Response content does not match')
    {
        $this->assertEquals($expected, $this->getModule('PhpBrowser')->_getResponseContent(), $message);
    }
    Information

    Ajouter la méthode « seeResponseContentIs » à l'assistant « Tests\Helper\Browse » permet d'y accéder dans la classe « Tests\BrowseTester » qui effectue les assertions des « Cests » de la suite « Browse ».

    Cette méthode facilite le contrôle du contenu de la charge utile de la réponse HTTP et rend les tests plus lisibles.

  3. Lancez les tests de la suite « Browse » :
    composer test:browse
  4. Corrigez votre classe / programme si nécessaire

Utilisation des pochettes d'albums

Le programme « cover.php » fournit des pochettes que vous allez utiliser dans la liste des albums d'un artiste, conformément à la maquette suivante : Maquette de l'application

Travail à réaliser
  1. Modifiez « artist.php » pour insérer l'image de la pochette
  2. Modifiez le style CSS pour obtenir un rendu proche de la maquette (vous pouvez ajouter des structures HTML si nécessaire)

Bilan et suite

L'application comporte maintenant la consultation de la liste des artistes et de leurs albums avec une interface utilisateur. L'objectif est de permettre la création, l'édition et la suppression de données. Vous réaliserez ces opérations sur les artistes.

Ces nouvelles fonctionnalités seront mises en place dans la suite de ce sujet.