{"id":229903,"date":"2022-11-29T15:36:00","date_gmt":"2022-11-29T12:36:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229903"},"modified":"2022-11-29T15:37:56","modified_gmt":"2022-11-29T12:37:56","slug":"pisanie-testow-jednostkowych-za-pomoca-phpunit-czesc-3-konfiguracja-xml","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/pisanie-testow-jednostkowych-za-pomoca-phpunit-czesc-3-konfiguracja-xml\/","title":{"rendered":"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 3: Konfiguracja XML"},"content":{"rendered":"\n<p>W poprzednich postach z tej serii om\u00f3wi\u0142em nast\u0119puj\u0105ce dwa tematy:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/pisanie-testow-jednostkowych-za-pomoca-phpunit-czesc-1-konfiguracja\/\" title=\"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 1: Konfiguracja\">Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 1: Konfiguracja<\/a><strong>.<\/strong> Poradnik jak zacz\u0105\u0107 pisa\u0107 testy PHPUnit poprzez u\u017cycie podstawowego cache i metody setUp frameworka.<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/pisanie-testow-jednostkowych-za-pomoca-phpunit-czesc-2-the-tear-down\/\" title=\"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 2: The Tear Down.\">Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 2: The Tear Down.<\/a> Samouczek dotycz\u0105cy pisania test\u00f3w jednostkowych, kt\u00f3re prawid\u0142owo wykorzystuj\u0105 metody setup i tearDown PHPUnit.<\/li>\n<\/ol>\n<p>Ka\u017cdy z powy\u017cszych ma na celu dostarczenie podstaw do rozpocz\u0119cia pisania bardzo podstawowych test\u00f3w jednostkowych. Sprawy mog\u0105 sta\u0107 si\u0119 bardziej z\u0142o\u017cone, zw\u0142aszcza gdy aplikacja lub projekt si\u0119 rozrasta (ale to zawsze prawda, prawda?).<\/p>\n<p>Ale aby upewni\u0107 si\u0119, \u017ce kto\u015b jest na to przygotowany, jest jeden ko\u0144cowy komponent do test\u00f3w jednostkowych, na kt\u00f3rym powinni\u015bmy si\u0119 skupi\u0107, a jest nim zrozumienie pliku konfiguracyjnego PHPUnit XML (kt\u00f3ry mog\u0142e\u015b zobaczy\u0107 w innych projektach jako phpunit.xml).<\/p>\n<h2>Konfiguracja PHPUnit XML<\/h2>\n<p>W tym po\u015bcie zamierzam skonfigurowa\u0107 prosty projekt, kt\u00f3ry u\u017cywa PHPUnit, napisz\u0119 kilka test\u00f3w, takich jak te, kt\u00f3re ju\u017c widzieli\u015bmy, i wykorzystam plik konfiguracyjny do zautomatyzowania testowania.<\/p>\n<p>Co wi\u0119cej, zrobi\u0119 co w mojej mocy, aby jak najlepiej wyja\u015bni\u0107 niezb\u0119dne cz\u0119\u015bci pliku konfiguracyjnego, tak aby\u015b m\u00f3g\u0142 je do\u0142\u0105czy\u0107 do swojego nast\u0119pnego projektu.<\/p>\n<h3>1 Wycinanie plik\u00f3w<\/h3>\n<p>Przed przyst\u0105pieniem do pisania testowalnego kodu wa\u017cne jest, aby zna\u0107 pliki, kt\u00f3re b\u0119d\u0105 potrzebne do uruchomienia procesu.<\/p>\n<p>Oto mniej wi\u0119cej jak <strong><a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">organizujemy<\/a><\/strong> rzeczy od samego pocz\u0105tku projektu:<\/p>\n<ul>\n<li>katalog do test\u00f3w,<\/li>\n<li>plik <strong>phpunit.xml<\/strong> _<\/li>\n<\/ul>\n<p>W ko\u0144cu zobaczysz tak\u017ce:<\/p>\n<ul>\n<li>pliki sk\u0142adaj\u0105ce si\u0119 na projekt,<\/li>\n<li>testy weryfikuj\u0105ce te pliki.<\/li>\n<\/ul>\n<p>W tym momencie jednak przyjrzyjmy si\u0119 plikowi konfiguracyjnemu XML, a nast\u0119pnie spr\u00f3bujmy automatycznie uruchomi\u0107 PHPUnit bez \u017cadnych innych parametr\u00f3w.<\/p>\n<h3>2 Podstawy pliku konfiguracyjnego<\/h3>\n<p>Najpierw sp\u00f3jrzmy na <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-00-phpunit-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">podstawowy plik konfiguracyjny:<\/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>Teraz zrozumiemy, na co dok\u0142adnie patrzymy (poza prostym XML).<\/p>\n<ul>\n<li><strong>phpjednostka<\/strong>. W\u0119ze\u0142 nadrz\u0119dny wykonuje zwyk\u0142e zadanie definiowania schematu dla pliku XML, ale jest kilka innych komponent\u00f3w, kt\u00f3rymi si\u0119 zajmujemy:\n<ul>\n<li><strong>backupGlobalne.<\/strong> W rzeczywisto\u015bci jest to zwi\u0105zane z adnotacj\u0105, kt\u00f3r\u0105 mo\u017cemy umie\u015bci\u0107 w naszym kodzie \u017ar\u00f3d\u0142owym. Globalne to co\u015b, czego powinni\u015bmy unika\u0107 w programowaniu zorientowanym obiektowo, ale je\u015bli zdecydujesz si\u0119 u\u017cy\u0107 kt\u00f3rego\u015b z nich lub b\u0119dziesz musia\u0142 u\u017cy\u0107 kt\u00f3rego\u015b z nich, wtedy powie to PHPUnit aby obs\u0142u\u017cy\u0142 warto\u015bci kt\u00f3re s\u0105 utrzymywane przez zmienne globalne (i da ci opcj\u0119 przywr\u00f3cenia ich). Generalnie zostawiam to bez zmian.<\/li>\n<li><strong>bootstrap.<\/strong> Jest to opcjonalne, ale je\u015bli zdecydujesz si\u0119 do\u0142\u0105czy\u0107 inne pliki do swoich test\u00f3w (np. wprowadzenie biblioteki symulacyjnej, cz\u0119\u015bci WordPressa lub biblioteki innej firmy), to wystarczy, \u017ce okre\u015blisz lokalizacj\u0119 skryptu, kt\u00f3ry musi wykona\u0107. Wy\u015bmiewanie i wprowadzanie WordPressa wykracza poza zakres tego postu, ale prawdopodobnie przyjrzymy si\u0119 temu w przysz\u0142o\u015bci, poniewa\u017c jest to przydatne podczas testowania wtyczek. Na razie do\u0142\u0105cz\u0119 prosty autoloader, kt\u00f3ry zasadniczo dodaje wszystkie pliki w katalogu g\u0142\u00f3wnym katalogu projektu. Pe\u0142ne \u017ar\u00f3d\u0142o zostanie udost\u0119pnione p\u00f3\u017aniej w tym po\u015bcie.<\/li>\n<li><strong>zabarwienie.<\/strong> Je\u015bli chcesz, aby konsola drukowa\u0142a raport z twoich test\u00f3w i robi\u0142a to za pomoc\u0105 kolor\u00f3w (aby u\u0142atwi\u0107 identyfikowanie ostrze\u017ce\u0144, powiadomie\u0144, b\u0142\u0119d\u00f3w itd.), ustaw to na true.<\/li>\n<li>Poni\u017cej podano wszystkie warto\u015bci logiczne. Zalecam ustawienie ich na <strong>prawdziwe<\/strong> w przypadku najbardziej agresywnych mo\u017cliwych raport\u00f3w. W ten spos\u00f3b nie ujdzie ci na sucho zwyk\u0142e prze\u015blizgiwanie si\u0119 powiadomie\u0144 lub ostrze\u017ce\u0144, martwi\u0105c si\u0119 tylko o b\u0142\u0119dy. Jest to bardziej \u0107wiczenie z jako\u015bci kodu ni\u017c cokolwiek innego.\n<ul>\n<li><strong>konwertuj b\u0142\u0119dy na wyj\u0105tki<\/strong><\/li>\n<li><strong>convertNoticesToExceptions<\/strong><\/li>\n<li><strong>konwertuj ostrze\u017cenia na wyj\u0105tki<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>pakiety<\/strong> testowe sk\u0142adaj\u0105 si\u0119 z kolekcji test\u00f3w. Poniewa\u017c dany projekt mo\u017ce mie\u0107 wiele test\u00f3w, wa\u017cne jest, aby ka\u017cdemu pakietowi nada\u0107 unikatow\u0105 nazw\u0119 i odnie\u015b\u0107 si\u0119 do w\u0142a\u015bciwej \u015bcie\u017cki do grupy test\u00f3w. W naszym przyk\u0142adzie b\u0119dziemy mieli tylko jeden zestaw test\u00f3w i znajduje si\u0119 on w katalogu <strong>test\u00f3w<\/strong>.<\/li>\n<li><strong>rejestrowanie<\/strong> to funkcja, kt\u00f3ra mo\u017ce by\u0107 tak prosta, jak drukowanie danych do konsoli lub korzystanie z biblioteki innej firmy (takiej jak <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>) do generowania raport\u00f3w, kt\u00f3re pomagaj\u0105 w ci\u0105g\u0142ej integracji. Poniewa\u017c nie om\u00f3wi\u0142em jeszcze tego ostatniego w \u017cadnym z moich poprzednich post\u00f3w, b\u0119dziemy trzyma\u0107 si\u0119 konsoli jako naszej g\u0142\u00f3wnej metody wyj\u015bcia. Dlatego jedynym wyj\u015bciem logowania jest php <strong>:\/\/stdout<\/strong>.<\/li>\n<\/ul>\n<p>Bior\u0105c to wszystko pod uwag\u0119, nasz plik XML zawiera wszystko, czego PHPUnit potrzebuje do dzia\u0142ania bez \u017cadnych innych parametr\u00f3w.<\/p>\n<p>Pami\u0119taj jednak, \u017ce zanim przejdziesz do dalszej cz\u0119\u015bci tego artyku\u0142u, zak\u0142adam, \u017ce globalnie zainstalowa\u0142e\u015b PHPUnit w swoim systemie za pomoc\u0105 Composera. Je\u015bli nie, zapoznaj si\u0119 z <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/kompozytor-dla-wordpressa-czesc-1\/\" title=\"tym artyku\u0142em\">tym artyku\u0142em<\/a><\/strong>, poniewa\u017c zawiera instrukcje, jak to zrobi\u0107.<\/p>\n<p>Po zako\u0144czeniu mo\u017cesz sprawdzi\u0107, czy PHPUnit jest zainstalowany, wpisuj\u0105c w terminalu nast\u0119puj\u0105ce polecenie:<\/p>\n<pre><code>$ which phpunit<\/code><\/pre>\n<p>Powiniene\u015b zobaczy\u0107 co\u015b takiego:<\/p>\n<\/p>\n<p>Je\u015bli widzisz co\u015b takiego jak powy\u017cej, mo\u017cesz uruchomi\u0107 PHPUnit w dowolnym miejscu swojego systemu.<\/p>\n<h3>3 Plik Bootstrapa<\/h3>\n<p>Zanim przejdziemy dalej, napiszmy podstawowy plik bootstrap. Nazwiemy go <strong>bootstrap.php<\/strong> i umie\u015bcimy w naszym katalogu <strong>test\u00f3w .<\/strong> Obejmuje to <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-01-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">:<\/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>Jest to prosty \u201eautoloader&quot; (kt\u00f3ry z wahaniem nazywam tak, bior\u0105c pod uwag\u0119, \u017ce po prostu iteruje przez pliki i wymaga ich, ale dzia\u0142a dla naszych cel\u00f3w).<\/p>\n<p>W tym momencie skonfigurujmy podstawowy test.<\/p>\n<h3>4 Podstawowy, nieudany test<\/h3>\n<p>Je\u015bli czytasz co\u015b o programowaniu opartym na testach, prawdopodobnie us\u0142yszysz o cyklu czerwony-zielony-powt\u00f3rz. Du\u017co by by\u0142o na ten temat do powiedzenia i polecam <strong><a href=\"http:\/\/blog.cleancoder.com\/uncle-bob\/2014\/12\/17\/TheCyclesOfTDD.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">poczyta\u0107 o tym<\/a><\/strong>, ale nie o to chodzi w tym wpisie.<\/p>\n<p>Zamiast tego jeste\u015bmy bardziej skupieni na pisaniu test\u00f3w, kt\u00f3re pasuj\u0105 do tego, co musimy zrobi\u0107, prawda? Maj\u0105c to na uwadze, wykonajmy nast\u0119puj\u0105ce czynno\u015bci:<\/p>\n<ol>\n<li>utw\u00f3rz katalog, z kt\u00f3rego b\u0119dziesz mia\u0142 kilka podstawowych plik\u00f3w PHP, kt\u00f3re przetestujemy,<\/li>\n<li>w katalogu g\u0142\u00f3wnym, utw\u00f3rz r\u00f3wnie\u017c <strong>phpunit.xml<\/strong> i wype\u0142nij go kodem udost\u0119pnionym wcze\u015bniej w tym po\u015bcie<\/li>\n<li>utw\u00f3rz katalog <strong>test\u00f3w<\/strong>, w kt\u00f3rym umie\u015bcimy nasze testy.<\/li>\n<\/ol>\n<p>Teraz z Terminala zmie\u0144 katalog na katalog projektu (kt\u00f3rego wprawdzie na razie brakuje), a nast\u0119pnie po prostu uruchom <strong>php<em><\/em><\/strong> unit<em><\/em>:<\/p>\n<pre><code>$ phpunit<\/code><\/pre>\n<p>Zak\u0142adaj\u0105c, \u017ce wszystko jest poprawnie skonfigurowane, powiniene\u015b zobaczy\u0107 co\u015b takiego:<\/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=\"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 3: Konfiguracja XML\"><\/a><\/p>\n<p>Poniewa\u017c nie mamy kodu ani test\u00f3w, naturalnie zobaczymy powy\u017csze dane wyj\u015bciowe, prawda? Napiszmy wi\u0119c pojedynczy test, kt\u00f3ry zostanie wykonany (i zako\u0144czy si\u0119 niepowodzeniem), poniewa\u017c nie ma kodu do przetestowania.<\/p>\n<p>Najpierw w katalogu <strong>test\u00f3w<\/strong> utw\u00f3rz plik o nazwie <strong>AcmeCacheTest.php.<\/strong> I niech zrobi co\u015b prostego, jak <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-03-failing-test-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">utworzenie instancji obiektu pami\u0119ci podr\u0119cznej<\/a><\/strong>, kt\u00f3ry ostatecznie utworzymy.<\/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>Przed uruchomieniem testu zwr\u00f3\u0107 uwag\u0119, \u017ce:<\/p>\n<ol>\n<li>Upewnij si\u0119, \u017ce <strong>u\u017cywasz PHPUnitFrameworkTestCase<\/strong><\/li>\n<li>I niech nasza klasa <strong>rozszerzy TestCase<\/strong><\/li>\n<\/ol>\n<p>To jest cz\u0119\u015b\u0107 tego, co sprawia, \u017ce \u200b\u200bkorzystanie z PHPUnit jest tak \u0142atwe. Gdy to zrobisz, uruchom nast\u0119puj\u0105cy kod z katalogu g\u0142\u00f3wnego projektu:<\/p>\n<pre><code>$ phpunit<\/code><\/pre>\n<p>Nast\u0119pnie powiniene\u015b zobaczy\u0107 nast\u0119puj\u0105ce informacje:<\/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=\"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 3: Konfiguracja XML\"><\/a><\/p>\n<p>Zauwa\u017c, \u017ce test zako\u0144czy si\u0119 niepowodzeniem i powie ci, <strong>gdzie<\/strong> znaleziono problem, plik i wiersz.<\/p>\n<p>Aby to naprawi\u0107, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-04-acme-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">musimy napisa\u0107 klas\u0119:<\/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 Kilka podstawowych, zdaj\u0105cych test\u00f3w<\/h3>\n<p>Podstawowy test na zaliczenie (kt\u00f3ry b\u0119dzie oparty na poprzednim kodzie) b\u0119dzie zawiera\u0142:<\/p>\n<ul>\n<li>plik z przestrzeni\u0105 nazw,<\/li>\n<li>b\u0119dzie reprezentowa\u0107 prost\u0105 pami\u0119\u0107 podr\u0119czn\u0105,<\/li>\n<li>zostanie automatycznie za\u0142adowany przez PHPUnit przy u\u017cyciu udost\u0119pnionego powy\u017cej pliku <strong>bootstrap.php<\/strong><\/li>\n<li>i b\u0119dzie mia\u0142 ustawiony czas trwania w swoim konstruktorze wraz z setterem i getterem dla warto\u015bci<\/li>\n<\/ul>\n<p>Najpierw sprawd\u017amy, czy jeste\u015bmy w stanie skonfigurowa\u0107 klas\u0119 i czy nie jest ona pusta. To troch\u0119 niepotrzebne twierdzenie, poniewa\u017c wiemy, \u017ce b\u0119dziemy mie\u0107 poprawnie utworzon\u0105 klas\u0119, ale to wprowadza nas w rowek <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-03-failing-test-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pisania test\u00f3w:<\/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>I uruchom 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=\"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 3: Konfiguracja XML\"><\/a><\/p>\n<p>Nast\u0119pnie sprawd\u017amy, czy ustawiona jest domy\u015blna warto\u015b\u0107 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-05-test-2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pami\u0119ci podr\u0119cznej:<\/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>Podobnie jak w poprzednim kroku, uruchom testy, a teraz powiniene\u015b zobaczy\u0107 dwa pomy\u015blne testy:<\/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=\"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 3: Konfiguracja XML\"><\/a><\/p>\n<p>Na koniec przetestujmy, czy jeste\u015bmy w stanie pomy\u015blnie <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-05-test-3-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zmieni\u0107 warto\u015b\u0107:<\/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>I ostatnie trzy zaliczone testy:<\/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=\"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 3: Konfiguracja XML\"><\/a><\/p>\n<p>I masz to:<\/p>\n<ol>\n<li>plik XML PHPUnit,<\/li>\n<li>prosty bootstrap,<\/li>\n<li>pojedyncza klasa z przestrzeni\u0105 nazw,<\/li>\n<li>testy jednostkowe dla ka\u017cdej metody klasy<\/li>\n<\/ol>\n<p>To prawda, \u017ce \u200b\u200bjest to proste, ale to k\u0142adzie fundamenty pod o wiele wi\u0119cej ni\u017c to, co wiele os\u00f3b ju\u017c robi ze swoimi testami.<\/p>\n<p>Co wi\u0119cej, daje ci co\u015b, na czym mo\u017cesz si\u0119 oprze\u0107, gdy twoje kotlety testowe staj\u0105 si\u0119 silniejsze.<\/p>\n<h2>Czy jest wi\u0119cej? (Zawsze ma racj\u0119?)<\/h2>\n<p>Na koniec, je\u015bli naprawd\u0119 chcesz zag\u0142\u0119bi\u0107 si\u0119 w plik konfiguracyjny, mo\u017cesz przeczyta\u0107 <strong><a href=\"https:\/\/phpunit.de\/manual\/6.5\/en\/appendixes.configuration.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">szczeg\u00f3\u0142owe<\/a><\/strong> wyja\u015bnienie tego podr\u0119cznika.<\/p>\n<p>Zauwa\u017c jednak, \u017ce wszystko, co zosta\u0142o opisane powy\u017cej, ma by\u0107 tym, czego potrzebujesz, aby rozpocz\u0105\u0107 konfigurowanie w\u0142asnego pliku konfiguracyjnego PHPUnit XML.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Podstawowy przewodnik po zrozumieniu pliku konfiguracyjnego PHPUnit XML i jak powi\u0105za\u0107 go z \u0142atwiejszym testowaniem jednostkowym.<\/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":[721,805,845],"tags":[1169],"class_list":["post-229903","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-php-7","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229903","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=229903"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229903\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/163701"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229903"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229903"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229903"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}