- Accueil
- Programmation Web S2
- Index du sujet de TP
- Objectifs de la séance
- Introduction
- Versionnage du projet
- Couche d'abstraction d'accès aux données de la base de données
- Mise en place de tests automatisés
- Installation de
Codeception
parComposer
- Configuration générale de
Codeception
- Configuration de l'auto-chargement de développement
- Création d'une nouvelle suite de tests
- Configuration de la base de données de test
- Création d'un nouveau lot de tests dans la suite «
Crud
» - Première exécution des tests
- Ajout de scripts
Composer
- Installation de
- Utilisation de la couche d'abstraction d'accès aux données
- Couche d'abstraction d'accès aux données de la base de données, suite
- Refactorisation du programme «
artist.php
» - Bilan et suite
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 ¶
Le début de l'application est fonctionnel, dans un environnement de développement structuré. Les deux programmes mêlent les aspects de logique applicative, requêtage SQL
des données et IHM. La partie SQL
pourrait avantageusement être remplacée par l'utilisation d'objets effectuant les requêtes. Le bon fonctionnement des programmes ainsi que les cas d'erreurs ont été testés manuellement, à un instant donné du développement. Cette démarche est fastidieuse et éphémère. Une méthode rapide et durable est nécessaire.
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.
Couche d'abstraction d'accès aux données de la base de données ¶
Les programmes que vous avez réalisés seraient plus concis, plus faciles à lire, plus maintenables et plus simples à tester s'ils prenaient un peu de recul par rapport aux requêtes SQL
. Un modèle objet d'entités en charge de la récupération des données dans la base de données introduit un découpage logique des briques fonctionnelles de l'application. Les programmes utiliseront des entités et ces entités seront chargées d'effectuer les requêtes dans la base de données.
Configuration des modèles de fichiers PHP
dans PhpStorm
¶
La suite du projet va vous conduire à créer de nombreux fichiers PHP
pour des classes ou des programmes. Le typage strict doit être inséré en début de chaque fichier et peut naturellement être oublié.
Entité « Artist
»
¶
Jusqu'à présent, les résultats des requêtes de sélection dans la base de données sont exploités sous forme de tableaux associatifs (« PDOStatement::fetch()
» selon le mode « PDO::FETCH_ASSOC
»). Pour passer à un modèle objet, ces tableaux associatifs vont être remplacés par des instances de classes qui reflètent les tables correspondantes de la base de données. Ainsi, une ligne de la table « artist
», composée des champs « id
» et « name
», sera représentée par une instance de l'entité « Artist
» dont les propriétés sont « id
» et « name
». « PDOStatement
» permet de créer les instances résultant de l'appel de la méthode fetch()
si le mode « PDO::FETCH_CLASS
» est utilisé.
Information
L'utilisation de la méthode « PDOStatement::fetchObject(MaClasse::class
) » remplace avantageusement l'utilisation de « PDOStatement::fetch()
» précédée de « PDOStatement::setFetchMode(PDO::FETCH_CLASS, MaClasse::class
) ».
Le diagramme de la classe « Artist
» est donné ci-après.
Travail à réaliser
- Sélectionnez le répertoire «
src
» par un clic gauche - Ouvrez la boîte de dialogue de création d'une nouvelle classe en utilisant le menu contextuel accessible par un clic droit sur le répertoire «
src
» - Complétez les champs de saisie « Name » et « Namespace » sans valider :
- Constatez que le répertoire (champ de saisie « Directory ») est complété automatiquement, de façon cohérente selon l'espace de noms choisi Information
Si le nom du répertoire et de l'espace de nommage ne sont pas automatiquement en accord dans la boîte de dialogue, réinitialisez le cache de
PhpStorm
par le menu « File » puis « Invalidate Caches…. ». Cochez la première case et validez : - Remarquez que la boîte de dialogue comporte des champs de saisie pour choisir classe, interface ou trait, mais aussi la classe parente et les interfaces implémentées
- Validez votre saisie et ajoutez ce fichier à l'index
Git
et répondant favorablement à la suggestion dePhpStorm
- Ajoutez les propriétés privées «
id
» et «name
» avec leur type à la classe «Artist
» - Utilisez le menu « Code - Generate… » puis choisissez « Getters… » Information
« Generate… » est également accessible dans le menu contextuel au clic droit sur un code source
PHP
.Le raccourci clavier «
ALT+Ins.
» est utilisé par le gestionnaire de fenêtresXFCE
pour créer un nouvel espace de travail. Il ne fonctionne donc pas dansPhpStorm
, à moins de supprimer ou redéfinir le raccourci deXFCE
.Le code généré sera inséré à l'endroit où se situe le curseur texte.
- Sélectionnez les deux propriétés «
id
» et «name
» en utilisant «CTRL
» ou «SHIFT
» puis validez
Entité « ArtistCollection
»
¶
Les collections d'entités « Artist
» seront fournies par une classe dédiée, « ArtistCollection
», dont le diagramme est le suivant :
Travail à réaliser
- Créez une classe «
Entity\Collection\ArtistCollection
» - Écrivez la méthode «
findAll()
» qui retourne un tableau contenant tous les artistes triés par ordre alphabétique en vous inspirant très fortement du code que vous aviez écrit dans «index.php
», en intégrant les modifications suivantes :- la récupération des lignes utilisera «
fetchAll()
dePDOStatement
» - le mode de récupération des lignes sera «
PDO::FETCH_CLASS
»
Remarque importanteToutes vos requêtes doivent être préparées pour des raisons de performance, et si nécessaire paramétrées pour des raisons de sécurité. Toute substitution de variable dans une requête est une faille de sécurité potentielle !
- la récupération des lignes utilisera «
Documentation des tableaux homogènes ¶
Les collections homogènes, comme le tableau d'entités « Artist
», peuvent être documentées pour faciliter la lecture, la compréhension, l'autocomplétion ainsi que la navigation dans le code. Le type PHP
associé est « array
» mais il peut être décrit comme « type[]
», ici « Artist[]
». Cette formulation signifie « tableau de Artist
». Cette information supplémentaire améliore la compréhension du code et permet à l'éditeur de texte de faire des suggestions plus pertinentes sur les éléments constitutifs du tableau.
Remarque importante
« Artist[]
» est un pseudo-type de documentation présent dans les commentaires de la méthode qui ne peut en aucun cas être utilisé comme un type PHP
au niveau du prototype de la méthode !
Travail à réaliser
- Ajoutez un bloc de documentation automatique au-dessus de la méthode «
ArtistCollection::findAll()
» en saisissant «/**
» suivi de la touche «ENTER
» - Changez le type «
array
» de l'annotation «@return
» en «Artist[]
»InformationLes pseudo-types «
type[]
» peuvent aussi être formulés comme «array<type>
», ou encore «array<int, type>
» qui précise que les clés du tableau sont numériques. - Survolez la méthode «
ArtistCollection::findAll()
» et constatez les informations fournies dans la documentation - Profitez-en pour documenter la méthode en précisant ce qu'elle fait
Mise en place de tests automatisés ¶
Une refactorisation de code ne devrait pas avoir de répercussions sur le résultat final à destination de l'utilisateur. Si des tests automatisés avaient été mis en place plus tôt, vous auriez pu vérifier qu'ils étaient toujours valides après les modifications du code. Cette démarche d'écriture de tests, qui peuvent et doivent être exécutés régulièrement, maintient une qualité de réalisation constante et assure la non-régression.
Du point de vue théorique, les tests sont catégorisés selon l'objet du test :
- les tests unitaires s'intéressent à un seul composant
- les tests d'intégration valident un ensemble de composants et leurs interactions
- les tests fonctionnels évaluent le système dans son ensemble
- les tests d'acceptation vérifient la conformité du système en production
Vous allez ajouter la bibliothèque de gestion de tests Codeception
à votre projet.
Installation de Codeception
par Composer
¶
Codeception
est accessible via Composer
. Vous allez l'ajouter comme dépendance de développement de votre projet.
Travail à réaliser
- Recherchez «
codeception
» dans les paquetsComposer
:Remarque importanteCodeception
est décomposé en un cœur accompagné de modules. Pour des raisons pratiques, vous allez installer des modules qui ne vous seront pas immédiatement utiles et dans des versions fixées au moment de la rédaction de ce sujet. - Demandez la dépendance de développement suivante :
composer require --dev --with-all-dependencies codeception/codeception:^4.1 codeception/module-phpbrowser:^1 codeception/module-asserts:^1 codeception/module-db:^1
- Testez le bon fonctionnement de
Codeception
avec la commande suivante :php vendor/bin/codecept --version Codeception 4.2.2
Configuration générale de Codeception
¶
Codeception
propose une commande d'initialisation du fichier de configuration « codeception.yml
». Nous passerons une option pour modifier l'espace de noms des tests afin de rester conforme à la recommandation PSR-4.
Travail à réaliser
- Lancez la commande d'initialisation du fichier de configuration :
php vendor/bin/codecept bootstrap --namespace=Tests --empty
- Observez l'apparition du fichier «
codeception.yml
» à la racine de votre projet - Observez l'apparition du répertoire «
tests
» et de sa sous-arborescence à la racine de votre projetInformationLes fichiers «
.gitkeep
» sont utilisés pour préserver une arborescence vide carGit
est prévu pour suivre les modifications des fichiers et non des répertoires. - Ajoutez l'ensemble des fichiers générés par
Codeception
à l'indexGit
Configuration de l'auto-chargement de développement ¶
Tout comme la configuration de l'auto-chargement, vous allez configurer l'auto-chargement de développement dans le fichier « composer.json
» en profitant de la complétion de PhpStorm
.
Travail à réaliser
- Ouvrez le fichier «
composer.json
» - Localiser la propriété «
autoload
» - Placez votre curseur à la fin de la valeur associée à la propriété «
autoload
» - Commencez à saisir «
auto
» et acceptez la suggestion «autoload-dev
» dePhpStorm
- Commencez à saisir «
ps
» et acceptez la suggestion «psr-4
» dePhpStorm
- Associez l'espace de noms «
Tests\
» au répertoire «tests
» - Mettez à jour l'auto-chargement de
Composer
en lançant la commande suivante :composer dump-autoload
Création d'une nouvelle suite de tests ¶
Codeception
regroupe les tests dans des « suites de tests » (« test suite » en anglais). Ceci permet de grouper les tests par thème, nature ou portée. Vous grouperez les tests selon les consignes. Pour commencer, les tests des entités de la couche d'abstraction d'accès aux données de la base de données seront groupés dans la suite « Crud
» qui testera à terme toutes les opérations de persistance des données.
Travail à réaliser
- Lancez la commande de création d'une nouvelle suite de tests «
Crud
» :php vendor/bin/codecept generate:suite Crud
- Observez l'apparition du fichier «
Crud.suite.yml
» dans le répertoire «tests
» - Observez l'apparition du fichier «
Crud.php
» dans le répertoire «tests/_support/Helper
»InformationUne partie de la modularité de
Codeception
réside dans les modules et assistants. Les modules («Modules
») apportent des fonctionnalités à l'objet effectuant les tests. Ils sont proposés de façon standard avecCodeception
. Des modules personnalisés ou assistants («Helpers
») complètent le dispositif et permettent au développeur de proposer ses propres fonctionnalités. - Éditez le fichier «
Crud.suite.yml
» pour activer les modules «Asserts
» et «Db
» :modules: enabled: - \Tests\Helper\Crud - Asserts - Db: # configuration from codeception.yml injected into MyPdo in _support/Helper/Crud.php
InformationLe module «
Db
» sera configuré dans le fichier «codeception.yml
» et cette configuration sera injectée dans le singleton «MyPdo
» dans le code de «_support/Helper/Crud.php
».
Configuration de la base de données de test ¶
Pour effectuer des tests, il est nécessaire de maîtriser l'environnement dans lequel ils s'exécutent. Puisque l'application utilise une base de données, les tests doivent être écrits en fonctions des données. Pour permettre une exécution des tests indépendante du serveur de base de données et de sa configuration, il est classique d'utiliser une base de données SQLite qui a la particularité de ne pas nécessiter de serveur.
Les tests étant amenés à modifier la base de données, il est vital de commencer chaque test dans un état connu, soit avec une base de données vide, soit avec une base de données dans un état initial constant entre chaque test. Pour cela, le module « DB
» de Codeception
propose d'utiliser un « dump » SQL
(le script SQL
de création et de remplissage de la base de données) comme source de données. Il faudra évidemment configurer le singleton « MyPdo
» pour qu'il utilise la base de données générée à partir de ce « dump ».
Travail à réaliser
- Placez le « dump » de la base de données dans le répertoire «
tests/_data
»InformationLe « dump »
musiclite.sql
est une version réduite de la base de données avec seulement 8 artistes. Il n'est pas utile d'avoir l'intégralité de la base de données pour effectuer les tests est cela permet d'augmenter leur rapidité, en particulier la génération des données lors de chaque test. - Ajoutez la configuration du module «
DB
» dans le fichier «codeception.yml
» :modules: config: Db: # configuration injected into MyPdo in _support/Helper/*.php, if necessary dsn: "sqlite:tests/musiclite.sqlite" user: "" password: "" dump: "tests/_data/musiclite.sql" populate: true cleanup: true
- Excluez le fichier binaire de la base de données
SQLite
«tests/musiclite.sqlite
» ainsi que «tests/musiclite.sqlite_snapshot
» de l'index de votre dépôtGit
en les ajoutant dans le fichier «.gitignore
»Remarque importanteLes fichiers «
tests/musiclite.sqlite
» et «tests/musiclite.sqlite_snapshot
» sont créés parCodeception
à partir du « dump » «musiclite.sql
». Il est parfaitement inutile, et surtout contreproductif, de les intégrer au dépôtGit
. - Ajoutez la méthode «
_initialize()
» à la classe d'assistant «Tests\Helper\Crud
» pour configurer «MyPdo
» lors de l'initialisation de la suite de tests :public function _initialize($settings = []) { try { MyPdo::setConfiguration($this->getModule('Db')->_getConfig('dsn')); } catch (ModuleException $moduleException) { $this->fail('Codeception DB module not found'); } }
- Corrigez les erreurs en ajoutant les imports nécessaires grâce à
PhpStorm
Création d'un nouveau lot de tests dans la suite « Crud
»
¶
Les tests dans une « suite de tests » sont groupés au sein de classes de test appelées « Cest » (Codecept + Test). Une classe de « Cest » comprend des méthodes publiques qui sont considérées comme un test, hormis celle dont le nom commence par « _
».
Travail à réaliser
- Lancez la commande de création d'un nouveau « Cest » :
php vendor/bin/codecept generate:cest Crud Collection\\ArtistCollection
- Observez l'apparition du fichier «
tests/Crud/Collection/ArtistCollectionCest.php
» - Corrigez l'espace de noms du fichier «
tests/Crud/Collection/ArtistCollectionCest.php
» pour le rendre conforme à la recommandationPSR-4
- Supprimez toutes les méthodes de la classe «
ArtistCollectionCest
» générées automatiquement et remplacez-les par :public function findAll(CrudTester $I) { $expectedArtists = [ ['id' => 40, 'name' => 'Joe Cocker'], ['id' => 89, 'name' => 'Justin Bieber'], ['id' => 59, 'name' => 'Lance & Donna'], ['id' => 17, 'name' => 'Metallica'], ['id' => 13, 'name' => 'Pantera'], ['id' => 4, 'name' => 'Slipknot'], ['id' => 26, 'name' => 'System Of A Down'], ['id' => 6, 'name' => 'ZZ Top'], ]; $artists = ArtistCollection::findAll(); $I->assertCount(count($expectedArtists), $artists); $I->assertContainsOnlyInstancesOf(Artist::class, $artists); foreach ($artists as $index => $artist) { $expectedArtist = $expectedArtists[$index]; $I->assertEquals($expectedArtist['id'], $artist->getId()); $I->assertEquals($expectedArtist['name'], $artist->getName()); } }
- Lancez la command de génération des fichiers nécessaires au fonctionnement du « Cest » :
php vendor/bin/codecept build
- Corrigez les erreurs en ajoutant les imports nécessaires grâce à
PhpStorm
Première exécution des tests ¶
Les tests peuvent être exécutés de façon indépendante ou dans leur ensemble et doivent évidemment « passer » pour que le code testé soit considéré valide.
Travail à réaliser
- Lancez la commande d'exécution des tests' :
php vendor/bin/codecept run
- Vérifiez que le test « passe » :
Codeception PHP Testing Framework v4.1.31 Powered by PHPUnit 9.5.20 Tests.Crud Tests (1) ----------------------------------------------------------------------------------------------------------- ✔ ArtistCollectionCest: Get all (0.00s) -------------------------------------------------------------------------------------------------------------------------------- Time: 00:00.041, Memory: 12.00 MB OK (1 test, 18 assertions)
Ajout de scripts Composer
¶
Toujours afin d'améliorer l'expérience développeur, vous allez créer un script Composer
pour lancer les tests Codeception
ainsi que l'ensemble des tests.
Travail à réaliser
- Ouvrez le fichier «
composer.json
» - Ajoutez un script «
test:crud
» :php vendor/bin/codecept run Crud
- Ajoutez un script «
test:codecept
» qui lance l'ensemble des tests deCodeception
- Ajoutez un script «
test
» qui référence les scripts «test:cs
» et «test:codecept
» - Vérifiez que les tests passent
- Documentez votre projet dans «
README.md
» en expliquant l'utilisation et l'objectif de chaque script de test dans une partie « Tests »
Utilisation de la couche d'abstraction d'accès aux données ¶
Les classes « Artist
» et « ArtistCollection
» sont prêtes à l'emploi. Vous allez refactoriser le programme « index.php
» pour les utiliser.
Travail à réaliser
- Dans «
index.php
», remplacez tout le code possible par l'utilisation des classes «Artist
» et «ArtistCollection
» - Vérifiez que votre programme produise toujours un contenu
HTML
satisfaisant et valide.
Couche d'abstraction d'accès aux données de la base de données, suite ¶
Avec le même objectif que les classes « Artist
» et « ArtistCollection
», vous allez développer les classes « Album
» et « AlbumCollection
».
Entité Album
¶
Comme précédemment, une ligne de la table « album
», composée des champs « id
», « name
», « year
», … sera représentée par une instance de l'entité « Album
» dont les propriétés sont « id
», « name
», « year
», …
Le diagramme de la classe « Album
» est donné ci-après.
Travail à réaliser
Créez la classe « Album
» en suivant la même démarche que pour la classe « Artist
»
Entité « AlbumCollection
»
¶
Les collections d'entités « Album
» seront fournies par une classe dédiée, « AlbumCollection
». La liste de tous les albums n'est pas nécessaire. Une méthode « findByArtistId(int)
» donnera l'ensemble des albums d'un artiste, triés par ordre chronologique inverse puis par nom. Le diagramme de la classe « AlbumCollection
» est le suivant :
Travail à réaliser
Créez la classe « AlbumCollection
» en suivant la même démarche que pour la classe « ArtistCollection
»
Tests de l'entité « AlbumCollection
»
¶
Les tests doivent vérifier le fonctionnement des nouvelles classes, en particulier AlbumCollection
». Un lot de tests dédiés va être ajouté.
Travail à réaliser
- Lancez la commande de création d'un nouveau « Cest » :
php vendor/bin/codecept generate:cest Crud Collection\\AlbumCollection
- Observez l'apparition du fichier «
tests/Crud/Collection/AlbumCollectionCest.php
» - Corrigez l'espace de noms du fichier «
tests/Crud/Collection/AlbumCollectionCest.php
» pour le rendre conforme à la recommandationPSR-4
- Supprimez toutes les méthodes de la classe «
AlbumCollectionCest
» générées automatiquement et remplacez-les par :public function findByArtistId(CrudTester $I) { $expectedAlbums = [ ['id' => 419, 'name' => 'The Big 4: Live From Sofia, Bulgaria', 'year' => 2010, 'genreId' => 4, 'artistId' => 17, 'coverId' => 251], ['id' => 330, 'name' => 'Death Magnetic', 'year' => 2008, 'genreId' => 4, 'artistId' => 17, 'coverId' => 326], ['id' => 44, 'name' => '2004/10/15 Quebec City, QC', 'year' => 2004, 'genreId' => 4, 'artistId' => 17, 'coverId' => 132], ['id' => 131, 'name' => 'St. Anger', 'year' => 2003, 'genreId' => 4, 'artistId' => 17, 'coverId' => 373], ['id' => 132, 'name' => 'St. Anger DVD', 'year' => 2003, 'genreId' => 4, 'artistId' => 17, 'coverId' => 302], ['id' => 416, 'name' => 'S&M', 'year' => 1999, 'genreId' => 4, 'artistId' => 17, 'coverId' => 320], ['id' => 405, 'name' => 'Garage Inc.', 'year' => 1998, 'genreId' => 4, 'artistId' => 17, 'coverId' => 348], ['id' => 178, 'name' => 'Live in Detroit', 'year' => 1998, 'genreId' => 4, 'artistId' => 17, 'coverId' => 307], ['id' => 135, 'name' => 'Reload', 'year' => 1997, 'genreId' => 4, 'artistId' => 17, 'coverId' => 344], ['id' => 20, 'name' => 'Load', 'year' => 1996, 'genreId' => 4, 'artistId' => 17, 'coverId' => 98], ['id' => 404, 'name' => 'Live Shit: Binge & Purge in Mexico City', 'year' => 1993, 'genreId' => 4, 'artistId' => 17, 'coverId' => 361], ['id' => 108, 'name' => 'Black Album', 'year' => 1991, 'genreId' => 4, 'artistId' => 17, 'coverId' => 363], ['id' => 38, 'name' => 'Prowling Osaka', 'year' => 1989, 'genreId' => 4, 'artistId' => 17, 'coverId' => 202], ['id' => 43, 'name' => '...And Justice For All', 'year' => 1988, 'genreId' => 4, 'artistId' => 17, 'coverId' => 48], ['id' => 39, 'name' => 'Master of Puppets', 'year' => 1986, 'genreId' => 4, 'artistId' => 17, 'coverId' => 65], ['id' => 121, 'name' => 'Ride The Lightning', 'year' => 1984, 'genreId' => 4, 'artistId' => 17, 'coverId' => 195], ['id' => 155, 'name' => 'Kill \'Em All', 'year' => 1983, 'genreId' => 4, 'artistId' => 17, 'coverId' => 260], ['id' => 310, 'name' => 'Sucking My Love', 'year' => 1982, 'genreId' => 4, 'artistId' => 17, 'coverId' => 222], ]; $albums = AlbumCollection::findByArtistId(17); $I->assertCount(count($expectedAlbums), $albums); $I->assertContainsOnlyInstancesOf(Album::class, $albums); foreach ($albums as $index => $album) { $expectedAlbum = $expectedAlbums[$index]; $I->assertEquals($expectedAlbum['id'], $album->getId()); $I->assertEquals($expectedAlbum['name'], $album->getName()); $I->assertEquals($expectedAlbum['year'], $album->getYear()); $I->assertEquals($expectedAlbum['genreId'], $album->getGenreId()); $I->assertEquals($expectedAlbum['artistId'], $album->getArtistId()); $I->assertEquals($expectedAlbum['coverId'], $album->getCoverId()); } }
- Corrigez les erreurs en ajoutant les imports nécessaires grâce à
PhpStorm
- Vérifiez que les tests passent et corrigez votre code si besoin
Amélioration de l'entité « Artist
»
¶
La logique objet et l'encapsulation conduisent naturellement l'entité « Artist
» à proposer une méthode « getAlbums()
» permettant de demander à un artiste la liste de ses albums. En amont de cela, il faut pouvoir créer une nouvelle instance de la classe « Artist
» à partir du contenu de la base de données :
Travail à réaliser
- Créez la classe «
Entity\Exception\EntityNotFoundException
» héritant de «OutOfBoundsException
» - Ajoutez la méthode «
findById()
» à la classe «Artist
»Remarque importanteToutes vos requêtes doivent être préparées pour des raisons de performance, et si nécessaire paramétrées pour des raisons de sécurité. Toute substitution de variable dans une requête est une faille de sécurité potentielle !
- Ajoutez la méthode «
getAlbums()
» à la classe «Artist
»
Tests de l'entité « Artist
»
¶
L'entité « Artist
» possède à présent une méthode digne d'intérêt pour les tests.
Travail à réaliser
- Lancez la commande de création d'un nouveau « Cest » :
php vendor/bin/codecept generate:cest Crud Artist
- Observez l'apparition du fichier «
tests/Crud/ArtistCest.php
» - Corrigez l'espace de noms du fichier «
tests/Crud/ArtistCest.php
» pour le rendre conforme à la recommandationPSR-4
- Supprimez toutes les méthodes de la classe «
ArtistCest
» générées automatiquement et remplacez-les par :public function findById(CrudTester $I) { $artist = Artist::findById(4); $I->assertSame(4, $artist->getId()); $I->assertSame('Slipknot', $artist->getName()); } public function findByIdThrowsExceptionIfArtistDoesNotExist(CrudTester $I) { $I->expectThrowable(EntityNotFoundException::class, function () { Artist::findById(PHP_INT_MAX); }); }
- Corrigez les erreurs en ajoutant les imports nécessaires grâce à
PhpStorm
- Vérifiez que les tests passent et corrigez votre code si besoin
Refactorisation du programme « artist.php
»
¶
Les classes « Album
» et « AlbumCollection
» sont prêtes à l'emploi. Vous allez refactoriser le programme « artist.php
» pour les utiliser.
Travail à réaliser
- Dans «
artist.php
», remplacez tout le code possible par l'utilisation des classes «Artist
», «Album
» et «AlbumCollection
» - Vérifiez que votre programme produise toujours un contenu
HTML
satisfaisant et valide.
Bilan et suite ¶
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.
Ces diverses améliorations seront mises en place dans la suite de ce sujet.