{"id":230434,"date":"2022-11-29T15:50:00","date_gmt":"2022-11-29T12:50:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230434"},"modified":"2022-11-29T15:53:53","modified_gmt":"2022-11-29T12:53:53","slug":"ecrire-des-tests-unitaires-avec-phpunit-partie-3-configuration-xml","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/ecrire-des-tests-unitaires-avec-phpunit-partie-3-configuration-xml\/","title":{"rendered":"\u00c9crire des tests unitaires avec PHPUnit, Partie 3\u00a0: Configuration XML"},"content":{"rendered":"\n<p>Dans les articles pr\u00e9c\u00e9dents de cette s\u00e9rie, j&rsquo;ai abord\u00e9 les deux sujets suivants\u00a0:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/ecrire-des-tests-unitaires-avec-phpunit-partie-1-la-configuration\/\" title=\"Ecrire des tests unitaires avec PHPUnit, Partie 1: Le set-up\">Ecrire des tests unitaires avec PHPUnit, Partie 1: Le set-up<\/a><strong>.<\/strong> Un guide pour commencer \u00e0 \u00e9crire des tests PHPUnit en utilisant un cache de base et en utilisant la m\u00e9thode setUp du framework.<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/ecrire-des-tests-unitaires-avec-phpunit-partie-2-le-demontage\/\" title=\"\u00c9crire des tests unitaires avec PHPUnit, partie 2\u00a0: le d\u00e9montage.\">\u00c9crire des tests unitaires avec PHPUnit, partie 2\u00a0: le d\u00e9montage.<\/a> Un tutoriel sur la fa\u00e7on d&rsquo;\u00e9crire des tests unitaires qui exploitent correctement les m\u00e9thodes setUp et tearDown de PHPUnit.<\/li>\n<\/ol>\n<p>Chacun des \u00e9l\u00e9ments ci-dessus est destin\u00e9 \u00e0 fournir une introduction sur la fa\u00e7on de commencer \u00e0 \u00e9crire des tests unitaires tr\u00e8s basiques. Les choses peuvent devenir plus complexes, surtout \u00e0 mesure qu&rsquo;une application ou un projet grandit (mais c&rsquo;est toujours vrai, non\u00a0?).<\/p>\n<p>Mais pour s&rsquo;assurer que l&rsquo;on est pr\u00e9par\u00e9 pour cela, il y a un dernier composant des tests unitaires sur lequel je pense que nous devrions nous concentrer et c&rsquo;est comprendre le fichier de configuration PHPUnit XML (que vous avez peut-\u00eatre vu dans d&rsquo;autres projets comme phpunit.xml).<\/p>\n<h2>Configuration XML de PHPUnit<\/h2>\n<p>Donc, dans cet article, je vais configurer un projet simple qui utilise PHPUnit, \u00e9crit quelques tests comme ceux que nous avons d\u00e9j\u00e0 vus et exploite un fichier de configuration pour automatiser les tests.<\/p>\n<p>De plus, je vais faire ce que je peux pour expliquer au mieux les parties n\u00e9cessaires du fichier de configuration afin que vous puissiez en inclure un dans votre prochain projet.<\/p>\n<h3>1 \u00c9craser les fichiers<\/h3>\n<p>Avant de se lancer dans l&rsquo;\u00e9criture de code testable, il est important de conna\u00eetre les fichiers qui seront n\u00e9cessaires pour faire fonctionner le processus.<\/p>\n<p>Voici, plus ou moins, comment <strong><a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nous<\/a><\/strong> organisons les choses d\u00e8s le d\u00e9but d&rsquo;un projet\u00a0:<\/p>\n<ul>\n<li>un r\u00e9pertoire pour les tests,<\/li>\n<li>le fichier <strong>phpunit.xml<\/strong><\/li>\n<\/ul>\n<p>Finalement, vous verrez \u00e9galement :<\/p>\n<ul>\n<li>les fichiers qui composent le projet,<\/li>\n<li>les tests qui v\u00e9rifient lesdits fichiers.<\/li>\n<\/ul>\n<p>\u00c0 ce stade, cependant, examinons le fichier de configuration XML, puis essayons d&rsquo;ex\u00e9cuter PHPUnit automatiquement sans aucun autre param\u00e8tre.<\/p>\n<h3>2 Les bases du fichier de configuration<\/h3>\n<p>Examinons d&rsquo;abord <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-00-phpunit-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le fichier de configuration de base\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n\n&lt;!-- http:\/\/phpunit.de\/manual\/4.1\/en\/appendixes.configuration.html --&gt;\n&lt;phpunit xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:noNamespaceSchemaLocation=\"http:\/\/schema.phpunit.de\/4.1\/phpunit.xsd\"\n         bootstrap=\".\/tests\/bootstrap.php\"\n         backupGlobals=\"false\"\n         colors=\"true\"\n         convertErrorsToExceptions=\"true\"\n         convertNoticesToExceptions=\"true\"\n         convertWarningsToExceptions=\"true\"\n&gt;\n  &lt;testsuites&gt;\n    &lt;testsuite name=\"AcmeTests\"&gt;\n      &lt;directory&gt;.\/tests&lt;\/directory&gt;\n    &lt;\/testsuite&gt;\n  &lt;\/testsuites&gt;\n\n  &lt;logging&gt;\n    &lt;log type=\"coverage-text\" target=\"php:\/\/stdout\" showUncoveredFiles=\"true\"&gt;&lt;\/log&gt;\n  &lt;\/logging&gt;\n&lt;\/phpunit&gt;\n<\/code><\/pre>\n<p>Comprenons maintenant ce que nous examinons exactement (autre que le simple XML).<\/p>\n<ul>\n<li><strong>unit\u00e9 php<\/strong>. Le n\u0153ud parent fait le travail habituel de d\u00e9finition du sch\u00e9ma pour le fichier XML, mais il y a quelques autres composants qui nous concernent:\n<ul>\n<li><strong>backupGlobals.<\/strong> Ceci est en fait li\u00e9 \u00e0 une annotation que nous pouvons faire dans notre code source. Les variables globales sont quelque chose que nous devrions essayer d&rsquo;\u00e9viter dans la programmation orient\u00e9e objet, mais si vous choisissez d&rsquo;en utiliser une ou avez besoin d&rsquo;en utiliser une, cela indiquera \u00e0 PHPUnit de g\u00e9rer les valeurs que les variables globales maintiennent (et vous donnera la possibilit\u00e9 de restaurer leur). Je laisse g\u00e9n\u00e9ralement cela tel quel.<\/li>\n<li><strong>amorcer.<\/strong> Ceci est facultatif, mais si vous choisissez d&rsquo;inclure d&rsquo;autres fichiers avec vos tests (comme apporter une biblioth\u00e8que moqueuse, une partie de WordPress ou une biblioth\u00e8que tierce), alors cela vous permettra de d\u00e9finir l&#8217;emplacement du script qui doit ex\u00e9cuter. La moquerie et l&rsquo;introduction de WordPress sortent du cadre de cet article, mais c&rsquo;est quelque chose que nous examinerons probablement \u00e0 l&rsquo;avenir car il est utile lors du test de plugins. Pour l&rsquo;instant, j&rsquo;inclurai un simple chargeur automatique qui ajoute essentiellement tous les fichiers \u00e0 la racine du r\u00e9pertoire du projet. La source compl\u00e8te sera partag\u00e9e plus tard dans cet article.<\/li>\n<li><strong>couleurs.<\/strong> Si vous souhaitez que la console imprime un rapport de vos tests et le fasse en utilisant des couleurs (pour aider \u00e0 identifier plus facilement les avertissements, les avis, les erreurs, etc.), d\u00e9finissez-le sur true.<\/li>\n<li>Ce qui suit sont toutes des valeurs bool\u00e9ennes. Je recommande de les d\u00e9finir sur <strong>true<\/strong> pour les rapports les plus agressifs possibles. De cette fa\u00e7on, vous ne vous contenterez pas de faire passer des avis ou des avertissements tout en vous souciant uniquement des erreurs. Il s&rsquo;agit plus d&rsquo;un exercice de qualit\u00e9 de code qu&rsquo;autre chose.\n<ul>\n<li><strong>convertErrorsToExceptions<\/strong><\/li>\n<li><strong>convertNoticesToExceptions<\/strong><\/li>\n<li><strong>convertWarningsToExceptions<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Les suites de tests<\/strong> sont constitu\u00e9es de collections de tests. \u00c9tant donn\u00e9 qu&rsquo;un projet donn\u00e9 peut avoir plusieurs tests, il est important de s&rsquo;assurer que vous donnez \u00e0 chaque suite un nom unique et que vous r\u00e9f\u00e9rencez le chemin d&rsquo;acc\u00e8s appropri\u00e9 au groupe de tests. Pour notre exemple, nous n&rsquo;aurons qu&rsquo;une seule suite de tests et elle se trouve dans le r\u00e9pertoire <strong>tests<\/strong>.<\/li>\n<li><strong>La journalisation<\/strong> est une fonctionnalit\u00e9 qui peut \u00eatre aussi simple que d&rsquo;imprimer des donn\u00e9es dans la console ou d&rsquo;utiliser une biblioth\u00e8que tierce (comme <strong><a href=\"https:\/\/confluence.atlassian.com\/clover\/clover-documentation-home-71598318.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Clover<\/a><\/strong>) pour g\u00e9n\u00e9rer des rapports qui facilitent l&rsquo;int\u00e9gration continue. Comme je n&rsquo;ai pas encore discut\u00e9 de ce dernier dans aucun de mes articles pr\u00e9c\u00e9dents, nous allons nous en tenir \u00e0 la console comme principale m\u00e9thode de sortie. Ainsi, nous avons php <strong>:\/\/stdout<\/strong> comme seule sortie de journalisation.<\/li>\n<\/ul>\n<p>Cela dit, notre fichier XML contient tout ce dont PHPUnit a besoin pour fonctionner sans aucun autre param\u00e8tre.<\/p>\n<p>N&rsquo;oubliez pas, cependant, avant de passer au reste de cet article, je suppose que vous avez globalement install\u00e9 PHPUnit sur votre syst\u00e8me \u00e0 l&rsquo;aide de Composer. Si ce n&rsquo;est pas le cas, consultez <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/compositeur-pour-wordpress-partie-1\/\" title=\"cet article\">cet article<\/a><\/strong> car il vous fournira des instructions sur la fa\u00e7on de le faire.<\/p>\n<p>Une fois cela fait, vous pouvez v\u00e9rifier que PHPUnit est install\u00e9 en saisissant la commande suivante dans votre terminal\u00a0:<\/p>\n<pre><code>$ which phpunit<\/code><\/pre>\n<p>Et vous devriez voir quelque chose comme ceci :<\/p>\n<\/p>\n<p>Si vous voyez quelque chose comme ci-dessus, vous pouvez ex\u00e9cuter PHPUnit n&rsquo;importe o\u00f9 depuis votre syst\u00e8me.<\/p>\n<h3>3 Le fichier d&rsquo;amor\u00e7age<\/h3>\n<p>Avant d&rsquo;aller plus loin, \u00e9crivons un fichier d&rsquo;amor\u00e7age de base. Nous l&rsquo;appellerons <strong>bootstrap.php<\/strong> et le d\u00e9poserons dans notre r\u00e9pertoire de <strong>tests<\/strong>. Il comprendra <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-01-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">les \u00e9l\u00e9ments suivants\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/\/ This array has a single file but could whole the contents of an entire directory.\n$files = [\n    dirname(__DIR__).'\/AcmeCache.php',\n];\n\nforeach ($files as $file) {\n    if (file_exists($file)) {\n        require_once $file;\n    }\n}\n<\/code><\/pre>\n<p>Il s&rsquo;agit d&rsquo;un simple &quot;chargeur automatique&quot; (que je l&rsquo;appelle avec h\u00e9sitation \u00e9tant donn\u00e9 qu&rsquo;il ne fait qu&rsquo;it\u00e9rer dans les fichiers et les exiger, mais cela fonctionne pour nos besoins).<\/p>\n<p>\u00c0 ce stade, mettons en place un test de base.<\/p>\n<h3>4 Un test de base qui \u00e9choue<\/h3>\n<p>Si vous lisez quelque chose sur le d\u00e9veloppement pilot\u00e9 par les tests, vous entendrez probablement parler du cycle de r\u00e9p\u00e9tition rouge-vert. Il y a beaucoup \u00e0 dire \u00e0 ce sujet et je vous recommande <strong><a href=\"http:\/\/blog.cleancoder.com\/uncle-bob\/2014\/12\/17\/TheCyclesOfTDD.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de le lire<\/a><\/strong>, mais ce n&rsquo;est pas le but de cet article.<\/p>\n<p>Au lieu de cela, nous nous concentrons davantage sur l&rsquo;\u00e9criture de tests qui correspondent \u00e0 ce que nous devons faire, n&rsquo;est-ce pas\u00a0? Cela dit, proc\u00e9dons comme suit\u00a0:<\/p>\n<ol>\n<li>cr\u00e9ez un r\u00e9pertoire \u00e0 partir duquel vous allez avoir quelques fichiers PHP de base que nous testerons,<\/li>\n<li>\u00e0 la racine du r\u00e9pertoire, cr\u00e9ez \u00e9galement <strong>phpunit.xml<\/strong> et remplissez-le en utilisant le code partag\u00e9 plus t\u00f4t dans ce post<\/li>\n<li>cr\u00e9er un r\u00e9pertoire de <strong>tests<\/strong> o\u00f9 nous placerons nos tests.<\/li>\n<\/ol>\n<p>Maintenant, depuis le Terminal, changez de r\u00e9pertoire dans le r\u00e9pertoire du projet (ce qui fait certes d\u00e9faut, pour l&rsquo;instant) puis lancez simplement <strong>php<em><\/em><\/strong> unit<em><\/em> :<\/p>\n<pre><code>$ phpunit<\/code><\/pre>\n<p>En supposant que tout est configur\u00e9 correctement, vous devriez voir quelque chose comme ceci :<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e7588ea742f.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-163700-61e7588ea742f.png\" alt=\"\u00c9crire des tests unitaires avec PHPUnit, Partie 3\u00a0: Configuration XML\"><\/a><\/p>\n<p>Puisque nous n&rsquo;avons ni code ni tests, nous allons naturellement voir la sortie ci-dessus, n&rsquo;est-ce pas\u00a0? \u00c9crivons donc un seul test qui s&rsquo;ex\u00e9cutera (et \u00e9chouera) car il n&rsquo;y a pas de code \u00e0 tester.<\/p>\n<p>Tout d&rsquo;abord, dans le r\u00e9pertoire <strong>tests<\/strong>, cr\u00e9ez un fichier appel\u00e9 <strong>AcmeCacheTest.php.<\/strong> Et faisons quelque chose de simple comme <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-03-failing-test-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">instancier un objet cache<\/a><\/strong> que nous cr\u00e9erons \u00e9ventuellement.<\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeTests;\n\nuse PHPUnitFrameworkTestCase;\nuse AcmeAcmeCache;\n\nclass AcmeCacheTest extends TestCase\n{\n    private $cache;\n\n    public function setUp()\n    {\n        $this-&gt;cache = new AcmeCache();\n    }\n\n    public function testCacheExists()\n    {\n        $this-&gt;assertNotNull($this-&gt;cache);\n    }\n}\n<\/code><\/pre>\n<p>Avant d&rsquo;ex\u00e9cuter le test, notez que nous\u00a0:<\/p>\n<ol>\n<li>Assurez-vous d&rsquo; <strong>utiliser PHPUnitFrameworkTestCase<\/strong><\/li>\n<li>Et que notre classe <strong>\u00e9tende TestCase<\/strong><\/li>\n<\/ol>\n<p>Cela fait partie de ce qui rend l&rsquo;utilisation de PHPUnit si facile. Une fois cela fait, ex\u00e9cutez le code suivant \u00e0 partir de la racine de votre projet\u00a0:<\/p>\n<pre><code>$ phpunit<\/code><\/pre>\n<p>Apr\u00e8s cela, vous devriez voir ce qui suit\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e75891b9ec8.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-163700-61e75891b9ec8.png\" alt=\"\u00c9crire des tests unitaires avec PHPUnit, Partie 3\u00a0: Configuration XML\"><\/a><\/p>\n<p>Notez que cela donnera un test d&rsquo;\u00e9chec et il vous indiquera <strong>o\u00f9<\/strong> le probl\u00e8me a \u00e9t\u00e9 trouv\u00e9, le fichier et la ligne.<\/p>\n<p>Pour r\u00e9soudre ce probl\u00e8me, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-04-acme-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nous devons \u00e9crire une classe\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace Acme;\n\nclass AcmeCache\n{\n    private $duration;\n\n    public function __construct()\n    {\n        $this-&gt;duration = 43200;\n    }\n\n    public function setDuration(int $duration)\n    {\n        $this-&gt;duration = $duration;\n    }\n\n    public function getDuration(): int\n    {\n        return $this-&gt;duration;\n    }\n}\n<\/code><\/pre>\n<h3>4 Quelques tests de base et r\u00e9ussis<\/h3>\n<p>Le test de r\u00e9ussite de base (qui sera bas\u00e9 sur le code pr\u00e9c\u00e9dent) comprendra les \u00e9l\u00e9ments suivants\u00a0:<\/p>\n<ul>\n<li>un fichier namespaced,<\/li>\n<li>repr\u00e9sentera un simple cache,<\/li>\n<li>sera automatiquement charg\u00e9 par PHPUnit en utilisant le fichier <strong>bootstrap.php<\/strong> partag\u00e9 ci-dessus<\/li>\n<li>et aura une dur\u00e9e d\u00e9finie dans son constructeur avec un setter et un getter pour la valeur<\/li>\n<\/ul>\n<p>Tout d&rsquo;abord, testons que nous sommes capables de configurer la classe et qu&rsquo;elle n&rsquo;est pas nulle. C&rsquo;est un peu une affirmation inutile puisque nous savons que nous aurons une classe correctement instanci\u00e9e, mais cela nous plonge dans le rythme <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-03-failing-test-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de l&rsquo;\u00e9criture de tests\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeTests;\n\nuse PHPUnitFrameworkTestCase;\nuse AcmeAcmeCache;\n\nclass AcmeCacheTest extends TestCase\n{\n    private $cache;\n\n    public function setUp()\n    {\n        $this-&gt;cache = new AcmeCache();\n    }\n\n    public function testCacheExists()\n    {\n        $this-&gt;assertNotNull($this-&gt;cache);\n    }\n}\n<\/code><\/pre>\n<p>Et lancez le test :<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e75894bbad2.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-163700-61e75894bbad2.png\" alt=\"\u00c9crire des tests unitaires avec PHPUnit, Partie 3\u00a0: Configuration XML\"><\/a><\/p>\n<p>Ensuite, v\u00e9rifions que la valeur par d\u00e9faut du <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-05-test-2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cache est d\u00e9finie\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeTests;\n\nuse PHPUnitFrameworkTestCase;\nuse AcmeAcmeCache;\n\nclass AcmeCacheTest extends TestCase\n{\n    private $cache;\n\n    public function setUp()\n    {\n        $this-&gt;cache = new AcmeCache();\n    }\n\n    public function testCacheExists()\n    {\n        $this-&gt;assertNotNull($this-&gt;cache);\n    }\n\n    public function testDefaultCacheValue()\n    {\n        $this-&gt;assertSame(43200, $this-&gt;cache-&gt;getDuration());\n    }\n}\n<\/code><\/pre>\n<p>Comme pour l&rsquo;\u00e9tape pr\u00e9c\u00e9dente, ex\u00e9cutez les tests et vous devriez maintenant voir deux tests r\u00e9ussis\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e7589770dbe.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-163700-61e7589770dbe.png\" alt=\"\u00c9crire des tests unitaires avec PHPUnit, Partie 3\u00a0: Configuration XML\"><\/a><\/p>\n<p>Enfin, testons pour voir si nous sommes capables de <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-05-test-3-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">changer la valeur avec succ\u00e8s\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeTests;\n\nuse PHPUnitFrameworkTestCase;\nuse AcmeAcmeCache;\n\nclass AcmeCacheTest extends TestCase\n{\n    private $cache;\n\n    public function setUp()\n    {\n        $this-&gt;cache = new AcmeCache();\n    }\n\n    public function testCacheExists()\n    {\n        $this-&gt;assertNotNull($this-&gt;cache);\n    }\n\n    public function testDefaultCacheValue()\n    {\n        $this-&gt;assertSame(43200, $this-&gt;cache-&gt;getDuration());\n    }\n\n    public function testSetCustomDuration()\n    {\n        $duration = 4200;\n\n        $this-&gt;cache-&gt;setDuration($duration);\n        $this-&gt;assertSame($duration, $this-&gt;cache-&gt;getDuration());\n    }\n}\n<\/code><\/pre>\n<p>Et les trois derniers tests de r\u00e9ussite\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e7589a7745a.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-163700-61e7589a7745a.png\" alt=\"\u00c9crire des tests unitaires avec PHPUnit, Partie 3\u00a0: Configuration XML\"><\/a><\/p>\n<p>Et voila:<\/p>\n<ol>\n<li>un Fichier XML PHPUnit,<\/li>\n<li>un simple bootstrap,<\/li>\n<li>une seule classe avec espace de noms,<\/li>\n<li>tests unitaires pour chaque m\u00e9thode de la classe<\/li>\n<\/ol>\n<p>Certes, c&rsquo;est simple, mais cela pose les bases de bien plus que ce que beaucoup de gens font d\u00e9j\u00e0 avec leurs tests.<\/p>\n<p>De plus, cela vous donne quelque chose sur quoi vous appuyer au fur et \u00e0 mesure que vos c\u00f4telettes de test se renforcent.<\/p>\n<h2>Y a t-il plus? (Toujours raison?)<\/h2>\n<p>Enfin, si vous souhaitez vraiment vous plonger dans le fichier de configuration, vous pouvez lire l&rsquo; explication <strong><a href=\"https:\/\/phpunit.de\/manual\/6.5\/en\/appendixes.configuration.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">d\u00e9taill\u00e9e du manuel \u00e0 ce sujet.<\/a><\/strong><\/p>\n<p>Notez, cependant, que tout ce qui est d\u00e9crit ci-dessus vise \u00e0 \u00eatre ce dont vous avez besoin pour commencer \u00e0 configurer votre propre fichier de configuration PHPUnit XML.<\/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 fondamental pour comprendre le fichier de configuration PHPUnit XML et comment le lier \u00e0 des tests unitaires plus faciles.<\/p>\n","protected":false},"author":1,"featured_media":163701,"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-230434","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\/230434","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=230434"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230434\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/163701"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}