Nessun software è privo di bug. Questo è un assioma che vale per ogni linguaggio di programmazione e per ogni applicazione.

Quando questi bug vengono implementati nel vostro sito web in produzione, puoi subire conseguenze negative di varia gravità. Ecco alcuni esempi, che vanno dal fastidio al danno economico:

  • Lieve: Un utente che non riesce a fare clic su un link non funzionante.
  • Grave: Il pulsante “Invia” di un modulo di contatto non funziona e l’utente se ne accorge solo dopo aver composto il messaggio.
  • Grave: Un gateway di pagamento non configurato correttamente, che impedisce agli utenti di acquistare i prodotti nel vostro negozio di ecommerce, abbandonando così il sito.

Nessun singolo strumento è sufficiente per gestire tutti gli aspetti del testing di un’applicazione da tutti i diversi punti di vista possibili. Infatti, oltre a trovare i bug, è fondamentale eseguire ulteriori test per convalidare altre funzioni dell’applicazione, come per esempio:

In questo articolo esamineremo 10 strumenti creati dalla comunità open source che possono contribuire a creare uno stack per testare il codice PHP nei plugin di WordPress. Alcuni di questi strumenti sono stati progettati specificamente per testare il codice PHP; altri sono stati creati per testare il codice WordPress; altri ancora sono stati creati per gestire alcune funzionalità generiche utili per i test.

1. DevKinsta

Schermata con i dettagli di un sito locale in DevKinsta.
Dettagli per un sito WordPress locale in DevKinsta.

DevKinsta è una suite di sviluppo locale per siti WordPress. Basta fornire alcuni dettagli di base per installare immediatamente un’istanza locale di un sito WordPress. Include diversi strumenti di sviluppo utili come una casella di posta elettronica, un gestore di database e un registro per facilitare la risoluzione dei problemi.

DevKinsta è normalmente utilizzato da developer e designer per la creazione di temi e plugin WordPress. Ma si può anche usare come server web locale per eseguire test di integrazione e funzionalità. Questo avviene in tandem con uno strumento HTTP che vi aiuta a verificare che il contenuto e gli header delle risposte siano corretti.

Le caratteristiche principali di DevKinsta sono:

2. PHPUnit

Logo di PHPUnit.
PHPUnit.

PHPUnit è un framework di testing per PHP orientato a chi programma. È il framework più popolare per l’esecuzione di test unitari nel codice PHP, con l’obiettivo di validare singole unità di codice sorgente.

I test di PHPUnit consentono di individuare i problemi il prima possibile all’interno del ciclo di sviluppo, aiutando a garantire che non siano state introdotte regressioni nel codice (cioè che le modifiche apportate a una parte del codice non abbiano causato problemi in un altro punto).

Le principali caratteristiche di PHPUnit sono:

  • Nuove funzionalità di testing
  • Convalida del codice appena riformulata
  • Può essere completamente automatizzato ed eseguito all’interno del processo di Integrazione Continua di vostra scelta
  • Debug
  • Documentazione automatica sull’uso previsto attraverso l’invocazione di funzionalità e vincoli
  • Consente l’approccio Test-Driven Development (TDD) in cui si creano prima i test e poi le funzionalità

3. Brain Monkey

Logo di Brain Monkey.
Brain Monkey.

Brain Monkey è un’utility di testing per PHP e WordPress. Fornisce strumenti indipendenti dal framework che vi permettono di ridefinire i metodi PHP e di testare il comportamento di qualsiasi applicazione PHP. Fornisce anche strumenti specifici per testare il codice di WordPress.

Le caratteristiche principali di Brain Monkey sono:

  • Permette ai test unitari di interagire con librerie esterne non scaricate
  • Permette di invocare le funzioni di WordPress senza dover caricare l’ambiente di WordPress
  • Può affermare che le funzioni di WordPress (come add_filter o do_action) invocano le funzionalità come previsto

4. Brain Faker

Brain Faker su GitHub.
Brain Faker.

Brain Faker usa Faker (una popolare libreria PHP per la generazione di dati falsi) e Brain Monkey per generare facilmente oggetti WordPress falsi e funzioni correlate da testare, tra cui:

  • Istanze WP_Post e mock di funzioni correlate come get_post e get_post_field
  • Istanze WP_User e mock di funzioni correlate come get_userdata, get_user_by, user_can e altre ancora
  • Istanze WP_Term e funzioni mock correlate come get_term e get_term_by
  • Istanze WP_Comment
  • Istanze WP_Site e funzioni mock correlate come get_site
  • Istanze WP_Post_Type e finte funzioni correlate come get_post_type_object e post_type_exists
  • Istanze WP_Taxonomy e le funzioni mock correlate come get_taxonomy e taxonomy_exists
  • Istanze WP_Error

Le principali caratteristiche di Brain Faker sono:

  • Inietta dati WordPress falsi ma realistici nel test unitario: l’accesso alla data di modifica di un post falso si comporterà come una data (per esempio 2022-04-17T13:06:58+00:00), il nome di un utente sarà appropriato (per esempio "John Smith"), un’istanza di post falso è creata da un’istanza di utente falso e così via
  • I dati falsi possono essere forniti in anticipo o generati in modo casuale
  • Estensibile: se vi occupate di sviluppo, potete simulare le classi e le funzioni dei vostri plugin WordPress

5. Mockery

Mockery su GitHub.
Mockery.

Mockery è un framework di oggetti mock per PHP semplice ma flessibile, pensato per essere utilizzato insieme a PHPUnit, PHPSpec o qualsiasi altro framework di unit testing. Offre un doppio framework di testing in grado di definire tutte le possibili operazioni e interazioni degli oggetti usando un linguaggio specifico del dominio (DSL) leggibile dagli esseri umani.

Le principali caratteristiche di Mockery sono:

  • Permette di generare in modo flessibile oggetti mock e stub (che forniscono risposte predefinite a chiamate specifiche effettuate durante i test)
  • Migliora le capacità di isolamento dei test di PHPUnit
  • API flessibile per esprimere le aspettative dei mock, imitando il più possibile una descrizione in linguaggio naturale (es. $mock->shouldReceive('myMethod')->once()->andReturn('Hello world!');)
  • Test unitari che usano oggetti mock in memoria per evitare di dover accedere a sistemi più lenti (come database, file system o servizi esterni)
  • Può simulare sia comportamenti deterministici che non deterministici

6. Strumento di Esportazione Nativo di WordPress

Schermata dell’area Strumenti di esportazione nell’editor WordPress.
Lo strumento di esportazione di WordPress.

Lo strumento di esportazione nativa di WordPress scarica i dati di WordPress del sito sul vostro dispositivo sotto forma di file XML, compresi articoli, pagine, tipi di post personalizzati, commenti, campi personalizzati, categorie, tag, tassonomie personalizzate, utenti e media. Il file XML presenta un formato personalizzato (chiamato file WordPress eXtended RSS o WXR) che può essere importato in qualsiasi sito WordPress.

Questo strumento non è stato progettato specificamente per i test. Tuttavia, la sua utilità deriva dalla possibilità di creare istantanee del database di WordPress contenenti un set di dati adeguato, che può essere usato per i test. Ciò significa che il sito WordPress in produzione, che contiene dati reali, può essere esportato e importato in un’istanza di sviluppo o di staging per testare nuove funzionalità.

Le principali caratteristiche dello strumento di esportazione di WordPress sono:

  • Creazione di dati di testing utilizzando un vero sito WordPress
  • File di esportazione condivisibile dell’intero database
  • Utile sia per i test di integrazione che per quelli unitari

7. Guzzle

Logo di Guzzle.
Guzzle.

Guzzle è un client HTTP PHP che semplifica l’invio di richieste HTTP e l’integrazione con i servizi web.

Guzzle è uno strumento generico, quindi i test sono solo uno dei suoi possibili casi d’uso. Insieme a un server web locale come DevKinsta, Guzzle permette di eseguire test di integrazione. Potete usare Guzzle per inviare una richiesta HTTP al server web di sviluppo, quindi passare la risposta a un test unitario in PHPUnit che verifichi che il contenuto e gli header siano impostati come previsto.

Le principali caratteristiche di Guzzle sono:

  • Soddisfa la raccomandazione standard PHP “PSR-7” (per le interfacce di messaggi HTTP), evitando il vendor lock-in
  • È semplice e veloce
  • I test vengono eseguiti su un sito WordPress reale, aumentandone l’affidabilità
  • Possono essere eseguiti dall’interno di PHPUnit, per una maggiore facilità e velocità di esecuzione
  • I test di integrazione possono essere automatizzati e aggiunti al processo di Integrazione Continua

8. WP-CLI

Logo di WP-CLI.
WP-CLI.

WP-CLI è l’interfaccia a riga di comando di WordPress. Con essa potete aggiornare i plugin, configurare installazioni multisito e molto altro ancora, senza usare un browser web.

WP-CLI non è uno strumento specifico per i test, ma i test rientrano tra i suoi numerosi casi d’uso. Per esempio, dopo aver avviato un nuovo server web di sviluppo, potete eseguire uno script bash contenente i comandi WP-CLI per importare i dati di test nel sito WordPress, creare gli utenti con i ruoli e le capacità appropriate, installare i plugin di terze parti necessari e altre attività simili.

Poiché lo script con i comandi WP-CLI può essere memorizzato nel vostro repository Git, il processo di esecuzione dei test di integrazione può essere automatizzato e integrato nel vostro processo di Integrazione Continua:

  1. Usa lo strumento di esportazione di WordPress per generare dati di test reali e memorizzarli nel repository Git.
  2. Usa DevKinsta per lanciare un server web con una nuova istanza di WordPress.
  3. Usa WP-CLI per importare i dati di test nel sito WordPress (DevKinsta può essere gestito tramite WP-CLI).
  4. Crea un test unitario in PHPUnit facendo in modo che Guzzle esegua una richiesta HTTP al server web per verificare il contenuto e gli header della risposta.

Le principali caratteristiche di WP-CLI sono:

  • Permette l’esecuzione remota di comandi contro l’istanza di WordPress tramite un’interfaccia a riga di comando
  • Estensibile con altri strumenti
  • Migliora le capacità dello stack di testing
  • Permette la completa automazione del processo

9. XDebug

Logo di XDebug.
XDebug.

XDebug è un’estensione per PHP che offre una serie di funzioni per migliorare l’esperienza di sviluppo di PHP, tra cui il debug, miglioramenti alla segnalazione degli errori di PHP, il tracciamento, il profiling e l’analisi della copertura del codice.

XDebug non vi aiuterà a testare il vostro codice, ma a scoprire piuttosto dove si trova il bug. La combinazione di XDebug con PHPUnit è particolarmente efficace. Se un test fallisce e non riuscite a trovare l’origine del problema, potete usare XDebug per aggiungere dei breakpoint nel codice del test unitario. Quando eseguirete di nuovo il test unitario, lo script PHP verrà messo in pausa in corrispondenza di ciascuno di questi punti di interruzione, consentendovi di ispezionare lo stato attuale dell’esecuzione (stack di chiamate, valori di proprietà e oggetti, ecc.) e di cercare di scoprire cosa c’è che non va.

Le principali caratteristiche di XDebug sono:

  • Integrazione con i più diffusi editor PHP, tra cui VS Code, PHPStorm e Sublime
  • Profila il tempo speso in ogni chiamata di funzione e la quantità di memoria consumata
  • Molto più potente del semplice utilizzo di var_dump per il debug del codice
  • Permette di modificare al volo i valori delle variabili quando si mettono in pausa i breakpoint

10. PHPStan

Logo di PHPStan.
PHPStan.

PHPStan è uno strumento di analisi statica per PHP, progettato per trovare bug nel codice ancora prima di scrivere i test.

L’obiettivo di PHPStan è quello di ridurre il numero di test che chi sviluppa deve scrivere. Questo strumento è il primo a essere eseguito nello stack di test, catturando preventivamente il maggior numero possibile di bug. Solo i bug che non possono essere dedotti dall’analisi statica (per esempio quelli con una logica errata) devono essere convalidati tramite i test unitari.

PHPStan funziona analizzando l’intera base di codice alla ricerca di eventuali discrepanze. Per esempio, il valore di risposta di una funzione che restituisce un float non può essere assegnato a un parametro di tipo intero. Ogni volta che il codice presenta un’anomalia di questo tipo, si tratta di un potenziale bug e PHPStan te lo segnala durante la fase di sviluppo, proprio mentre state scrivendo il codice dell’applicazione.

Le principali caratteristiche di PHPStan sono:

  • Automazione e integrazione nel processo di integrazione continua esistente
  • Individua molti bug difficili, come le corrispondenze di tipo
  • Esamina l’intera base di codice, trovando bug in porzioni di codice raramente eseguite
  • È organizzato in livelli di complessità crescente per consentire un’integrazione graduale
  • Dispone di estensioni per i framework e i CMS PHP più diffusi, tra cui Symfony, Laravel, Doctrine, Nette e WordPress

Riepilogo

Il costo di un bug che passa inosservato nella vostra applicazione in produzione può essere dannoso per la vostra reputazione e le vostre entrate, quindi dovete cercare di eliminarlo prima che colpisca i vostri utenti.

Nelle applicazioni complesse è quasi impossibile avere la certezza al 100% che non ci siano bug. Per questo motivo, dovete impostare un processo per trovare e rimuovere il maggior numero possibile di bug durante il ciclo di sviluppo iniziale.

Con un toolkit di testing ben progettato, potete ridurre al minimo le possibilità che la vostra applicazione si comporti in modo inaspettato. La comunità open source ha creato e reso disponibili numerosi strumenti per testare i diversi aspetti di un’applicazione, che potete – e dovreste! – usare per realizzare uno stack di test completo.

In questo articolo abbiamo recensito 10 strumenti che vi aiuteranno a raggiungere i vostri obiettivi di test del codice PHP in un plugin WordPress.

Quale di questi strumenti avete usato per il vostro ultimo progetto? Fateci sapere cosa avete costruito con esso nella sezione commenti qui sotto!

Leonardo Losoviz

Leo writes about innovative web development trends, mostly concerning PHP, WordPress and GraphQL. You can find him at leoloso.com and twitter.com/losoviz.