{"id":229750,"date":"2022-11-26T11:59:00","date_gmt":"2022-11-26T08:59:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229750"},"modified":"2022-11-26T12:02:22","modified_gmt":"2022-11-26T09:02:22","slug":"pisanie-testow-jednostkowych-za-pomoca-phpunit-czesc-1-konfiguracja","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/pisanie-testow-jednostkowych-za-pomoca-phpunit-czesc-1-konfiguracja\/","title":{"rendered":"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 1: Konfiguracja"},"content":{"rendered":"\n<p>Na pocz\u0105tku tego miesi\u0105ca zacz\u0119li\u015bmy przygl\u0105da\u0107 si\u0119 instalacji <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/instalowanie-phpunit-w-visual-studio-code\/\" title=\"PHPUnit w Visual Studio Code\">PHPUnit w Visual Studio Code<\/a><\/strong>, a ostatecznym celem jest nauczenie si\u0119 pisania test\u00f3w jednostkowych dla naszych projekt\u00f3w opartych na WordPressie.<\/p>\n<p>W tym celu ten post zak\u0142ada, \u017ce \u200b\u200bprzeczyta\u0142e\u015b nast\u0119puj\u0105ce posty i zak\u0142ada, \u017ce \u200b\u200bnadrobi\u0142e\u015b kilka poprzednich post\u00f3w:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/srodowisko-programistyczne-wordpress-przy-uzyciu-menedzera-pakietow\/\" title=\"\u015arodowisko programistyczne WordPress (przy u\u017cyciu mened\u017cera pakiet\u00f3w)\">\u015arodowisko programistyczne WordPress (przy u\u017cyciu mened\u017cera pakiet\u00f3w)<\/a><\/strong><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/ide-do-programowania-wordpress-niezaleznie-od-doswiadczenia\/\" title=\"IDE do programowania WordPress\">IDE do programowania WordPress<\/a><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/praca-z-ustawieniami-uzytkownika-w-visual-studio-code\/\" title=\"Praca z ustawieniami u\u017cytkownika w Visual Studio Code\">Praca z ustawieniami u\u017cytkownika w Visual Studio Code<\/a><\/strong><\/li>\n<\/ol>\n<p>I oczywi\u015bcie zainstalowanie PHPUnit w Visual Studio Code, jak link powy\u017cej. Gdy to zrobisz, b\u0119dziemy gotowi do kontynuowania. Nale\u017cy jednak pami\u0119ta\u0107, \u017ce b\u0119dzie to tradycyjny lub kompleksowy kurs pisania test\u00f3w jednostkowych.<\/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=\"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 1: Konfiguracja\"><\/a><\/p>\n<p>Zamiast tego chodzi o pisanie test\u00f3w jednostkowych dla projekt\u00f3w WordPress.<\/p>\n<h2>Testy jednostkowe z PHPUnit, cz\u0119\u015b\u0107 1: Konfiguracja<\/h2>\n<p>Zanim zag\u0142\u0119bi\u0119 si\u0119 w to zbyt g\u0142\u0119boko, chc\u0119 wyja\u015bni\u0107, \u017ce nie jest to post po\u015bwi\u0119cony programowaniu opartemu na testach, ale post, kt\u00f3ry k\u0142adzie podwaliny pod zrozumienie pisania test\u00f3w jednostkowych. A potem, ostatecznie, b\u0119dziemy pracowa\u0107 nad pisaniem test\u00f3w jednostkowych dla naszego kodu.<\/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=\"Pisanie test\u00f3w jednostkowych za pomoc\u0105 PHPUnit, cz\u0119\u015b\u0107 1: Konfiguracja\"><\/a><\/p>\n<p>Dla tych z was, kt\u00f3rzy wcze\u015bniej czytali testy jednostkowe, wiedz\u0105, \u017ce pisanie test\u00f3w jednostkowych to temat, na kt\u00f3ry jest du\u017co informacji, a ten post nie b\u0119dzie pr\u00f3bowa\u0142 tego wszystkiego om\u00f3wi\u0107. Zamiast tego przyjmie bardziej pragmatyczne podej\u015bcie do pisania test\u00f3w jednostkowych dla wtyczek opartych na WordPressie, aplikacji internetowych i tym podobnych.<\/p>\n<h3>1 Pisanie test\u00f3w jednostkowych<\/h3>\n<p>Za ka\u017cdym razem, gdy po raz pierwszy zaczniesz pisa\u0107 testy jednostkowe, zobaczysz zar\u00f3wno ide\u0119 metody <strong>setup<\/strong>, jak i metody <strong>tearDown<\/strong>. Jest to powszechne w <strong><a href=\"https:\/\/phpunit.de\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPUnit<\/a><\/strong> (podobnie jak w innych frameworkach testowych). Jest kilka rzeczy dotycz\u0105cych tych dw\u00f3ch konkretnych metod, kt\u00f3re cz\u0119sto powoduj\u0105 problemy.<\/p>\n<p>Kr\u00f3tko m\u00f3wi\u0105c, ludzie traktuj\u0105 funkcje w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<ul>\n<li><strong>setUp<\/strong> jest jak konstruktor, w kt\u00f3rym tworzysz instancj\u0119 swojej klasy, a nast\u0119pnie przygotowujesz wszystko, czego potrzebujesz do testu, w tym testowany obiekt, potrzebne dane i tak dalej.<\/li>\n<li><strong>tearDown<\/strong> to destruktor, w kt\u00f3rym resetujesz wszystko, a nast\u0119pnie usuwasz swoje obiekty. Jest to zwykle bardziej powszechne w j\u0119zykach kompilowanych, ale nie mo\u017cna tego pomin\u0105\u0107 r\u00f3wnie\u017c w PHPUnit.<\/li>\n<\/ul>\n<p>I chocia\u017c ca\u0142kowicie to rozumiem, nie zawsze tak jest. M\u00f3wi\u0119 tu te\u017c z do\u015bwiadczenia. Zamiast tego, st\u0105d pochodzi faktyczne testowanie jednostek fraz. Chodzi o testowanie kodu jednostek i robienie tego w przejrzysty, zwi\u0119z\u0142y spos\u00f3b.<\/p>\n<p>Po co wi\u0119c te metody? Mo\u017ce to by\u0107 szczeg\u00f3lnie trudny do z\u0142amania nawyk, a nawet model koncepcyjny do zerwania, gdy po raz pierwszy wchodzisz w proces. W tym celu chc\u0119 zbada\u0107 cel ka\u017cdej metody, a nast\u0119pnie jak podej\u015b\u0107 do tego podczas pracy z projektami opartymi na WordPressie.<\/p>\n<p>I jak zwykle postaram si\u0119, aby by\u0142o to jak najprostsze i pragmatyczne. Znacznie mniej interesuje mnie teoria kryj\u0105ca si\u0119 za pewnymi rzeczami, ni\u017c to, jak mo\u017ce ona dobrze s\u0142u\u017cy\u0107 zar\u00f3wno mojej firmie, jak i moim projektom. (Oczywi\u015bcie nie chodzi o pomini\u0119cie teorii, ale nie ma na to czasu, a ten blog nie jest tym.)<\/p>\n<h3>2 Funkcja konfiguracji<\/h3>\n<p>Chocia\u017c zaczynam od kr\u00f3tkiego om\u00f3wienia metody <strong>konfiguracji<\/strong>, wa\u017cne jest, aby pami\u0119ta\u0107, \u017ce jej siostrzana funkcja (jak uwa\u017caj\u0105 niekt\u00f3rzy) nie zawsze jest potrzebna.<\/p>\n<p>Na przyk\u0142ad, je\u015bli piszesz kod, w kt\u00f3rym wszystko, co robisz, to tworzenie wyst\u0105pienia obiektu lub zestawu obiekt\u00f3w, metoda <strong>tearDown<\/strong> mo\u017ce nie by\u0107 potrzebna. Om\u00f3wi\u0119 to bardziej szczeg\u00f3\u0142owo w nast\u0119pnej sekcji.<\/p>\n<p>Powiedziawszy to, za\u0142\u00f3\u017cmy, \u017ce masz klas\u0119, kt\u00f3ra jest odpowiedzialna za wykonanie troch\u0119 logiki domeny. Pami\u0119taj, \u017ce na potrzeby tego posta nie zajmujemy si\u0119 kodem, kt\u00f3ry b\u0119dzie robi\u0142 rzeczy, kt\u00f3re WordPress robi naturalnie i kt\u00f3ry ma ju\u017c w\u0142asny zestaw test\u00f3w.<\/p>\n<p>Rozumiem przez to, \u017ce zajmujemy si\u0119 kodem, kt\u00f3ry dzia\u0142a konkretnie w problematycznej domenie. Na przyk\u0142ad, by\u0107 mo\u017ce zajmujemy si\u0119 pisaniem klasy, kt\u00f3ra buforuje dane w bazie danych. Jedn\u0105 z informacji odpowiedzialnych za buforowanie informacji jest to, jak d\u0142ugo dane powinny by\u0107 buforowane. Tak wi\u0119c kandydat do testu jednostkowego m\u00f3g\u0142by za pomoc\u0105 tego, \u017ce jeste\u015bmy w stanie ustawi\u0107 i zmieni\u0107 ilo\u015b\u0107 czasu, prawda?<\/p>\n<p>To prawda, \u017ce \u200b\u200bby\u0107 mo\u017ce te dane s\u0105 zakodowane na sztywno, ale dla cel\u00f3w przyk\u0142adu za\u0142\u00f3\u017cmy, \u017ce jest inaczej. Oznacza to, co nast\u0119puje:<\/p>\n<ul>\n<li>Mamy klas\u0119, kt\u00f3ra s\u0142u\u017cy jako nasza pami\u0119\u0107 podr\u0119czna,<\/li>\n<li>Klasa przechowuje fragment danych instancji, jak d\u0142ugo powinien by\u0107 ustawiony cache,<\/li>\n<li>Czas pami\u0119ci podr\u0119cznej mo\u017cna ustawi\u0107 z zaj\u0119\u0107 innych firm,<\/li>\n<li>Czas pami\u0119ci podr\u0119cznej mo\u017cna odczyta\u0107 z zaj\u0119\u0107 innych firm.<\/li>\n<\/ul>\n<p>Oznacza to, \u017ce test jednostkowy obejmowa\u0142by:<\/p>\n<ol>\n<li>Za\u0142o\u017cenie klasy,<\/li>\n<li>Definiowanie warto\u015bci,<\/li>\n<li>Stwierdzenie, \u017ce zdefiniowana warto\u015b\u0107 jest zgodna z oczekiwaniami,<\/li>\n<li>Zmiana warto\u015bci,<\/li>\n<li>Zaktualizowano warto\u015b\u0107, kt\u00f3ra zosta\u0142a zmieniona.<\/li>\n<\/ol>\n<p>Tak wi\u0119c podstawowa klasa mo\u017ce wygl\u0105da\u0107 mniej wi\u0119cej <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/248c7741273e6be414c1f98c11085fe7#file-00-acme-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a><\/strong> (ca\u0142a dokumentacja jest pomini\u0119ta poza klas\u0105 w celu zachowania mo\u017cliwie zwi\u0119z\u0142ego kodu):<\/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>Zauwa\u017c, \u017ce domy\u015blnie mamy ustawiony czas pami\u0119ci podr\u0119cznej na 12 godzin (w sekundach). Zaj\u0119cia wspieraj\u0105 r\u00f3wnie\u017c umiej\u0119tno\u015b\u0107 zmiany i odczytywania czasu trwania.<\/p>\n<p>Oznacza to, \u017ce mo\u017cemy pisa\u0107 testy, kt\u00f3re testuj\u0105:<\/p>\n<ul>\n<li>je\u015bli warto\u015b\u0107 pocz\u0105tkowa jest taka, jak oczekiwano,<\/li>\n<li>czy nowa warto\u015b\u0107 jest zgodna z oczekiwaniami (i czy zast\u0119puje warto\u015b\u0107 pocz\u0105tkow\u0105)<\/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>Jedn\u0105 z rzeczy, na kt\u00f3re chcia\u0142bym zwr\u00f3ci\u0107 uwag\u0119 w powy\u017cszym kodzie, jest to, \u017ce mo\u017cesz przeczyta\u0107, \u017ce ka\u017cdy test powinien mie\u0107 pojedyncz\u0105 asercj\u0119, podczas gdy <strong>testNewDuration<\/strong> ma wyra\u017anie dwie asercje.<\/p>\n<p>Zwykle przyjmuj\u0119 ide\u0119 jednego stwierdzenia na test jako praktyczn\u0105 regu\u0142\u0119. Na przyk\u0142ad w tym przypadku chc\u0119 zapewni\u0107, \u017ce warto\u015b\u0107 pocz\u0105tkowa jest nadpisywana lub nie jest nigdzie przechowywana, a nowa warto\u015b\u0107 jest przechowywana.<\/p>\n<p>Jednak nie zawsze tak jest, wi\u0119c mo\u017ce by\u0107 konieczne ostro\u017cne traktowanie tego rodzaju sytuacji.<\/p>\n<p>Jak wida\u0107, nie ma to nic wsp\u00f3lnego z WordPress; ma to jednak zwi\u0105zek z logik\u0105 testowania zwi\u0105zan\u0105 konkretnie z dan\u0105 domen\u0105. Mianowicie czas trwania pami\u0119ci podr\u0119cznej. I na tym w\u0142a\u015bnie polega sedno testowania jednostkowego: testowanie logicznego zachowania jednostek kodu, aby upewni\u0107 si\u0119, \u017ce wszystko dzia\u0142a zgodnie z oczekiwaniami.<\/p>\n<p>I w zale\u017cno\u015bci od tego, kiedy piszesz ten kod, mo\u017cesz mie\u0107 nieudane testy. Mo\u017ce to ostatecznie pom\u00f3c w projektowaniu klas, ale to inny temat, a nie ten, kt\u00f3ry jest cz\u0119\u015bci\u0105 tego postu.<\/p>\n<h2>Przeprowadzanie test\u00f3w<\/h2>\n<p>Gdy testy zostan\u0105 napisane, wa\u017cne jest, aby m\u00f3c je wykona\u0107, aby sprawdzi\u0107, czy zdaj\u0105, czy nie, co si\u0119 sprawdza, a co nie. Ale jeszcze nie sko\u0144czyli\u015bmy. Chc\u0119 przedstawi\u0107 kompleksowe spojrzenie na testy jednostkowe w kontek\u015bcie WordPress, a to dotyczy om\u00f3wienia tego, co zapewnia WordPress, a czego nie, niekt\u00f3rych b\u0142\u0119dnych przekona\u0144 i jak uruchomi\u0107 te testy w terminalu lub w Visual Studio Code.<\/p>\n<p>W nast\u0119pnym po\u015bcie z tej serii przyjrzymy si\u0119 funkcji <strong>tearDown<\/strong> i jak (i \u200b\u200bkiedy) jej u\u017cywa\u0107, kiedy jest potrzebna, a kiedy nie, a nast\u0119pnie przyjrzymy si\u0119 bli\u017cej jednostce og\u00f3lnie testowanie w WordPressie.<\/p>\n<p>Ostatecznie pracujemy nad uzyskaniem pe\u0142nego obrazu tego, jak to zrobi\u0107 i jak zrobi\u0107 to dobrze. Ale wa\u017cne jest, aby po\u0142o\u017cy\u0107 pod tym podstaw\u0119, a zrobienie tego na kilku s\u0142upkach jest \u0142atwiejsze ni\u017c w przypadku jednego s\u0142upka monolitycznego.<\/p>\n<p>Tak wi\u0119c zbadanie <strong>tearDown()<\/strong>, jego zastosowania i sposobu wykonywania test\u00f3w z wiersza polece\u0144 b\u0119dzie tematem nast\u0119pnego wpisu z tej serii.<\/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>Poradnik jak zacz\u0105\u0107 pisa\u0107 testy PHPUnit poprzez u\u017cycie podstawowego cache i metody setUp frameworka.<\/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":[721,805,845],"tags":[1169],"class_list":["post-229750","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\/229750","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=229750"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229750\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/164224"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229750"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229750"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229750"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}