{"id":229990,"date":"2022-11-29T16:23:00","date_gmt":"2022-11-29T13:23:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229990"},"modified":"2022-11-29T16:49:17","modified_gmt":"2022-11-29T13:49:17","slug":"skriva-enhetstester-med-phpunit-del-3-xml-konfiguration","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/skriva-enhetstester-med-phpunit-del-3-xml-konfiguration\/","title":{"rendered":"Skriva enhetstester med PHPUnit, del 3: XML-konfiguration"},"content":{"rendered":"\n<p>I de tidigare inl\u00e4ggen i den h\u00e4r serien har jag tagit upp f\u00f6ljande tv\u00e5 \u00e4mnen:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/skriva-enhetstester-med-phpunit-del-1-installationen\/\" title=\"Att skriva enhetstester med PHPUnit, del 1: Konfigurationen\">Att skriva enhetstester med PHPUnit, del 1: Konfigurationen<\/a><strong>.<\/strong> En guide f\u00f6r att komma ig\u00e5ng med att skriva PHPUnit-tester genom att anv\u00e4nda en grundl\u00e4ggande cache och anv\u00e4nda ramverkets setUp-metod.<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/att-skriva-enhetstester-med-phpunit-del-2-the-tear-down\/\" title=\"Att skriva enhetstester med PHPUnit, del 2: The Tear Down.\">Att skriva enhetstester med PHPUnit, del 2: The Tear Down.<\/a> En handledning om hur man skriver enhetstester som korrekt utnyttjar installations- och nedtagningsmetoderna f\u00f6r PHPUnit.<\/li>\n<\/ol>\n<p>Vart och ett av ovanst\u00e5ende \u00e4r t\u00e4nkt att ge en primer f\u00f6r hur man kommer ig\u00e5ng med att skriva mycket grundl\u00e4ggande enhetstester. Saker och ting kan bli mer komplexa, s\u00e4rskilt n\u00e4r en applikation eller ett projekt v\u00e4xer (men det \u00e4r alltid sant, eller hur?).<\/p>\n<p>Men f\u00f6r att se till att man \u00e4r f\u00f6rberedd p\u00e5 det finns det en sista komponent i enhetstestning som jag tror att vi b\u00f6r fokusera p\u00e5 och det \u00e4r att f\u00f6rst\u00e5 PHPUnit XML Configuration File (som du kanske har sett i andra projekt som phpunit.xml).<\/p>\n<h2>PHPUnit XML-konfiguration<\/h2>\n<p>S\u00e5 i det h\u00e4r inl\u00e4gget ska jag st\u00e4lla in ett enkelt projekt som anv\u00e4nder PHPUnit, skriver n\u00e5gra tester som de vi redan har sett och anv\u00e4nder en konfigurationsfil f\u00f6r att automatisera testning.<\/p>\n<p>Dessutom ska jag g\u00f6ra vad jag kan f\u00f6r att p\u00e5 b\u00e4sta s\u00e4tt f\u00f6rklara de n\u00f6dv\u00e4ndiga delarna av konfigurationsfilen s\u00e5 att du kan inkludera en i ditt n\u00e4sta projekt.<\/p>\n<h3>1 Stubba ut filerna<\/h3>\n<p>Innan du b\u00f6rjar skriva testbar kod \u00e4r det viktigt att veta vilka filer som kommer att beh\u00f6vas f\u00f6r att f\u00e5 processen att fungera.<\/p>\n<p>F\u00f6ljande \u00e4r, mer eller mindre, hur <strong><a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vi<\/a><\/strong> organiserar saker fr\u00e5n b\u00f6rjan av ett projekt:<\/p>\n<ul>\n<li>en katalog f\u00f6r tester,<\/li>\n<li>filen <strong>phpunit.xml<\/strong> _<\/li>\n<\/ul>\n<p>S\u00e5 sm\u00e5ningom kommer du ocks\u00e5 att se:<\/p>\n<ul>\n<li>filerna som utg\u00f6r projektet,<\/li>\n<li>testerna som verifierar n\u00e4mnda filer.<\/li>\n<\/ul>\n<p>Men nu ska vi ta en titt p\u00e5 XML-konfigurationsfilen och sedan f\u00f6rs\u00f6ka k\u00f6ra PHPUnit automatiskt utan n\u00e5gra andra parametrar.<\/p>\n<h3>2 Grunderna f\u00f6r konfigurationsfilen<\/h3>\n<p>L\u00e5t oss f\u00f6rst titta p\u00e5 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-00-phpunit-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den grundl\u00e4ggande konfigurationsfilen:<\/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>L\u00e5t oss nu f\u00f6rst\u00e5 exakt vad vi tittar p\u00e5 (annat \u00e4n enkel XML).<\/p>\n<ul>\n<li><strong>phpunit<\/strong>. Den \u00f6verordnade noden g\u00f6r det vanliga jobbet med att definiera schemat f\u00f6r XML-filen, men det finns n\u00e5gra andra komponenter som vi \u00e4r angel\u00e4gna om:\n<ul>\n<li><strong>backupGlobals.<\/strong> Detta \u00e4r faktiskt relaterat till en anteckning som vi kan g\u00f6ra i v\u00e5r k\u00e4llkod. Globaler \u00e4r n\u00e5got vi b\u00f6r f\u00f6rs\u00f6ka undvika i objektorienterad programmering, men om du v\u00e4ljer att anv\u00e4nda en eller beh\u00f6ver anv\u00e4nda en, kommer detta att ber\u00e4tta f\u00f6r PHPUnit att hantera de v\u00e4rden som de globala variablerna uppr\u00e4tth\u00e5ller (och ger dig m\u00f6jlighet att \u00e5terst\u00e4lla dem). Jag l\u00e4mnar i allm\u00e4nhet detta som det \u00e4r.<\/li>\n<li><strong>bootstrap.<\/strong> Detta \u00e4r valfritt, men om du v\u00e4ljer att inkludera andra filer i dina tester (som att ta in ett h\u00e5nbibliotek, en del av WordPress eller ett bibliotek fr\u00e5n tredje part), s\u00e5 kommer detta att vara allt du beh\u00f6ver f\u00f6r att definiera platsen f\u00f6r skriptet som m\u00e5ste K\u00f6r. Att h\u00e5na och ta in WordPress ligger utanf\u00f6r omfattningen av det h\u00e4r inl\u00e4gget men det \u00e4r n\u00e5got vi troligen kommer att titta p\u00e5 i framtiden eftersom det \u00e4r anv\u00e4ndbart n\u00e4r man testar plugins. F\u00f6r tillf\u00e4llet kommer jag att inkludera en enkel autoloader som i princip l\u00e4gger till alla filer i roten av projektkatalogen. Den fullst\u00e4ndiga k\u00e4llan till det kommer att delas senare i detta inl\u00e4gg.<\/li>\n<li><strong>f\u00e4rger.<\/strong> Om du vill att konsolen ska skriva ut en rapport \u00f6ver dina tester och g\u00f6ra det med f\u00e4rger (f\u00f6r att l\u00e4ttare kunna identifiera varningar, meddelanden, fel och s\u00e5 vidare), st\u00e4ll sedan in detta p\u00e5 sant.<\/li>\n<li>F\u00f6ljande \u00e4r alla booleska v\u00e4rden. Jag rekommenderar att st\u00e4lla in dem till <strong>sanna<\/strong> f\u00f6r de mest aggressiva rapporterna som m\u00f6jligt. P\u00e5 s\u00e5 s\u00e4tt kommer du inte undan med att bara l\u00e5ta meddelanden eller varningar glida igenom samtidigt som du bara oroar dig f\u00f6r fel. Detta \u00e4r mer en \u00f6vning i kodkvalitet \u00e4n n\u00e5got annat.\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>testsviter<\/strong> best\u00e5r av samlingar av tester. Eftersom ett givet projekt kan ha flera tester, \u00e4r det viktigt att se till att du ger varje svit ett unikt namn och refererar till den r\u00e4tta s\u00f6kv\u00e4gen till gruppen av tester. F\u00f6r v\u00e5rt exempel kommer vi bara att ha en enda testsvit och den finns i <strong>testkatalogen<\/strong>.<\/li>\n<li><strong>loggning<\/strong> \u00e4r en funktion som kan vara s\u00e5 enkel som att skriva ut data i konsolen eller anv\u00e4nda ett tredjepartsbibliotek (som <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>) f\u00f6r att generera rapporter som hj\u00e4lper till med kontinuerlig integration. Eftersom jag \u00e4nnu inte har diskuterat det senare i n\u00e5got av mina tidigare inl\u00e4gg, kommer vi att h\u00e5lla fast vid konsolen som v\u00e5r huvudsakliga utmatningsmetod. S\u00e5ledes har vi php <strong>:\/\/stdout<\/strong> som v\u00e5r enda loggningsutg\u00e5ng.<\/li>\n<\/ul>\n<p>Med allt detta sagt har v\u00e5r XML-fil allt som PHPUnit beh\u00f6ver f\u00f6r att k\u00f6ras utan n\u00e5gra andra parametrar.<\/p>\n<p>Kom dock ih\u00e5g att innan du forts\u00e4tter genom resten av den h\u00e4r artikeln, antar jag att du globalt har installerat PHPUnit p\u00e5 ditt system med hj\u00e4lp av Composer. Om inte, l\u00e4s <strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/kompositoer-foer-wordpress-del-1\/\" title=\"den h\u00e4r artikeln\">den h\u00e4r artikeln<\/a><\/strong> eftersom den ger dig instruktioner om hur du g\u00f6r det.<\/p>\n<p>N\u00e4r du \u00e4r klar kan du verifiera att PHPUnit \u00e4r installerat genom att ange f\u00f6ljande kommando i din terminal:<\/p>\n<pre><code>$ which phpunit<\/code><\/pre>\n<p>Och du b\u00f6r se n\u00e5got i stil med f\u00f6ljande:<\/p>\n<\/p>\n<p>Om du ser n\u00e5got liknande ovan, kan du k\u00f6ra PHPUnit var som helst fr\u00e5n ditt system.<\/p>\n<h3>3 Bootstrap-filen<\/h3>\n<p>Innan vi g\u00e5r vidare, l\u00e5t oss skriva en grundl\u00e4ggande bootstrap-fil. Vi kallar det <strong>bootstrap.php<\/strong> och sl\u00e4pper det i v\u00e5r <strong>testkatalog<\/strong>. Det kommer att inneh\u00e5lla <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-01-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6ljande:<\/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>Det h\u00e4r \u00e4r en enkel &quot;autoloader&quot; (som jag tveksamt kallar det s\u00e5 med tanke p\u00e5 att det bara itererar igenom filer och kr\u00e4ver dem, men det fungerar f\u00f6r v\u00e5ra syften).<\/p>\n<p>L\u00e5t oss nu st\u00e4lla in ett grundl\u00e4ggande test.<\/p>\n<h3>4 Ett grundl\u00e4ggande, underk\u00e4nd test<\/h3>\n<p>Om du l\u00e4ser n\u00e5got om testdriven utveckling kommer du sannolikt att f\u00e5 h\u00f6ra om en r\u00f6d-gr\u00f6n-upprepa cykel. Det finns mycket att s\u00e4ga om det och jag rekommenderar att du <strong><a href=\"http:\/\/blog.cleancoder.com\/uncle-bob\/2014\/12\/17\/TheCyclesOfTDD.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l\u00e4ser p\u00e5 det<\/a><\/strong>, men det \u00e4r inte syftet med det h\u00e4r inl\u00e4gget.<\/p>\n<p>Ist\u00e4llet \u00e4r vi mer fokuserade p\u00e5 att faktiskt skriva tester som matchar det vi beh\u00f6ver g\u00f6ra, eller hur? S\u00e5 med det sagt, l\u00e5t oss g\u00f6ra f\u00f6ljande:<\/p>\n<ol>\n<li>skapa en katalog d\u00e4r du kommer att ha n\u00e5gra grundl\u00e4ggande PHP-filer som vi testar,<\/li>\n<li>i roten av katalogen, skapa \u00e4ven <strong>phpunit.xml<\/strong> och fyll i den med koden som delas tidigare i det h\u00e4r inl\u00e4gget<\/li>\n<li>skapa en <strong>testkatalog<\/strong> d\u00e4r vi placerar v\u00e5ra tester.<\/li>\n<\/ol>\n<p>Nu, fr\u00e5n terminalen, byt katalog till projektets katalog (som visserligen saknas f\u00f6r tillf\u00e4llet) och k\u00f6r sedan helt enkelt <strong>php<em><\/em><\/strong> unit<em><\/em>:<\/p>\n<pre><code>$ phpunit<\/code><\/pre>\n<p>F\u00f6rutsatt att allt \u00e4r korrekt inst\u00e4llt b\u00f6r du se n\u00e5got i stil med detta:<\/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=\"Skriva enhetstester med PHPUnit, del 3: XML-konfiguration\"><\/a><\/p>\n<p>Eftersom vi inte har n\u00e5gon kod och inga tester, kommer vi naturligtvis att se utdata ovan, eller hur? S\u00e5 l\u00e5t oss skriva ett enda test som kommer att k\u00f6ras (och misslyckas) eftersom det inte finns n\u00e5gon kod som det faktiskt kan testa.<\/p>\n<p>Skapa f\u00f6rst en fil som heter AcmeCacheTest.php i <strong>testkatalogen<\/strong><strong>.<\/strong> Och l\u00e5t oss f\u00e5 det att g\u00f6ra n\u00e5got enkelt som att <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-03-failing-test-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">instansiera ett cacheobjekt<\/a><\/strong> som vi s\u00e5 sm\u00e5ningom kommer att skapa.<\/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>Innan du k\u00f6r testet, l\u00e4gg m\u00e4rke till att vi:<\/p>\n<ol>\n<li>Se till att <strong>anv\u00e4nda PHPUnitFrameworkTestCase<\/strong><\/li>\n<li>Och l\u00e5t v\u00e5r klass <strong>ut\u00f6ka TestCase<\/strong><\/li>\n<\/ol>\n<p>Detta \u00e4r en del av det som g\u00f6r det s\u00e5 enkelt att anv\u00e4nda PHPUnit. N\u00e4r det \u00e4r gjort, k\u00f6r f\u00f6ljande kod fr\u00e5n roten av ditt projekt:<\/p>\n<pre><code>$ phpunit<\/code><\/pre>\n<p>Efter det b\u00f6r du se f\u00f6ljande:<\/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=\"Skriva enhetstester med PHPUnit, del 3: XML-konfiguration\"><\/a><\/p>\n<p>Observera att detta kommer att ge ett underk\u00e4nt test och det kommer att ber\u00e4tta <strong>var<\/strong> problemet hittades, filen och raden.<\/p>\n<p>F\u00f6r att fixa detta <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-04-acme-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">m\u00e5ste vi skriva en klass:<\/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 N\u00e5gra grundl\u00e4ggande, godk\u00e4nda test<\/h3>\n<p>Det grundl\u00e4ggande godk\u00e4nda testet (som kommer att baseras p\u00e5 tidigare kod) kommer att inneh\u00e5lla f\u00f6ljande:<\/p>\n<ul>\n<li>en namnavgr\u00e4nsad fil,<\/li>\n<li>kommer att representera en enkel cache,<\/li>\n<li>kommer automatiskt att laddas av PHPUnit med hj\u00e4lp av filen <strong>bootstrap.php<\/strong> som delas ovan<\/li>\n<li>och kommer att ha en varaktighet inst\u00e4lld i sin konstruktor tillsammans med en setter och getter f\u00f6r v\u00e4rdet<\/li>\n<\/ul>\n<p>L\u00e5t oss f\u00f6rst testa att vi kan st\u00e4lla in klassen och att den inte \u00e4r null. Detta \u00e4r lite av ett on\u00f6digt p\u00e5st\u00e5ende eftersom vi vet att vi kommer att ha en klass korrekt instansierad, men det f\u00e5r oss in i sp\u00e5ret <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-03-failing-test-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">med att skriva tester:<\/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>Och k\u00f6r testet:<\/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=\"Skriva enhetstester med PHPUnit, del 3: XML-konfiguration\"><\/a><\/p>\n<p>L\u00e5t oss sedan verifiera att standardv\u00e4rdet f\u00f6r <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-05-test-2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cachen \u00e4r inst\u00e4llt:<\/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>Som med f\u00f6reg\u00e5ende steg, k\u00f6r testerna, och du b\u00f6r nu se tv\u00e5 godk\u00e4nda test:<\/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=\"Skriva enhetstester med PHPUnit, del 3: XML-konfiguration\"><\/a><\/p>\n<p>Slutligen, l\u00e5t oss testa f\u00f6r att se om vi lyckas <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-05-test-3-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e4ndra v\u00e4rdet:<\/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>Och de tre sista godk\u00e4nda testerna:<\/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=\"Skriva enhetstester med PHPUnit, del 3: XML-konfiguration\"><\/a><\/p>\n<p>Och d\u00e4r har du det:<\/p>\n<ol>\n<li>en PHPUnit XML-fil,<\/li>\n<li>en enkel bootstrap,<\/li>\n<li>en enda klass med namnavst\u00e5nd,<\/li>\n<li>enhetstester f\u00f6r varje metod i klassen<\/li>\n<\/ol>\n<p>Visst, det \u00e4r enkelt, men detta l\u00e4gger grunden f\u00f6r s\u00e5 mycket mer \u00e4n vad m\u00e5nga m\u00e4nniskor redan g\u00f6r med sina tester.<\/p>\n<p>Dessutom ger det dig n\u00e5got att bygga p\u00e5 n\u00e4r dina testkotletter v\u00e4xer sig starkare.<\/p>\n<h2>Finns det mer? (Alltid r\u00e4tt?)<\/h2>\n<p>Slutligen, om du \u00e4r sugen p\u00e5 att verkligen dyka in i konfigurationsfilen, kan du l\u00e4sa manualens <strong><a href=\"https:\/\/phpunit.de\/manual\/6.5\/en\/appendixes.configuration.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">djupg\u00e5ende<\/a><\/strong> f\u00f6rklaring av den.<\/p>\n<p>Observera dock att allt som beskrivs ovan syftar till att vara det du beh\u00f6ver f\u00f6r att komma ig\u00e5ng med att s\u00e4tta upp din egen PHPUnit XML-konfigurationsfil.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En grundl\u00e4ggande guide f\u00f6r att f\u00f6rst\u00e5 PHPUnit XML-konfigurationsfilen och hur man kopplar den till enklare enhetstestning.<\/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":[848,807,724],"tags":[1173],"class_list":["post-229990","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-php-9","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229990","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=229990"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229990\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/163701"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=229990"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=229990"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=229990"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}