{"id":230620,"date":"2022-11-26T12:22:00","date_gmt":"2022-11-26T09:22:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230620"},"modified":"2022-11-26T12:22:14","modified_gmt":"2022-11-26T09:22:14","slug":"scrivere-unit-test-con-phpunit-parte-1-il-set-up","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/scrivere-unit-test-con-phpunit-parte-1-il-set-up\/","title":{"rendered":"Scrivere Unit Test con PHPUnit, Parte 1: Il Set Up"},"content":{"rendered":"\n<p>All&#8217;inizio di questo mese, abbiamo iniziato a esaminare l&#8217;installazione di <strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/installazione-di-phpunit-in-visual-studio-code\/\" title=\"PHPUnit in Visual Studio Code\">PHPUnit in Visual Studio Code<\/a><\/strong> con l&#8217;obiettivo finale di imparare a scrivere unit test per i nostri progetti basati su WordPress.<\/p>\n<p>A tal fine, questo post presuppone che tu abbia letto i seguenti post e presuppone che tu abbia raggiunto una manciata di post precedenti:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/un-ambiente-di-sviluppo-wordpress-utilizzando-un-gestore-di-pacchetti\/\" title=\"Un ambiente di sviluppo WordPress (utilizzando un gestore di pacchetti)\">Un ambiente di sviluppo WordPress (utilizzando un gestore di pacchetti)<\/a><\/strong><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/un-ide-per-lo-sviluppo-di-wordpress-indipendentemente-dallesperienza\/\" title=\"Un IDE per lo sviluppo di WordPress\">Un IDE per lo sviluppo di WordPress<\/a><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/utilizzo-delle-impostazioni-utente-in-visual-studio-code\/\" title=\"Utilizzo delle impostazioni utente in Visual Studio Code\">Utilizzo delle impostazioni utente in Visual Studio Code<\/a><\/strong><\/li>\n<\/ol>\n<p>E, naturalmente, l&#8217;installazione di PHPUnit in Visual Studio Code come collegato sopra. Una volta fatto, saremo pronti per procedere. Ma una cosa da tenere a mente \u00e8 che questo sar\u00e0 un corso tradizionale o completo per la scrittura di unit test.<\/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=\"Scrivere Unit Test con PHPUnit, Parte 1: Il Set Up\"><\/a><\/p>\n<p>Invece, si tratta di scrivere unit test per progetti WordPress.<\/p>\n<h2>Unit test con PHPUnit, Parte 1: La configurazione<\/h2>\n<p>Prima di approfondire questo aspetto, voglio essere chiaro che questo non \u00e8 tanto un post nello sviluppo basato su test, ma un post che pone le basi per comprendere la scrittura di unit test. E poi, alla fine, lavoreremo per scrivere unit test per il nostro codice.<\/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=\"Scrivere Unit Test con PHPUnit, Parte 1: Il Set Up\"><\/a><\/p>\n<p>Per quelli di voi che hanno letto in precedenza i test unitari, allora sapete che la scrittura di test unitari \u00e8 un argomento per il quale ci sono molte informazioni e questo post non tenter\u00e0 di coprire tutto ci\u00f2. Invece, adotter\u00e0 un approccio pi\u00f9 pragmatico alla scrittura di unit test su plug-in, applicazioni Web e simili basati su WordPress.<\/p>\n<h3>1 Test unitari di scrittura<\/h3>\n<p>Ogni volta che inizierai a scrivere unit test, ti verr\u00e0 presentata sia l&#8217;idea del <strong>setUp<\/strong> che dei metodi <strong>tearDown<\/strong>. Questo \u00e8 comune in <strong><a href=\"https:\/\/phpunit.de\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPUnit<\/a><\/strong> (come con altri framework di test). Ci sono alcune cose su questi due metodi particolari che spesso causano problemi.<\/p>\n<p>In breve, le persone trattano le funzioni in questo modo:<\/p>\n<ul>\n<li><strong>setUp<\/strong> \u00e8 come il costruttore in cui istanzia la tua classe e poi prepari tutto ci\u00f2 di cui hai bisogno per il tuo test incluso l&#8217;oggetto da testare, i dati necessari e cos\u00ec via.<\/li>\n<li><strong>tearDown<\/strong> \u00e8 il distruttore in cui resetti tutto e poi smaltisci i tuoi oggetti. Questo di solito \u00e8 pi\u00f9 comune nei linguaggi compilati, ma non \u00e8 nemmeno da perdere all&#8217;interno di PHPUnit.<\/li>\n<\/ul>\n<p>E anche se posso capirlo completamente, non \u00e8 sempre cos\u00ec. Parlo per esperienza anche qui. Invece, \u00e8 da qui che viene la vera e propria frase unit test. Si tratta di testare il codice delle unit\u00e0 e di farlo in modo pulito e conciso.<\/p>\n<p>Quindi a cosa servono questi metodi, comunque? Questa pu\u00f2 essere un&#8217;abitudine particolarmente difficile da rompere o persino un modello concettuale da rompere quando ci si avvicina per la prima volta al processo. A tal fine, voglio esaminare lo scopo di ciascun metodo e quindi come affrontarlo quando si lavora con progetti basati su WordPress.<\/p>\n<p>E, come al solito, mirer\u00f2 a mantenerlo il pi\u00f9 semplice e pragmatico possibile. Sono molto meno interessato alla teoria dietro certe cose che a come pu\u00f2 servire bene sia la mia attivit\u00e0 che i miei progetti. (Questo non \u00e8 per scartare la teoria, ovviamente, ma c&#8217;\u00e8 un tempo non un posto per quello e questo blog non lo \u00e8.)<\/p>\n<h3>2 La funzione di configurazione<\/h3>\n<p>Anche se sto iniziando con una breve discussione sul metodo <strong>setUp<\/strong>, \u00e8 importante tenere a mente che la sua funzione sorella (come alcuni la considerano) non \u00e8 sempre necessaria.<\/p>\n<p>Ad esempio, se stai scrivendo codice in cui tutto ci\u00f2 che stai facendo \u00e8 creare un&#8217;istanza di un oggetto o di un insieme di oggetti, il metodo <strong>tearDown<\/strong> potrebbe non essere necessario. Entrer\u00f2 in maggiori dettagli su questo nella prossima sezione.<\/p>\n<p>Detto questo, supponiamo che tu abbia una classe responsabile dell&#8217;esecuzione di un po&#8217; di logica di dominio. Ricorda, ai fini di questo post, non ci interessa il codice che far\u00e0 cose che WordPress fa naturalmente e che ha gi\u00e0 una propria serie di test.<\/p>\n<p>Con ci\u00f2, intendo dire che ci occupiamo di codice che funziona specificamente all&#8217;interno di un dominio problematico. Ad esempio, forse siamo interessati a scrivere una classe che memorizza nella cache i dati nel database. Una delle informazioni responsabili della memorizzazione nella cache delle informazioni \u00e8 la durata della cache dei dati. Quindi, un candidato per il test unitario farebbe usando che siamo in grado di impostare e modificare la quantit\u00e0 di tempo, giusto?<\/p>\n<p>Certo, forse questi dati sono codificati, ma ai fini dell&#8217;esempio, supponiamo il contrario. Ci\u00f2 implica quanto segue:<\/p>\n<ul>\n<li>Abbiamo una classe che funge da cache,<\/li>\n<li>La classe conserva un pezzo di dati di istanza per quanto tempo deve essere impostata la cache,<\/li>\n<li>Il tempo della cache pu\u00f2 essere impostato da classi di terze parti,<\/li>\n<li>Il tempo della cache pu\u00f2 essere letto da classi di terze parti.<\/li>\n<\/ul>\n<p>Ci\u00f2 significa che un test unitario includerebbe:<\/p>\n<ol>\n<li>Allestimento della classe,<\/li>\n<li>Definire un valore,<\/li>\n<li>Affermando che il valore che \u00e8 stato definito \u00e8 quello atteso,,<\/li>\n<li>Modificando il valore,<\/li>\n<li>L&#8217;affermazione del valore che \u00e8 stato modificato \u00e8 stata aggiornata.<\/li>\n<\/ol>\n<p>Quindi la classe base potrebbe assomigliare <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/248c7741273e6be414c1f98c11085fe7#file-00-acme-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a questa<\/a><\/strong> (tutta la documentazione viene esclusa dalla classe allo scopo di mantenere il codice il pi\u00f9 conciso possibile):<\/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>Si noti che, per impostazione predefinita, il tempo della cache \u00e8 impostato su 12 ore (in secondi). La classe supporta anche la capacit\u00e0 di modificare e leggere la durata.<\/p>\n<p>Ci\u00f2 significa che possiamo scrivere test che verificano:<\/p>\n<ul>\n<li>se il valore iniziale \u00e8 quello previsto,<\/li>\n<li>se il nuovo valore \u00e8 quello previsto (e che sovrascrive il valore iniziale)<\/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>Una delle cose che vorrei sottolineare nel codice sopra \u00e8 che potresti leggere che ogni test dovrebbe avere una singola asserzione mentre per <strong>testNewDuration<\/strong> ha chiaramente due asserzioni.<\/p>\n<p>Tendo a prendere l&#8217;idea di un&#8217;affermazione per test come regola pratica. Ad esempio, in questo caso, voglio affermare che il valore iniziale viene sovrascritto o non memorizzato da nessuna parte e il nuovo valore viene memorizzato.<\/p>\n<p>Questo potrebbe non essere sempre il caso, quindi potrebbe essere necessario trattare questi tipi di situazioni con cura.<\/p>\n<p>Come puoi vedere, questo non ha nulla a che fare con WordPress; tuttavia, ha a che fare con la logica di test relativa specificamente al dominio in questione. Vale a dire, la durata della cache. E questo \u00e8 il fulcro del test unitario: testare il comportamento logico delle unit\u00e0 di codice per assicurarci che le cose funzionino come previsto.<\/p>\n<p>E a seconda di quando scrivi questo codice, potresti avere test falliti. Questo alla fine pu\u00f2 aiutare con la progettazione della classe, ma questo \u00e8 un altro argomento e non uno che fa parte di questo post.<\/p>\n<h2>Esecuzione dei test<\/h2>\n<p>Una volta scritti i test, \u00e8 importante essere in grado di eseguirli per vedere se superano, se falliscono, cosa passa e cosa no. Ma non abbiamo ancora finito. Voglio fornire uno sguardo completo agli unit test nel contesto di WordPress e questo arriva alla discussione di ci\u00f2 che WordPress fornisce, cosa non offre, alcune idee sbagliate e come eseguire questi test nel terminale o all&#8217;interno di Visual Studio Code.<\/p>\n<p>Nel prossimo post di questa serie, esamineremo la funzione <strong>tearDown<\/strong> e come (e quando) usarla, quando \u00e8 necessaria, quando non lo \u00e8, e poi esamineremo un po&#8217; l&#8217;unit\u00e0 test in WordPress in generale.<\/p>\n<p>In definitiva, stiamo lavorando per ottenere un quadro completo di come farlo e come farlo nel modo giusto. Ma \u00e8 importante gettare le basi per questo e farlo nell&#8217;arco di pochi post \u00e8 pi\u00f9 facile che in un post monolitico.<\/p>\n<p>Quindi esaminare <strong>tearDown()<\/strong>, il suo utilizzo e come eseguire i test dalla riga di comando sar\u00e0 l&#8217;argomento del prossimo post di questa serie.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una guida per iniziare a scrivere test PHPUnit attraverso l&#8217;uso di una cache di base e utilizzando il metodo setUp del framework.<\/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":[804,720,844],"tags":[1168],"class_list":["post-230620","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-6","category-sviluppatore","category-tutorial","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230620","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=230620"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230620\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/164224"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230620"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230620"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}