URL: https://linuxfr.org/news/pest-soit-des-tests-unitaires Title: PEST soit des tests unitaires Authors: windu.2b Ysabeau đŸ§¶, barmic 🩩, Yves Bourguignon et BAud Date: 2021ćčŽ08月25æ—„T13:57:40+02:00 License: CC By-SA Tags: pest, tests, phpunit et php Score: 26 PEST est un nouveau framework en PHP, permettant de rĂ©diger des tests unitaires. BasĂ© sur le cĂ©lĂšbre (pour ceux qui dĂ©veloppent en PHP) PHUnit, PEST a pour lui d’ĂȘtre plus Ă©lĂ©gant et simple Ă  utiliser, et apporte notamment une plus grande fluiditĂ© dans l’écriture des tests unitaires. Il a Ă©tĂ© créé par Nuno Maduro, membre de la core team de [Laravel](https://linuxfr.org/tags/laravel/public), en [sponsorware](https://github.com/sponsorware/docs). Depuis le printemps 2020, il est publiĂ© sous [licence MIT](https://github.com/pestphp/pest/blob/master/LICENSE.md). Il ne possĂšde aucune filiation avec Laravel, on peut tout Ă  fait s’en servir sans. Petit tour d’horizon ! _(tous les exemples de code de cette dĂ©pĂȘche proviennent de la documentation officielle de PEST)_ ---- [Site officiel](https://pestphp.com/) [DĂ©pĂŽt officiel (github)](https://github.com/pestphp/pest) [Licence MIT](https://github.com/pestphp/pest/blob/master/LICENSE.md) [Nuno Maduro crĂ©ateur du projet](https://twitter.com/enunomaduro) [PEST in practice (sĂ©rie de vidĂ©os)](https://www.youtube.com/playlist?list=PLb4Xm6fDKP2o3F1uP9DM7MfTO7P0W_mmB) ---- Premiers tests ============== Pour commencer, voyons Ă  quoi ressemble un test basique, avec PEST. ```php assertTrue(true); expect(true)->toBeTrue(); }); ``` Contrairement Ă  PHPUnit, qui regroupe chaque test dans une mĂ©thode de classe, chaque test dans PEST consiste Ă  appeler la fonction `test` en lui passant 2 paramĂštres : la description du test (texte libre) et une fonction anonyme (_Closure_) contenant le code du test proprement dit. Le tout dans un simple fichier PHP (pas de classe, pas de _namespace_, rien de tout ça n’est nĂ©cessaire). Comme PEST repose sur PHPUnit, on peut utiliser les mĂ©thodes `assertXXX` dĂ©jĂ  existantes et connues de tous, Ă  travers `$this` (qui est un objet de type `PHPUnit\Framework\TestCase`, ce qui montre que PEST est une surcouche Ă  PHPUnit, avec du sucre syntaxique dedans). Mais on peut aussi utiliser les nouvelles mĂ©thodes `toBeXXX` mises Ă  notre disposition par PEST, et dont on parlera plus loin. Si le test ci-dessus rĂ©ussit, PEST affichera : ```php ✓ asserts true is true ``` À noter que la fonction `test` a une petite sƓur : `it` (mĂȘme signature). La seule diffĂ©rence est que cette derniĂšre affichera ceci, si le test rĂ©ussit : ```php ✓ it asserts true is true ``` Expectations ============ Bien que PEST puisse s’utiliser comme PHPUnit (ce qui permet doucement de basculer d’un framework Ă  l’autre), on peut bien Ă©videmment aller plus loin, en tirant profit de sa spĂ©cificitĂ© : les expectations. ConcrĂštement, cela consiste en une mĂ©thode `expect`, Ă  qui on passe la variable Ă  tester, et toute une sĂ©rie de mĂ©thodes fluides (_fluent interfaces_) qui vont chacune vĂ©rifier que la variable respecte telle ou telle rĂšgle. Reprenons l’exemple du dĂ©but : ```php assertTrue(true); // expectation expect(true)->toBe(true); }); ``` On voit que la mĂ©thode `toBe` vĂ©rifie que la valeur `true` (passĂ©e en paramĂštre de la fonction `expect`) est bien Ă©gale Ă  `true`. Voyons maintenant un cas un peu plus poussĂ© (et plus proche de ce qu’on peut ĂȘtre amenĂ© Ă  Ă©crire, dans la vraie vie) : ```php expect($user)->toBeInstanceOf(User::class); ``` Ici, la mĂ©thode `toBeInstanceOf` vĂ©rifie que la variable `$user` est bien de type `User`. On ne va pas lister ici la palanquĂ©e de mĂ©thodes `toBeXXX` qui existent : [la documentation est lĂ  pour ça](https://pestphp.com/docs/expectations#available-expectations), avec un exemple pour chacune d’elles. Rappelons toutefois qu’il est tout Ă  fait possible de chaĂźner les appels de mĂ©thodes, pour tester plusieurs choses sur une mĂȘme valeur. Exemple : ```php expect('{"name":"Nuno","credit":1000.00}') ->json() ->toHaveCount(2); ``` Higher Order Tests ------------------ Avec le chaĂźnage des mĂ©thodes vient aussi une autre possibilitĂ© de PEST : pouvoir tester les valeurs au sein de la variable passĂ©e Ă  la fonction `expect`. Ainsi, plutĂŽt que de faire plusieurs appels Ă  `expect` (ce qui reste tout Ă  fait possible), comme suit : ```php expect($user->first_name)->toEqual('Nuno'); expect($user->last_name)->toEqual('Maduro'); expect($user->withTitle('Mr'))->toEqual('Mr Nuno Maduro'); ``` On peut tout Ă  fait faire ceci : ```php expect($user) ->first_name->toEqual('Nuno') ->last_name->toEqual('Maduro') ->withTitle('Mr')->toEqual('Mr Nuno Maduro'); ``` Et lĂ , on commence Ă  toucher Ă  ce qui rend PEST si attrayant : le chaĂźnage est sans limite ! On peut tester toutes les donnĂ©es contenues Ă  l’intĂ©rieur de la valeur passĂ©e en paramĂštre Ă  `expect`, que ce soit les propriĂ©tĂ©s d’un objet, comme on vient de le voir, ou les diffĂ©rents Ă©lĂ©ments d’un tableau, comme ci-dessous : ```php expect(['name' => 'Nuno', 'companies' => ['Pest', 'Laravel']]) ->name->toEqual('Nuno') ->companies->toHaveCount(2)->each->toBeString ``` (notez l’usage de `each`, qui permet de boucler sur les sous-Ă©lĂ©ments du tableau) Comme dit prĂ©cĂ©demment, il n’y a pas de limite dans le chaĂźnage, ni dans le parcours en profondeur d’un objet ou d’un tableau. Ainsi, il est tout Ă  fait possible d’aller chercher les propriĂ©tĂ©s d’un objet, et de tester qu’elles rĂ©pondent elles aussi Ă  certains critĂšres. Exemple : ```php expect($user) ->companies->first()->owner->toBeInstanceOf(User::class)->not->toEqual($user) ->name->toEqual('Nuno'); ``` Dans cet exemple, on comprend que l’objet `$user` a 2 propriĂ©tĂ©s testĂ©es : `companies` (qui semble renvoyer une liste d’objets), dont on vĂ©rifie que le `owner` du premier Ă©lĂ©ment est bien un objet de type `User`, mais n’est pas `$user`. Et `name`, dont on vĂ©rifie la valeur. Ici, `name` se rapporte Ă  `$user`, et non Ă  `companies` : PEST est capable de revenir Ă  l’objet initialement traitĂ© (celui passĂ© en paramĂštre Ă  `expect`). Et ce, sans limite ! ## Custom expectations La liste des expectations a beau ĂȘtre trĂšs grande, et de nouvelles mĂ©thodes apparaissent chaque semaine, il y a toujours un moment oĂč il manque celle dont on a besoin, pour couvrir son cas particulier. Fort heureusement, PEST permet l’ajout de nouvelles mĂ©thodes, grĂące Ă  la mĂ©thode `extend()`. Exemple : ```php // tests/Pest.php expect()->extend('toBeWithinRange', function ($min, $max) { return $this->toBeGreaterThanOrEqual($min) ->toBeLessThanOrEqual($max); }); test('numeric ranges', function () { expect(100)->toBeWithinRange(90, 110); }); ```

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /