{"id":229887,"date":"2022-11-26T12:33:00","date_gmt":"2022-11-26T09:33:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229887"},"modified":"2022-11-26T12:37:15","modified_gmt":"2022-11-26T09:37:15","slug":"skriva-enhetstester-med-phpunit-del-1-installationen","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/skriva-enhetstester-med-phpunit-del-1-installationen\/","title":{"rendered":"Skriva enhetstester med PHPUnit, del 1: Installationen"},"content":{"rendered":"\n<p>Tidigare denna m\u00e5nad b\u00f6rjade vi titta p\u00e5 att installera <strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/installera-phpunit-i-visual-studio-code\/\" title=\"PHPUnit i Visual Studio Code\">PHPUnit i Visual Studio Code<\/a><\/strong> med det slutliga m\u00e5let att l\u00e4ra sig hur man skriver enhetstester f\u00f6r v\u00e5ra WordPress-baserade projekt.<\/p>\n<p>F\u00f6r detta \u00e4ndam\u00e5l f\u00f6ruts\u00e4tter det h\u00e4r inl\u00e4gget att du har l\u00e4st f\u00f6ljande inl\u00e4gg och det f\u00f6ruts\u00e4tter att du har kommit ikapp med en handfull tidigare inl\u00e4gg:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/en-wordpress-utvecklingsmiljoe-med-en-pakethanterare\/\" title=\"En WordPress-utvecklingsmilj\u00f6 (med en pakethanterare)\">En WordPress-utvecklingsmilj\u00f6 (med en pakethanterare)<\/a><\/strong><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/en-ide-foer-wordpress-utveckling-oavsett-erfarenhet\/\" title=\"En IDE f\u00f6r WordPress-utveckling\">En IDE f\u00f6r WordPress-utveckling<\/a><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/arbeta-med-anvaendarinstaellningar-i-visual-studio-code\/\" title=\"Arbeta med anv\u00e4ndarinst\u00e4llningar i Visual Studio Code\">Arbeta med anv\u00e4ndarinst\u00e4llningar i Visual Studio Code<\/a><\/strong><\/li>\n<\/ol>\n<p>Och, naturligtvis, installera PHPUnit i Visual Studio Code enligt l\u00e4nken ovan. N\u00e4r det \u00e4r gjort \u00e4r vi redo att forts\u00e4tta. Men en sak att t\u00e4nka p\u00e5 \u00e4r att det h\u00e4r kv\u00e4llen blir en traditionell eller en omfattande kurs i att skriva enhetsprov.<\/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=\"Skriva enhetstester med PHPUnit, del 1: Installationen\"><\/a><\/p>\n<p>Ist\u00e4llet handlar det om att skriva enhetstester f\u00f6r WordPress-projekt.<\/p>\n<h2>Enhetstest med PHPUnit, del 1: Konfigurationen<\/h2>\n<p>Innan jag g\u00e5r f\u00f6r djupt in p\u00e5 det h\u00e4r vill jag vara tydlig med att det h\u00e4r inte s\u00e5 mycket \u00e4r ett inl\u00e4gg i testdriven utveckling utan ett inl\u00e4gg som l\u00e4gger grunden f\u00f6r att f\u00f6rst\u00e5 att skriva enhetstester. Och sedan, i slut\u00e4ndan, kommer vi att arbeta f\u00f6r att skriva enhetstester f\u00f6r v\u00e5r kod.<\/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=\"Skriva enhetstester med PHPUnit, del 1: Installationen\"><\/a><\/p>\n<p>F\u00f6r de av er som har l\u00e4st n\u00e5got tidigare om enhetstestning s\u00e5 vet ni att skriva enhetstester \u00e4r ett \u00e4mne som det finns mycket information om och det h\u00e4r inl\u00e4gget kommer inte att f\u00f6rs\u00f6ka t\u00e4cka allt detta. Ist\u00e4llet kommer det att ta ett mer pragmatiskt tillv\u00e4gag\u00e5ngss\u00e4tt f\u00f6r att skriva enhetstester mot WordPress-baserade plugins, webbapplikationer och liknande.<\/p>\n<h3>1 Skriva enhetstester<\/h3>\n<p>N\u00e4r du f\u00f6rst b\u00f6rjar skriva enhetstester kommer du att presenteras med b\u00e5de id\u00e9n om <strong>installations-<\/strong> och <strong>nedtagningsmetoderna<\/strong>. Detta \u00e4r vanligt i <strong><a href=\"https:\/\/phpunit.de\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPUnit<\/a><\/strong> (som med andra testramar). Det finns n\u00e5gra saker med dessa tv\u00e5 s\u00e4rskilda metoder som ofta orsakar problem.<\/p>\n<p>Kort sagt, m\u00e4nniskor behandlar funktionerna s\u00e5 h\u00e4r:<\/p>\n<ul>\n<li><strong>setUp<\/strong> \u00e4r som konstruktorn d\u00e4r du instansierar din klass och sedan f\u00f6rbereder du allt du beh\u00f6ver f\u00f6r ditt test inklusive objektet som ska testas, den data som beh\u00f6vs och s\u00e5 vidare.<\/li>\n<li><strong>tearDown<\/strong> \u00e4r f\u00f6rst\u00f6raren d\u00e4r du \u00e5terst\u00e4ller allt och sedan g\u00f6r dig av med dina f\u00f6rem\u00e5l. Detta \u00e4r vanligtvis vanligare i kompilerade spr\u00e5k men det \u00e4r inte heller att missa inom PHPUnit.<\/li>\n<\/ul>\n<p>Och \u00e4ven om jag fullt ut kan f\u00f6rst\u00e5 detta s\u00e5 \u00e4r det inte alltid s\u00e5. Jag talar av erfarenhet h\u00e4r ocks\u00e5. Ist\u00e4llet \u00e4r det h\u00e4r sj\u00e4lva frasenhetstestningen kommer ifr\u00e5n. Det handlar om att testa enheters kodkod och att g\u00f6ra det p\u00e5 ett rent, kortfattat s\u00e4tt.<\/p>\n<p>S\u00e5 vad \u00e4r dessa metoder f\u00f6r n\u00e5got? Detta kan vara en s\u00e4rskilt sv\u00e5r vana att bryta eller till och med konceptuell modell att bryta n\u00e4r du f\u00f6rst kommer in i processen. F\u00f6r det \u00e4ndam\u00e5let vill jag unders\u00f6ka syftet med varje metod och sedan hur man kan n\u00e4rma sig detta n\u00e4r man arbetar med WordPress-baserade projekt.<\/p>\n<p>Och som vanligt kommer jag att str\u00e4va efter att h\u00e5lla detta s\u00e5 enkelt och pragmatiskt som m\u00f6jligt. Jag \u00e4r mycket mindre intresserad av teorin bakom vissa saker \u00e4n jag \u00e4r av hur den kan tj\u00e4na b\u00e5de min verksamhet och mina projekt v\u00e4l. (Detta \u00e4r naturligtvis inte f\u00f6r att bortse fr\u00e5n teori, men det finns en tid inte en plats f\u00f6r det och den h\u00e4r bloggen \u00e4r inte det.)<\/p>\n<h3>2 Inst\u00e4llningsfunktionen<\/h3>\n<p>\u00c4ven om jag b\u00f6rjar med en kort diskussion om <strong>setUp-<\/strong> metoden, \u00e4r det viktigt att komma ih\u00e5g att dess systerfunktion (som vissa anser det) inte alltid beh\u00f6vs.<\/p>\n<p>Till exempel, om du skriver kod d\u00e4r allt du g\u00f6r \u00e4r att instansiera ett objekt eller en upps\u00e4ttning objekt, kanske inte <strong>tearDown- metoden beh\u00f6vs.<\/strong> Jag kommer att g\u00e5 in mer i detalj om detta i n\u00e4sta avsnitt.<\/p>\n<p>Med det sagt, l\u00e5t oss s\u00e4ga att du har en klass som \u00e4r ansvarig f\u00f6r att k\u00f6ra lite dom\u00e4nlogik. Kom ih\u00e5g att i detta inl\u00e4ggs syfte \u00e4r vi inte oroliga f\u00f6r kod som g\u00f6r saker som WordPress g\u00f6r naturligt och som redan har sin egen upps\u00e4ttning tester.<\/p>\n<p>Med det menar jag att vi \u00e4r oroliga f\u00f6r kod som fungerar specifikt inom en problemdom\u00e4n. Till exempel kanske vi \u00e4r intresserade av att skriva en klass som cachar data till databasen. En av de delar av information som \u00e4r ansvarig f\u00f6r cachelagring av information \u00e4r hur l\u00e4nge data ska vara cache. S\u00e5ledes skulle en kandidat f\u00f6r enhetstestet g\u00f6ra med att vi kan st\u00e4lla in och \u00e4ndra tiden, eller hur?<\/p>\n<p>Visserligen \u00e4r denna data kanske h\u00e5rdkodad, men f\u00f6r exempel, l\u00e5t oss anta n\u00e5got annat. Detta inneb\u00e4r f\u00f6ljande:<\/p>\n<ul>\n<li>Vi har en klass som fungerar som v\u00e5r cache,<\/li>\n<li>Klassen uppr\u00e4tth\u00e5ller en bit av instansdata f\u00f6r hur l\u00e4nge cachen ska vara inst\u00e4lld,<\/li>\n<li>Cachetiden kan st\u00e4llas in fr\u00e5n tredjepartsklasser,<\/li>\n<li>Cachetiden kan l\u00e4sas fr\u00e5n tredjepartsklasser.<\/li>\n<\/ul>\n<p>Detta inneb\u00e4r att ett enhetstest skulle omfatta:<\/p>\n<ol>\n<li>St\u00e4ller upp klassen,<\/li>\n<li>Definiera ett v\u00e4rde,<\/li>\n<li>Att h\u00e4vda att v\u00e4rdet som definierades \u00e4r som f\u00f6rv\u00e4ntat,,<\/li>\n<li>\u00c4ndra v\u00e4rdet,<\/li>\n<li>Att h\u00e4vda v\u00e4rdet som \u00e4ndrades uppdaterades.<\/li>\n<\/ol>\n<p>S\u00e5 grundklassen kan se ut ungef\u00e4r <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/248c7741273e6be414c1f98c11085fe7#file-00-acme-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r<\/a><\/strong> (all dokumentation l\u00e4mnas utanf\u00f6r klassen i syfte att h\u00e5lla koden s\u00e5 kortfattad som m\u00f6jligt):<\/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>Observera att vi som standard har cachetiden inst\u00e4lld p\u00e5 12 timmar (i sekunder). Klassen st\u00f6djer f\u00f6rm\u00e5gan att b\u00e5de \u00e4ndra och l\u00e4sa av varaktigheten.<\/p>\n<p>Det betyder att vi kan skriva tester som testar:<\/p>\n<ul>\n<li>om det initiala v\u00e4rdet \u00e4r det f\u00f6rv\u00e4ntade,<\/li>\n<li>om det nya v\u00e4rdet \u00e4r vad som f\u00f6rv\u00e4ntades (och att det skriver \u00f6ver det initiala v\u00e4rdet)<\/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>En av sakerna jag skulle vilja p\u00e5peka i ovanst\u00e5ende kod \u00e4r att du kan l\u00e4sa att varje test b\u00f6r ha ett enda p\u00e5st\u00e5ende medan <strong>testNewDuration<\/strong> uppenbarligen har tv\u00e5 p\u00e5st\u00e5enden.<\/p>\n<p>Jag tenderar att ta tanken p\u00e5 ett p\u00e5st\u00e5ende per test som en tumregel. Till exempel, i det h\u00e4r fallet, vill jag h\u00e4vda att det initiala v\u00e4rdet skrivs \u00f6ver eller inte lagras n\u00e5gonstans och det nya v\u00e4rdet lagras.<\/p>\n<p>Detta kanske inte alltid \u00e4r fallet, s\u00e5 du kan beh\u00f6va behandla dessa typer av situationer med f\u00f6rsiktighet.<\/p>\n<p>Som du kan se har detta inget med WordPress att g\u00f6ra; det har dock att g\u00f6ra med att testa logik specifikt relaterad till dom\u00e4nen till hands. N\u00e4mligen cachens varaktighet. Och det h\u00e4r \u00e4r vad k\u00e4rnan i enhetstestning handlar om: Testa det logiska beteendet hos kodenheter f\u00f6r att s\u00e4kerst\u00e4lla att vi har saker som fungerar som f\u00f6rv\u00e4ntat.<\/p>\n<p>Och beroende p\u00e5 n\u00e4r du skriver den h\u00e4r koden kan du ha misslyckade tester. Detta kan i slut\u00e4ndan hj\u00e4lpa till med klassdesign, men det \u00e4r ett annat \u00e4mne och inte ett som \u00e4r en del av det h\u00e4r inl\u00e4gget.<\/p>\n<h2>K\u00f6r testerna<\/h2>\n<p>N\u00e4r proven v\u00e4l \u00e4r skrivna \u00e4r det viktigt att kunna utf\u00f6ra dem f\u00f6r att se om de klarar, om de misslyckas, vad som godk\u00e4nns och vad som inte g\u00e5r. Men vi \u00e4r inte klara \u00e4n. Jag vill ge en helt\u00e4ckande titt p\u00e5 enhetstestning i WordPress-sammanhang och det handlar om att diskutera vad WordPress tillhandah\u00e5ller, vad det inte g\u00f6r, n\u00e5gra missuppfattningar och hur man k\u00f6r dessa tester i terminalen eller i Visual Studio Code.<\/p>\n<p>I n\u00e4sta inl\u00e4gg i den h\u00e4r serien kommer vi att titta p\u00e5 <strong>tearDown-<\/strong> funktionen och hur (och n\u00e4r) den ska anv\u00e4ndas, n\u00e4r den beh\u00f6vs, n\u00e4r den inte \u00e4r det, och sedan ska vi titta lite p\u00e5 kring enheten testa i WordPress i allm\u00e4nhet.<\/p>\n<p>I slut\u00e4ndan arbetar vi f\u00f6r att f\u00e5 en fullst\u00e4ndig bild av hur man g\u00f6r detta och hur man g\u00f6r det r\u00e4tt. Men det \u00e4r viktigt att l\u00e4gga grunden f\u00f6r det och att g\u00f6ra det under ett par inl\u00e4gg \u00e4r l\u00e4ttare \u00e4n i ett monolitiskt inl\u00e4gg.<\/p>\n<p>S\u00e5 att unders\u00f6ka <strong>tearDown()<\/strong>, dess anv\u00e4ndning och hur man utf\u00f6r tester fr\u00e5n kommandoraden kommer att vara \u00e4mnet f\u00f6r n\u00e4sta inl\u00e4gg i den h\u00e4r serien.<\/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 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.<\/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":[848,807,724],"tags":[1173],"class_list":["post-229887","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\/229887","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=229887"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229887\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/164224"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=229887"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=229887"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=229887"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}