Les tests instantanés sont un moyen de tester sans écrire de véritables cas de test.
Vous pouvez en apprendre davantage dans cette vidéo gratuite de notre cours Testing Laravel. Ne vous inquiétez pas, vous pouvez également utiliser ce package dans des projets non Laravel.
utiliser SpatieSnapshotsMatchesSnapshots ; classe OrderTest {utilisez MatchesSnapshots; fonction publique test_it_casts_to_json() {$order = new Order(1);$this->assertMatchesJsonSnapshot($order->toJson()); } }
Lors de la première exécution, le programme d'exécution du test créera un nouvel instantané.
> ./vendor/bin/phpunit There was 1 incomplete test: 1) OrderTest::test_it_casts_to_json Snapshot created for OrderTest__test_it_casts_to_json__1 OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1.
Lors des exécutions suivantes, le test réussira tant que l'instantané ne change pas.
> ./vendor/bin/phpunit OK (1 test, 1 assertion)
S'il y a une régression, le test échouera !
$orderId = nouvelle commande (2); // Régression ! Était « 1 »
> ./vendor/bin/phpunit 1) OrderTest::test_it_casts_to_json Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ Failed asserting that '{"id":2}' matches JSON string "{ "id": 1 } FAILURES! Tests: 1, Assertions: 1, Failures: 1.
Nous investissons beaucoup de ressources dans la création des meilleurs packages open source de leur catégorie. Vous pouvez nous soutenir en achetant l'un de nos produits payants.
Nous apprécions grandement que vous nous envoyiez une carte postale de votre ville natale, mentionnant le(s) forfait(s) que vous utilisez. Vous trouverez notre adresse sur notre page contact. Nous publions toutes les cartes postales reçues sur notre mur virtuel de cartes postales.
Vous pouvez installer le package via composer :
composer require --dev spatie/phpunit-snapshot-assertions
Pour créer des assertions d'instantané, utilisez le trait SpatieSnapshotsMatchesSnapshots
dans votre classe de scénario de test. Cela ajoute un ensemble de méthodes d'assertion à la classe :
assertMatchesSnapshot($actual)
assertMatchesFileHashSnapshot($actual)
assertMatchesFileSnapshot($actual)
assertMatchesHtmlSnapshot($actual)
assertMatchesJsonSnapshot($actual)
assertMatchesObjectSnapshot($actual)
assertMatchesTextSnapshot($actual)
assertMatchesXmlSnapshot($actual)
assertMatchesYamlSnapshot($actual)
assertMatchesImageSnapshot($actual)
Faisons une assertion d'instantané pour une simple chaîne, "foo".
public function test_it_is_foo() {$this->assertMatchesSnapshot('foo'); }
La première fois que l'assertion est exécutée, elle ne dispose pas d'un instantané avec lequel comparer la chaîne. Le programme d'exécution du test génère un nouvel instantané et marque le test comme incomplet.
> ./vendor/bin/phpunit There was 1 incomplete test: 1) ExampleTest::test_it_matches_a_string Snapshot created for ExampleTest__test_it_matches_a_string__1 OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1.
Les identifiants d'instantané sont générés en fonction des noms du test et du scénario de test. Les instantanés de base renvoient une représentation en texte brut ou YAML de la valeur réelle.
foo
Refaisons le test. L'exécuteur du test verra qu'il existe déjà un instantané de l'assertion et effectuera une comparaison.
> ./vendor/bin/phpunit OK (1 test, 1 assertion)
Si nous changeons la valeur réelle en "bar", le test échouera car l'instantané renvoie toujours "foo".
public function test_it_is_foo() {$this->assertMatchesSnapshot('bar'); }
> ./vendor/bin/phpunit 1) ExampleTest::test_it_matches_a_string Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'foo' +'bar' FAILURES! Tests: 1, Assertions: 1, Failures: 1.
Lorsque nous nous attendons à une valeur modifiée, nous devons dire au lanceur de test de mettre à jour les instantanés existants au lieu d'échouer le test. Ceci est possible en ajoutant un indicateur -d --update-snapshots
à la commande phpunit
ou en définissant la variable d'environnement UPDATE_SNAPSHOTS
sur true
.
> ./vendor/bin/phpunit -d --update-snapshots OK (1 test, 1 assertion)
En conséquence, notre fichier instantané renvoie « bar » au lieu de « foo ».
bar
Le trait MatchesSnapshots
offre deux manières d'affirmer qu'un fichier est identique à l'instantané créé lors de la première exécution du test :
L'assertion assertMatchesFileHashSnapshot($filePath)
affirme que le hachage du fichier transmis à la fonction et le hachage enregistré dans l'instantané correspondent. Cette assertion est rapide et utilise très peu d'espace disque. L’inconvénient de cette affirmation est qu’il n’existe pas de moyen simple de voir en quoi les deux fichiers diffèrent si le test échoue.
L'assertion assertMatchesFileSnapshot($filePath)
fonctionne presque de la même manière que l'assertion de hachage de fichier, sauf qu'elle enregistre en fait l'intégralité du fichier dans le répertoire des instantanés. Si l'assertion échoue, elle place le fichier ayant échoué à côté du fichier d'instantané afin qu'ils puissent facilement être comparés manuellement. Le fichier ayant échoué persistant est automatiquement supprimé une fois le test réussi. Cette assertion est particulièrement utile lorsque vous travaillez avec des fichiers binaires qui doivent être comparés manuellement, comme des images ou des fichiers PDF.
Le assertImageSnapshot
nécessite l'installation du package spatie/pixelmatch-php.
Cette assertion réussira si l’image donnée est presque identique à l’instantané réalisé lors de la première exécution du test. Vous pouvez personnaliser le seuil en passant un deuxième argument à l'assertion. Des valeurs plus élevées rendront la comparaison plus sensible. Le seuil doit être compris entre 0 et 1.
$this->assertMatchesImageSnapshot($imagePath, 0.1);
Les identifiants d'instantané sont générés via la méthode getSnapshotId
sur le trait MatchesSnapshot
. Remplacez la méthode pour personnaliser l'identifiant. Par défaut, il existe un identifiant d'instantané contenant le nom du test, le nom du scénario de test et une valeur incrémentielle, par exemple Test__my_test_case__1
.
__
par --
fonction protégée getSnapshotId() : string{return (new ReflectionClass($this))->getShortName().'--'.$this->name().'--'.$this->snapshotIncrementor ; }
Par défaut, les instantanés sont stockés dans un répertoire __snapshots__
relatif à la classe de test. Cela peut être modifié en remplaçant la méthode getSnapshotDirectory
.
__snapshots__
en snapshots
fonction protégée getSnapshotDirectory() : string{return dirname((new ReflectionClass($this))->getFileName()).DIRECTORY_SEPARATOR.'snapshots'; }
Le pilote utilisé pour sérialiser les données peut être spécifié comme deuxième argument de la méthode assertMatchesSnapshot
, afin que vous puissiez en choisir un qui correspond mieux à vos besoins :
utiliser SpatieSnapshotsDriversJsonDriver ; utiliser SpatieSnapshotsMatchesSnapshots ; classe OrderTest {utilisez MatchesSnapshots; fonction publique test_snapshot_with_json_driver() {$order = new Order(1);$this->assertMatchesSnapshot($order->toJson(), new JsonDriver()); } }
Les pilotes garantissent que différents types de données peuvent être sérialisés et mis en correspondance à leur manière. Un pilote est une classe qui implémente l'interface SpatieSnapshotsDriver
, qui nécessite trois implémentations de méthodes : serialize
, extension
et match
.
Jetons un coup d'œil rapide au JsonDriver
.
espace de noms SpatieSnapshotsDrivers ; utiliser PHPUnitFrameworkAssert ; utiliser SpatieSnapshotsDriver ; utiliser SpatieSnapshotsExceptionsCantBeSerialized ; la classe JsonDriver implémente le pilote {public function serialize($data): string{if (! is_string($data)) {throw new CantBeSerialized('Seules les chaînes peuvent être sérialisées en json'); }return json_encode(json_decode($data), JSON_PRETTY_PRINT).PHP_EOL; }extension de fonction publique() : string{return 'json' ; } correspondance de fonction publique ($ attendu, $ réel) { Assert::assertJsonStringEqualsJsonString($réel, $expected); } }
La méthode serialize
renvoie une chaîne qui sera écrite dans le fichier instantané. Dans le JsonDriver
, nous décoderons et réencoderons la chaîne json pour garantir une jolie impression de l'instantané.
Nous souhaitons enregistrer les instantanés JSON sous forme de fichiers JSON, nous utiliserons donc json
comme extension de fichier.
Lors de la mise en correspondance des données attendues avec les données réelles, nous souhaitons utiliser les assertions json intégrées de PHPUnit, nous appellerons donc la méthode assertJsonStringEqualsJsonString
spécifique.
Les pilotes peuvent être utilisés en les passant comme deuxième argument de assertMatchesSnapshot
.
$this->assertMatchesSnapshot($something->toYaml(), new MyYamlDriver());
Lors de l'exécution de vos tests en intégration continue, vous souhaiterez peut-être désactiver la création d'instantanés.
En utilisant le paramètre --without-creating-snapshots
ou en définissant la variable d'environnement CREATE_SNAPSHOTS
sur false
, PHPUnit échouera si les instantanés n'existent pas.
> ./vendor/bin/phpunit -d --sans-créer-des instantanés 1) ExempleTest :: test_it_matches_a_string L'instantané "ExampleTest__test_it_matches_a_string__1.txt" n'existe pas. Vous pouvez le créer automatiquement en supprimant la variable d'environnement `CREATE_SNAPSHOTS=false` ou `-d --no-create-snapshots` des arguments CLI de PHPUnit.
Si vous souhaitez exécuter votre test en parallèle avec un outil comme Paratest, ou avec la commande php artisan test --parallel
de Laravel, vous devrez utiliser les variables d'environnement.
> CREATE_SNAPSHOTS=faux test artisanal php --parallel 1) ExempleTest :: test_it_matches_a_string L'instantané "ExampleTest__test_it_matches_a_string__1.txt" n'existe pas. Vous pouvez le créer automatiquement en supprimant la variable d'environnement `CREATE_SNAPSHOTS=false` ou `-d --no-create-snapshots` des arguments CLI de PHPUnit.
Les utilisateurs Windows doivent configurer leurs fins de ligne dans .gitattributes
.
# Les instantanés utilisés dans les tests contiennent des données sérialisées et leur fin de ligne doit rester inchangéetests/**/__snapshots__/** binaire
Veuillez consulter CHANGELOG pour plus d'informations sur ce qui a changé récemment.
test de compositeur
Veuillez consulter CONTRIBUER pour plus de détails.
Si vous avez trouvé un bug concernant la sécurité, veuillez envoyer un mail à [email protected] au lieu d'utiliser le suivi des problèmes.
Vous êtes libre d'utiliser ce package, mais s'il parvient à votre environnement de production, nous apprécions grandement que vous nous envoyiez une carte postale de votre ville natale, mentionnant lequel de nos packages vous utilisez.
Notre adresse est : Spatie, Kruikstraat 22, 2018 Anvers, Belgique.
Nous publions toutes les cartes postales reçues sur le site Internet de notre entreprise.
Sébastien De Deyne
Alex Vanderbist
Tous les contributeurs
La licence MIT (MIT). Veuillez consulter le fichier de licence pour plus d'informations.