{"id":230483,"date":"2022-11-26T12:15:00","date_gmt":"2022-11-26T09:15:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230483"},"modified":"2022-11-26T12:17:16","modified_gmt":"2022-11-26T09:17:16","slug":"kirjoitusyksikkoetestit-phpunitilla-osa-1-asennus","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/kirjoitusyksikkoetestit-phpunitilla-osa-1-asennus\/","title":{"rendered":"Kirjoitusyksikk\u00f6testit PHPUnitilla, Osa 1: Asennus"},"content":{"rendered":"\n<p>Aiemmin t\u00e4ss\u00e4 kuussa aloimme <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/phpunitin-asentaminen-visual-studio-codessa\/\" title=\"harkita PHPUnitin asentamista Visual Studio Codeen\">harkita PHPUnitin asentamista Visual Studio Codeen<\/a><\/strong> lopullisena tavoitteenamme oppia kirjoittamaan yksikk\u00f6testej\u00e4 WordPress-pohjaisille projekteillemme.<\/p>\n<p>T\u00e4t\u00e4 varten t\u00e4ss\u00e4 viestiss\u00e4 oletetaan, ett\u00e4 olet lukenut seuraavat viestit ja ett\u00e4 olet lukenut kourallisen aikaisempia viestej\u00e4:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-kehitysympaeristoe-kaeyttaemaellae-paketinhallintaa\/\" title=\"WordPress-kehitysymp\u00e4rist\u00f6 (k\u00e4ytt\u00e4m\u00e4ll\u00e4 paketinhallintaa)\">WordPress-kehitysymp\u00e4rist\u00f6 (k\u00e4ytt\u00e4m\u00e4ll\u00e4 paketinhallintaa)<\/a><\/strong><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/ide-wordpressin-kehittaemiseen-kokemuksesta-riippumatta\/\" title=\"IDE WordPressin kehitt\u00e4miseen\">IDE WordPressin kehitt\u00e4miseen<\/a><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/kaeyttaejaeasetusten-kaeyttaeminen-visual-studio-codessa\/\" title=\"K\u00e4ytt\u00e4j\u00e4asetusten k\u00e4ytt\u00e4minen Visual Studio Codessa\">K\u00e4ytt\u00e4j\u00e4asetusten k\u00e4ytt\u00e4minen Visual Studio Codessa<\/a><\/strong><\/li>\n<\/ol>\n<p>Ja tietysti PHPUnitin asentaminen Visual Studio Codessa yll\u00e4 olevan linkin mukaisesti. Kun se on tehty, olemme valmiita jatkamaan. Mutta yksi asia on pidett\u00e4v\u00e4 mieless\u00e4, ett\u00e4 t\u00e4m\u00e4 ilta on perinteinen tai kattava yksikk\u00f6kokeiden kirjoittamisen kurssi.<\/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=\"Kirjoitusyksikk\u00f6testit PHPUnitilla, Osa 1: Asennus\"><\/a><\/p>\n<p>Sen sijaan kyse on yksikk\u00f6testien kirjoittamisesta WordPress-projekteille.<\/p>\n<h2>Yksikk\u00f6testit PHPUnitilla, Osa 1: Asennus<\/h2>\n<p>Ennen kuin menen liian syv\u00e4lle t\u00e4h\u00e4n, haluan tehd\u00e4 selv\u00e4ksi, ett\u00e4 t\u00e4m\u00e4 ei ole niink\u00e4\u00e4n testivetoisen kehityksen postaus, vaan postaus, joka luo pohjan kirjoitusyksikk\u00f6testien ymm\u00e4rt\u00e4miselle. Ja sitten viime k\u00e4dess\u00e4 pyrimme kirjoittamaan koodillemme yksikk\u00f6testej\u00e4.<\/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=\"Kirjoitusyksikk\u00f6testit PHPUnitilla, Osa 1: Asennus\"><\/a><\/p>\n<p>Niille teist\u00e4, jotka ovat aiemmin lukeneet yksikk\u00f6testauksesta, tied\u00e4tte, ett\u00e4 yksikk\u00f6testien kirjoittaminen on aihe, josta on paljon tietoa, eik\u00e4 t\u00e4m\u00e4 viesti yrit\u00e4 kattaa kaikkea sit\u00e4. Sen sijaan se ottaa pragmaattisemman l\u00e4hestymistavan yksikk\u00f6testien kirjoittamiseen WordPress-pohjaisia \u200b\u200blaajennuksia, verkkosovelluksia ja vastaavia vastaan.<\/p>\n<h3>1 kirjoitusyksikk\u00f6testit<\/h3>\n<p>Aina kun aloitat yksikk\u00f6testien kirjoittamisen, sinulle esitet\u00e4\u00e4n sek\u00e4 idea <strong>setUp-<\/strong> ett\u00e4 <strong>tearDown-<\/strong> menetelmist\u00e4. T\u00e4m\u00e4 on yleist\u00e4 <strong><a href=\"https:\/\/phpunit.de\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPUnitissa<\/a><\/strong> (kuten muissakin testauskehyksiss\u00e4). N\u00e4iss\u00e4 kahdessa menetelm\u00e4ss\u00e4 on muutamia asioita, jotka usein aiheuttavat ongelmia.<\/p>\n<p>Lyhyesti sanottuna ihmiset k\u00e4sittelev\u00e4t toimintoja seuraavasti:<\/p>\n<ul>\n<li><strong>setUp<\/strong> on kuin konstruktori, jossa luot luokkasi ja valmistelet sitten kaiken, mit\u00e4 tarvitset testi\u00e4 varten, mukaan lukien testattava objekti, tarvittavat tiedot ja niin edelleen.<\/li>\n<li><strong>tearDown<\/strong> on tuhoaja, jossa nollaat kaiken ja h\u00e4vit\u00e4t sitten esineesi. T\u00e4m\u00e4 on yleens\u00e4 yleisemp\u00e4\u00e4 k\u00e4\u00e4nnetyill\u00e4 kielill\u00e4, mutta sit\u00e4 ei kannata j\u00e4tt\u00e4\u00e4 v\u00e4liin my\u00f6s PHPUnitissa.<\/li>\n<\/ul>\n<p>Ja vaikka ymm\u00e4rr\u00e4n t\u00e4m\u00e4n t\u00e4ysin, se ei aina ole niin. Puhun t\u00e4\u00e4ll\u00e4kin kokemuksesta. Sen sijaan varsinainen lauseyksikk\u00f6testaus tulee t\u00e4st\u00e4. Kyse on yksik\u00f6iden koodikoodin testaamisesta ja sen tekemisest\u00e4 puhtaalla, ytimekk\u00e4\u00e4ll\u00e4 tavalla.<\/p>\n<p>Joten mit\u00e4 varten n\u00e4m\u00e4 menetelm\u00e4t ovat? T\u00e4m\u00e4 voi olla erityisen vaikea murtaa tapa tai jopa k\u00e4sitteellinen malli, joka voi olla murrettavissa, kun olet ensimm\u00e4ist\u00e4 kertaa mukana prosessissa. T\u00e4t\u00e4 varten haluan tarkastella kunkin menetelm\u00e4n tarkoitusta ja sitten sit\u00e4, kuinka l\u00e4hesty\u00e4 t\u00e4t\u00e4 ty\u00f6skennelless\u00e4ni WordPress-pohjaisten projektien kanssa.<\/p>\n<p>Ja kuten tavallista, pyrin pit\u00e4m\u00e4\u00e4n t\u00e4m\u00e4n mahdollisimman yksinkertaisena ja pragmaattisena. Olen paljon v\u00e4hemm\u00e4n kiinnostunut tiettyjen asioiden taustalla olevasta teoriasta kuin siit\u00e4, kuinka se palvelee hyvin sek\u00e4 liiketoimintaani ett\u00e4 projektejani. (T\u00e4m\u00e4 ei tietenk\u00e4\u00e4n ole teorian v\u00e4h\u00e4ttely\u00e4, mutta sille on aika, ei paikka, eik\u00e4 t\u00e4m\u00e4 blogi ole sit\u00e4.)<\/p>\n<h3>2 Asetustoiminto<\/h3>\n<p>Vaikka aloitan lyhyell\u00e4 keskustelulla <strong>setUp<\/strong> -menetelm\u00e4st\u00e4, on t\u00e4rke\u00e4\u00e4 pit\u00e4\u00e4 mieless\u00e4, ett\u00e4 sen sisartoimintoa (jotenkin mielest\u00e4) ei aina tarvita.<\/p>\n<p>Jos esimerkiksi kirjoitat koodia, jossa vain luot objektin tai objektijoukon, <strong>tearDown-<\/strong> menetelm\u00e4\u00e4 ei ehk\u00e4 tarvita. K\u00e4sittelen t\u00e4t\u00e4 tarkemmin seuraavassa osiossa.<\/p>\n<p>Oletetaan, ett\u00e4 sinulla on luokka, joka on vastuussa verkkotunnuksen logiikan suorittamisesta. Muista, ett\u00e4 t\u00e4m\u00e4n viestin tarkoituksia varten emme ole huolissamme koodista, joka tekee asioita, joita WordPress tekee luonnollisesti ja jolla on jo omat testins\u00e4.<\/p>\n<p>T\u00e4ll\u00e4 tarkoitan, ett\u00e4 olemme huolissamme koodista, joka toimii nimenomaan ongelma-alueella. Esimerkiksi ehk\u00e4 olemme huolissamme luokan kirjoittamisesta, joka tallentaa tiedot v\u00e4limuistiin tietokantaan. Yksi tiedoista, jotka vastaavat tietojen tallentamisesta v\u00e4limuistiin, on se, kuinka kauan tietojen tulee olla v\u00e4limuistissa. Siten ehdokas yksikk\u00f6testiin k\u00e4ytt\u00e4isi sit\u00e4, ett\u00e4 voimme asettaa ja muuttaa ajan, eik\u00f6 niin?<\/p>\n<p>My\u00f6nnett\u00e4k\u00f6\u00f6n, ehk\u00e4 n\u00e4m\u00e4 tiedot ovat kovakoodattuja, mutta esimerkiksi oletetaan toisin. T\u00e4m\u00e4 tarkoittaa seuraavaa:<\/p>\n<ul>\n<li>Meill\u00e4 on luokka, joka toimii v\u00e4limuistina,<\/li>\n<li>Luokka yll\u00e4pit\u00e4\u00e4 ilmentym\u00e4tietoa niin kauan kuin v\u00e4limuisti tulee asettaa,<\/li>\n<li>V\u00e4limuistin aika voidaan asettaa kolmannen osapuolen luokista,<\/li>\n<li>V\u00e4limuistin aika voidaan lukea kolmannen osapuolen luokista.<\/li>\n<\/ul>\n<p>T\u00e4m\u00e4 tarkoittaa, ett\u00e4 yksikk\u00f6testi sis\u00e4lt\u00e4\u00e4:<\/p>\n<ol>\n<li>Luokan perustaminen,<\/li>\n<li>arvon m\u00e4\u00e4ritt\u00e4minen,<\/li>\n<li>Vahvistaa, ett\u00e4 m\u00e4\u00e4ritetty arvo on odotetusti,<\/li>\n<li>Arvon muuttaminen,<\/li>\n<li>Muutetun arvon vahvistaminen p\u00e4ivitettiin.<\/li>\n<\/ol>\n<p>Perusluokka voi siis n\u00e4ytt\u00e4\u00e4 suunnilleen <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/248c7741273e6be414c1f98c11085fe7#file-00-acme-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4<\/a><\/strong> (kaikki dokumentaatio j\u00e4tet\u00e4\u00e4n luokasta pois, jotta koodi pysyisi mahdollisimman ytimekk\u00e4\u00e4n\u00e4):<\/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>Huomaa, ett\u00e4 oletuksena v\u00e4limuistin ajaksi on asetettu 12 tuntia (sekunneissa). Tunti tukee kyky\u00e4 sek\u00e4 muuttaa ett\u00e4 lukea kestoa.<\/p>\n<p>T\u00e4m\u00e4 tarkoittaa, ett\u00e4 voimme kirjoittaa testej\u00e4, jotka testaavat:<\/p>\n<ul>\n<li>jos alkuper\u00e4inen arvo on odotettu,<\/li>\n<li>jos uusi arvo on odotettu (ja ett\u00e4 se korvaa alkuper\u00e4isen arvon)<\/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>Yksi asia, jonka haluan korostaa yll\u00e4 olevassa koodissa, on se, ett\u00e4 voit lukea, ett\u00e4 jokaisessa testiss\u00e4 pit\u00e4isi olla yksi v\u00e4ite, kun taas <strong>testNewDurationissa<\/strong> on selv\u00e4sti kaksi v\u00e4itett\u00e4.<\/p>\n<p>Minulla on tapana pit\u00e4\u00e4 ajatusta yhdest\u00e4 v\u00e4itteest\u00e4 testi\u00e4 kohti peukalos\u00e4\u00e4nt\u00f6n\u00e4. Esimerkiksi t\u00e4ss\u00e4 tapauksessa haluan vakuuttaa, ett\u00e4 alkuper\u00e4inen arvo kirjoitetaan p\u00e4\u00e4lle tai sit\u00e4 ei tallenneta minnek\u00e4\u00e4n ja uusi arvo tallennetaan.<\/p>\n<p>N\u00e4in ei kuitenkaan aina ole, joten saatat joutua k\u00e4sittelem\u00e4\u00e4n t\u00e4m\u00e4ntyyppisi\u00e4 tilanteita varoen.<\/p>\n<p>Kuten n\u00e4et, t\u00e4ll\u00e4 ei ole mit\u00e4\u00e4n tekemist\u00e4 WordPressin kanssa; se liittyy kuitenkin testauslogiikkaan, joka liittyy erityisesti kyseiseen verkkotunnukseen. Nimitt\u00e4in v\u00e4limuistin kesto. T\u00e4m\u00e4 on yksikk\u00f6testauksen ydin: koodiyksik\u00f6iden loogisen toiminnan testaaminen varmistaaksemme, ett\u00e4 asiat toimivat odotetulla tavalla.<\/p>\n<p>Ja riippuen siit\u00e4, milloin kirjoitat t\u00e4m\u00e4n koodin, sinulla voi olla ep\u00e4onnistuneita testej\u00e4. T\u00e4m\u00e4 voi viime k\u00e4dess\u00e4 auttaa luokan suunnittelussa, mutta se on toinen aihe, joka ei ole osa t\u00e4t\u00e4 viesti\u00e4.<\/p>\n<h2>Testien suorittaminen<\/h2>\n<p>Kun testit on kirjoitettu, on t\u00e4rke\u00e4\u00e4 pysty\u00e4 suorittamaan ne, jotta n\u00e4et, l\u00e4p\u00e4isev\u00e4tk\u00f6 ne, ep\u00e4onnistuvatko, mik\u00e4 l\u00e4p\u00e4isee ja mik\u00e4 ei. Mutta emme ole viel\u00e4 valmiita. Haluan tarjota kattavan katsauksen yksikk\u00f6testaukseen WordPressin kontekstissa, ja t\u00e4ss\u00e4 keskustellaan siit\u00e4, mit\u00e4 WordPress tarjoaa, mit\u00e4 se ei, joitain v\u00e4\u00e4rink\u00e4sityksi\u00e4 ja kuinka n\u00e4m\u00e4 testit suoritetaan p\u00e4\u00e4tteess\u00e4 tai Visual Studio Codessa.<\/p>\n<p>T\u00e4m\u00e4n sarjan seuraavassa postauksessa tarkastelemme <strong>tearDown-<\/strong> toimintoa ja kuinka (ja milloin) sit\u00e4 k\u00e4ytet\u00e4\u00e4n, milloin sit\u00e4 tarvitaan, milloin ei, ja sitten tarkastellaan hieman yksik\u00f6n ymp\u00e4rill\u00e4. testaus WordPressiss\u00e4 yleens\u00e4.<\/p>\n<p>Viime k\u00e4dess\u00e4 pyrimme saamaan t\u00e4ydellisen kuvan siit\u00e4, kuinka t\u00e4m\u00e4 tehd\u00e4\u00e4n ja miten se tehd\u00e4\u00e4n oikein. Mutta sille on t\u00e4rke\u00e4\u00e4 luoda perusta, ja sen tekeminen muutaman pylv\u00e4\u00e4n aikana on helpompaa kuin yhdess\u00e4 monoliittisessa pylv\u00e4\u00e4ss\u00e4.<\/p>\n<p>Joten <strong>tearDown()<\/strong> :n tutkiminen, sen k\u00e4ytt\u00f6 ja testien suorittaminen komentorivilt\u00e4 on t\u00e4m\u00e4n sarjan seuraavan postauksen aihe.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Opas PHPUnit-testien kirjoittamisen aloittamiseen perusv\u00e4limuistin ja kehyksen setUp-menetelm\u00e4n avulla.<\/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":[719,843,803],"tags":[1166],"class_list":["post-230483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-opetusohjelmia","category-php-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230483"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230483\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/164224"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}