{"id":230302,"date":"2022-11-26T12:37:00","date_gmt":"2022-11-26T09:37:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230302"},"modified":"2022-11-26T12:37:24","modified_gmt":"2022-11-26T09:37:24","slug":"ecrire-des-tests-unitaires-avec-phpunit-partie-1-la-configuration","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/ecrire-des-tests-unitaires-avec-phpunit-partie-1-la-configuration\/","title":{"rendered":"\u00c9crire des tests unitaires avec PHPUnit, partie 1\u00a0: la configuration"},"content":{"rendered":"\n<p>Plus t\u00f4t ce mois-ci, nous avons commenc\u00e9 \u00e0 envisager d&rsquo;installer <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/installation-de-phpunit-dans-visual-studio-code\/\" title=\"PHPUnit dans Visual Studio Code\">PHPUnit dans Visual Studio Code<\/a><\/strong> dans le but ultime d&rsquo;apprendre \u00e0 \u00e9crire des tests unitaires pour nos projets bas\u00e9s sur WordPress.<\/p>\n<p>\u00c0 cette fin, cet article suppose que vous avez lu les articles suivants et suppose que vous avez rattrap\u00e9 une poign\u00e9e d&rsquo;articles pr\u00e9c\u00e9dents\u00a0:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/un-environnement-de-developpement-wordpress-a-laide-dun-gestionnaire-de-packages\/\" title=\"Un environnement de d\u00e9veloppement WordPress (\u00e0 l'aide d'un gestionnaire de packages)\">Un environnement de d\u00e9veloppement WordPress (\u00e0 l&rsquo;aide d&rsquo;un gestionnaire de packages)<\/a><\/strong><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/un-ide-pour-le-developpement-wordpress-independamment-de-lexperience\/\" title=\"Un IDE pour le d\u00e9veloppement WordPress\">Un IDE pour le d\u00e9veloppement WordPress<\/a><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/utilisation-des-parametres-utilisateur-dans-visual-studio-code\/\" title=\"Utilisation des param\u00e8tres utilisateur dans Visual Studio Code\">Utilisation des param\u00e8tres utilisateur dans Visual Studio Code<\/a><\/strong><\/li>\n<\/ol>\n<p>Et, bien s\u00fbr, installer PHPUnit dans Visual Studio Code comme indiqu\u00e9 ci-dessus. Une fois cela fait, nous serons pr\u00eats \u00e0 continuer. Mais une chose \u00e0 garder \u00e0 l&rsquo;esprit est qu&rsquo;il s&rsquo;agira d&rsquo;un cours traditionnel ou complet d&rsquo;\u00e9criture de tests unitaires.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164223-61e760d45682b.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164223-61e760d45682b.png\" alt=\"\u00c9crire des tests unitaires avec PHPUnit, partie 1\u00a0: la configuration\"><\/a><\/p>\n<p>Au lieu de cela, il s&rsquo;agit d&rsquo;\u00e9crire des tests unitaires pour les projets WordPress.<\/p>\n<h2>Tests unitaires avec PHPUnit, partie 1\u00a0: la configuration<\/h2>\n<p>Avant d&rsquo;entrer trop dans les d\u00e9tails, je tiens \u00e0 pr\u00e9ciser qu&rsquo;il ne s&rsquo;agit pas tant d&rsquo;un article sur le d\u00e9veloppement pilot\u00e9 par les tests, mais d&rsquo;un article qui jette les bases de la compr\u00e9hension de l&rsquo;\u00e9criture de tests unitaires. Et puis, finalement, nous travaillerons \u00e0 l&rsquo;\u00e9criture de tests unitaires pour notre code.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164223-61e760d8c4801.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164223-61e760d8c4801.png\" alt=\"\u00c9crire des tests unitaires avec PHPUnit, partie 1\u00a0: la configuration\"><\/a><\/p>\n<p>Pour ceux d&rsquo;entre vous qui ont d\u00e9j\u00e0 lu les tests unitaires, vous savez que l&rsquo;\u00e9criture de tests unitaires est un sujet pour lequel il existe de nombreuses informations et cet article ne tentera pas de couvrir tout cela. Au lieu de cela, il va adopter une approche plus pragmatique pour \u00e9crire des tests unitaires sur des plugins bas\u00e9s sur WordPress, des applications Web, etc.<\/p>\n<h3>1 R\u00e9daction de tests unitaires<\/h3>\n<p><strong>Chaque fois que vous vous lancez dans l&rsquo;\u00e9criture de tests unitaires pour la premi\u00e8re fois, l&rsquo;id\u00e9e des m\u00e9thodes setUp<\/strong> et <strong>tearDown<\/strong> vous sera pr\u00e9sent\u00e9e. Ceci est courant dans <strong><a href=\"https:\/\/phpunit.de\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPUnit<\/a><\/strong> (comme avec d&rsquo;autres frameworks de test). Il y a quelques choses \u00e0 propos de ces deux m\u00e9thodes particuli\u00e8res qui causent souvent des probl\u00e8mes.<\/p>\n<p>En bref, les gens traitent les fonctions comme suit\u00a0:<\/p>\n<ul>\n<li><strong>setUp<\/strong> est comme le constructeur o\u00f9 vous instanciez votre classe, puis vous pr\u00e9parez tout ce dont vous avez besoin pour votre test, y compris l&rsquo;objet \u00e0 tester, les donn\u00e9es n\u00e9cessaires, etc.<\/li>\n<li><strong>tearDown<\/strong> est le destructeur o\u00f9 vous r\u00e9initialisez tout, puis vous d\u00e9barrassez de vos objets. Ceci est g\u00e9n\u00e9ralement plus courant dans les langages compil\u00e9s, mais il ne faut pas non plus le manquer dans PHPUnit.<\/li>\n<\/ul>\n<p>Et m\u00eame si je peux tout \u00e0 fait comprendre cela, ce n&rsquo;est pas toujours le cas. Je parle d&rsquo;exp\u00e9rience ici aussi. Au lieu de cela, c&rsquo;est de l\u00e0 que vient le test unitaire de la phrase r\u00e9elle. Il s&rsquo;agit de tester le code de code des unit\u00e9s et de le faire de mani\u00e8re claire et concise.<\/p>\n<p>Alors, \u00e0 quoi servent ces m\u00e9thodes, de toute fa\u00e7on? Cela peut \u00eatre une habitude particuli\u00e8rement difficile \u00e0 briser ou m\u00eame un mod\u00e8le conceptuel \u00e0 briser lorsque vous vous lancez pour la premi\u00e8re fois dans le processus. \u00c0 cette fin, je souhaite examiner le but de chaque m\u00e9thode, puis comment l&rsquo;aborder lorsque vous travaillez avec des projets bas\u00e9s sur WordPress.<\/p>\n<p>Et, comme d&rsquo;habitude, je m&rsquo;efforcerai de garder cela aussi simple et pragmatique que possible. Je suis beaucoup moins int\u00e9ress\u00e9 par la th\u00e9orie derri\u00e8re certaines choses que par la fa\u00e7on dont cela peut bien servir \u00e0 la fois mon entreprise et mes projets. (Ce n&rsquo;est pas pour \u00e9carter la th\u00e9orie, bien s\u00fbr, mais il y a un temps pas un endroit pour \u00e7a et ce blog n&rsquo;est pas \u00e7a.)<\/p>\n<h3>2 La fonction de configuration<\/h3>\n<p>M\u00eame si je commence par une br\u00e8ve discussion sur la m\u00e9thode <strong>setUp<\/strong>, il est important de garder \u00e0 l&rsquo;esprit que sa fonction s\u0153ur (comme certains la consid\u00e8rent) n&rsquo;est pas toujours n\u00e9cessaire.<\/p>\n<p>Par exemple, si vous \u00e9crivez du code o\u00f9 tout ce que vous faites est d&rsquo;instancier un objet ou un ensemble d&rsquo;objets, la m\u00e9thode <strong>tearDown<\/strong> peut ne pas \u00eatre n\u00e9cessaire. Je reviendrai plus en d\u00e9tail \u00e0 ce sujet dans la section suivante.<\/p>\n<p>Cela dit, disons que vous avez une classe responsable de l&rsquo;ex\u00e9cution d&rsquo;un peu de logique de domaine. Rappelez-vous, pour les besoins de cet article, nous ne sommes pas concern\u00e9s par le code qui fera des choses que WordPress fait naturellement et qui a d\u00e9j\u00e0 son propre ensemble de tests.<\/p>\n<p>Par l\u00e0, je veux dire que nous sommes concern\u00e9s par le code qui fonctionne sp\u00e9cifiquement dans un domaine probl\u00e9matique. Par exemple, nous sommes peut-\u00eatre concern\u00e9s par l&rsquo;\u00e9criture d&rsquo;une classe qui met en cache des donn\u00e9es dans la base de donn\u00e9es. L&rsquo;une des informations responsables de la mise en cache des informations est la dur\u00e9e pendant laquelle les donn\u00e9es doivent \u00eatre mises en cache. Ainsi, un candidat au test unitaire ferait en sorte que nous soyons capables de d\u00e9finir et de modifier la dur\u00e9e, n&rsquo;est-ce pas\u00a0?<\/p>\n<p>Certes, ces donn\u00e9es sont peut-\u00eatre cod\u00e9es en dur, mais \u00e0 titre d&rsquo;exemple, supposons le contraire. Cela implique ce qui suit :<\/p>\n<ul>\n<li>Nous avons une classe qui nous sert de cache,<\/li>\n<li>La classe conserve une donn\u00e9e d&rsquo;instance pendant combien de temps le cache doit \u00eatre d\u00e9fini,<\/li>\n<li>Le temps de cache peut \u00eatre d\u00e9fini \u00e0 partir de classes tierces,<\/li>\n<li>L&rsquo;heure du cache peut \u00eatre lue \u00e0 partir de classes tierces.<\/li>\n<\/ul>\n<p>Cela signifie qu&rsquo;un test unitaire comprendrait\u00a0:<\/p>\n<ol>\n<li>Mise en place de la classe,<\/li>\n<li>D\u00e9finir une valeur,<\/li>\n<li>Affirmer que la valeur qui a \u00e9t\u00e9 d\u00e9finie est comme pr\u00e9vu,,<\/li>\n<li>Modification de la valeur,<\/li>\n<li>L&rsquo;affirmation de la valeur modifi\u00e9e a \u00e9t\u00e9 mise \u00e0 jour.<\/li>\n<\/ol>\n<p>Ainsi, la classe de base peut ressembler <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/248c7741273e6be414c1f98c11085fe7#file-00-acme-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a><\/strong> (toute la documentation \u00e9tant laiss\u00e9e de c\u00f4t\u00e9 dans le but de garder le code aussi concis que possible)\u00a0:<\/p>\n<pre><code>&lt;?php\n\nclass AcmeCache\n{\n    private $duration;\n\n    public function __construct()\n    {\n        $this-&gt;duration = 43200;\n    }\n\n    public function setDuration($duration)\n    {\n        $this-&gt;duration = $duration;\n    }\n\n    public function getDuration()\n    {\n        return $this-&gt;duration;\n    }\n\n    \/\/ More cache code omitted...\n}\n<\/code><\/pre>\n<p>Notez que, par d\u00e9faut, nous avons le temps de cache fix\u00e9 \u00e0 12 heures (en secondes). La classe prend \u00e9galement en charge la possibilit\u00e9 de modifier et de lire la dur\u00e9e.<\/p>\n<p>Cela signifie que nous pouvons \u00e9crire des tests qui testent\u00a0:<\/p>\n<ul>\n<li>si la valeur initiale correspond \u00e0 ce qui \u00e9tait attendu,<\/li>\n<li>si la nouvelle valeur est celle qui \u00e9tait attendue (et qu&rsquo;elle \u00e9crase la valeur initiale)<\/li>\n<\/ul>\n<pre><code>&lt;?php\n\nuse PHPUnitFrameworkTestCase;\n\nclass AcmeCacheTest extends TestCase\n{\n  protected $cache;\n\n  protected function setUp()\n  {\n    $this-&gt;cache = new AcmeCache();\n  }\n\n  public function testDefaultDuration()\n  {\n    $this-&gt;assertTrue($this-&gt;cache-&gt;getDuration() === 43200);\n  }\n\n  public function testNewDuration()\n  {\n    $this-&gt;cache-&gt;setDuration(1000);\n\n    $this-&gt;assertFalse($this-&gt;cache-&gt;getDuration() === 43200);\n    $this-&gt;assertTrue($this-&gt;cache-&gt;getDuration() === 1000);\n  }\n\n  \/\/ More to come...\n}<\/code><\/pre>\n<p>L&rsquo;une des choses que je voudrais souligner dans le code ci-dessus est que vous pouvez lire que chaque test doit avoir une seule assertion alors que <strong>testNewDuration<\/strong> a clairement deux assertions.<\/p>\n<p>J&rsquo;ai tendance \u00e0 prendre l&rsquo;id\u00e9e d&rsquo;une affirmation par test comme une r\u00e8gle empirique. Par exemple, dans ce cas, je veux affirmer que la valeur initiale est \u00e9cras\u00e9e ou stock\u00e9e nulle part et que la nouvelle valeur est stock\u00e9e.<\/p>\n<p>Ce n&rsquo;est peut-\u00eatre pas toujours le cas, vous devrez donc peut-\u00eatre traiter ce type de situation avec pr\u00e9caution.<\/p>\n<p>Comme vous pouvez le voir, cela n&rsquo;a rien \u00e0 voir avec WordPress ; cependant, cela a \u00e0 voir avec la logique de test li\u00e9e sp\u00e9cifiquement au domaine concern\u00e9. A savoir, la dur\u00e9e du cache. Et c&rsquo;est le c\u0153ur des tests unitaires: tester le comportement logique des unit\u00e9s de code pour s&rsquo;assurer que tout fonctionne comme pr\u00e9vu.<\/p>\n<p>Et selon le moment o\u00f9 vous \u00e9crivez ce code, vous pouvez avoir des tests qui \u00e9chouent. Cela peut finalement aider \u00e0 la conception de classe, mais c&rsquo;est un autre sujet et pas celui qui fait partie de ce post.<\/p>\n<h2>Ex\u00e9cution des tests<\/h2>\n<p>Une fois les tests \u00e9crits, il est important de pouvoir les ex\u00e9cuter pour voir s&rsquo;ils r\u00e9ussissent, s&rsquo;ils \u00e9chouent, ce qui r\u00e9ussit et ce qui \u00e9choue. Mais nous n&rsquo;avons pas encore fini. Je veux fournir un aper\u00e7u complet des tests unitaires dans le contexte de WordPress et cela revient \u00e0 discuter de ce que WordPress fournit, de ce qu&rsquo;il ne fait pas, de certaines id\u00e9es fausses et de la fa\u00e7on d&rsquo;ex\u00e9cuter ces tests dans le terminal ou dans Visual Studio Code.<\/p>\n<p>Dans le prochain article de cette s\u00e9rie, nous allons examiner la fonction <strong>tearDown<\/strong> et comment (et quand) l&rsquo;utiliser, quand c&rsquo;est n\u00e9cessaire, quand ce n&rsquo;est pas le cas, puis nous allons examiner un peu l&rsquo;unit\u00e9 tests dans WordPress en g\u00e9n\u00e9ral.<\/p>\n<p>En fin de compte, nous nous effor\u00e7ons d&rsquo;obtenir une image compl\u00e8te de la fa\u00e7on de proc\u00e9der et de la mani\u00e8re de le faire correctement. Mais il est important de jeter les bases de cela et de le faire sur plusieurs postes est plus facile que sur un seul poste monolithique.<\/p>\n<p>Donc, examiner <strong>tearDown()<\/strong>, son utilisation et comment ex\u00e9cuter des tests \u00e0 partir de la ligne de commande sera le sujet du prochain article de cette s\u00e9rie.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un guide pour commencer \u00e0 \u00e9crire des tests PHPUnit en utilisant un cache de base et en utilisant la m\u00e9thode setUp du framework.<\/p>\n","protected":false},"author":1,"featured_media":164224,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[717,801,841],"tags":[1167],"class_list":["post-230302","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpeur","category-php-3","category-tutoriels","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=230302"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230302\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/164224"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}