La guida per principianti ai test unitari che cos'è il test unitario?

A seconda del tuo background, potresti o non hai sentito parlare di test unitari, sviluppo test-driven, sviluppo comportamentale, o qualche altro tipo di metodologia di test. Spesso, queste metodologie vengono applicate nel contesto di sistemi software o applicazioni più grandi e meno nel contesto di progetti basati su WordPress (sebbene è migliorare!)

Francamente, la comunità di sviluppo è un po 'divisa sui test automatici del software: ci sono alcune persone che pensano che si dovrebbero testare il 100% di tutto il codice, alcuni ritengono che l'80% sia sufficiente, circa il 50% e alcuni siano contenti 20% circa. Qualunque sia il caso, questo articolo non tratta di discutere un caso per il livello di test che dovresti avere nel tuo progetto, né sta prendendo posizione sul test generale del software.

Invece, daremo un'occhiata a ciò che è necessario per iniziare a lavorare con un'unità che collauda i progetti di sviluppo di WordPress. Ci avvicineremo a questa serie dal punto di vista di un principiante assoluto in modo che possiamo comprendere i vantaggi dei test unitari e come configurare il nostro ambiente per supportare le librerie di test delle unità in modo che possiamo iniziare a farlo nel nostro lavoro futuro. Infine, tutto ciò sarà fatto costruendo e testando da zero un plug-in semplice e testabile.


Che cos'è il test unitario?

Prima di iniziare a configurare il nostro ambiente e scrivere qualsiasi codice, definiamo esattamente quale test dell'unità è, perché vale la pena farlo e come iniziare a incorporarlo nei nostri progetti.

Ad alti livelli, i test unitari si riferiscono alla pratica di testare alcune funzioni e aree - o unità - del nostro codice. Questo ci dà la possibilità di verificare che le nostre funzioni funzionino come previsto. Vale a dire che per qualsiasi funzione e dato un insieme di input, possiamo determinare se la funzione restituisce i valori corretti e gestirà correttamente i fallimenti durante il corso dell'esecuzione se l'input non è valido.

In definitiva, questo ci aiuta a identificare i guasti nei nostri algoritmi e / o nella logica per aiutare a migliorare la qualità del codice che compone una determinata funzione. Quando inizi a scrivere sempre più test, finisci per creare una serie di test che puoi eseguire in qualsiasi momento durante lo sviluppo per verificare continuamente la qualità del tuo lavoro.

Un secondo vantaggio nell'affrontare lo sviluppo da una prospettiva di testing unitario è che probabilmente scriverai un codice che è facile da testare. Poiché il test unitario richiede che il tuo codice sia facilmente verificabile, significa che il tuo codice deve supportare questo particolare tipo di valutazione. Come tale, è più probabile che tu abbia un numero maggiore di funzioni più piccole e più focalizzate che forniscono una singola operazione su un insieme di dati piuttosto che grandi funzioni che eseguono una serie di operazioni diverse.

Un terzo vantaggio per la scrittura di test di unità solide e codice ben collaudato è che è possibile evitare che le modifiche future possano compromettere la funzionalità. Dal momento che stai testando il tuo codice man mano che introduci la tua funzionalità, inizierai a sviluppare una suite di casi di test che possono essere eseguiti ogni volta che lavori sulla tua logica. Quando si verifica un errore, sai di avere qualcosa da affrontare.

Naturalmente, ciò comporta il tempo investito per scrivere una suite di test nelle prime fasi di sviluppo, ma man mano che il progetto cresce, è sufficiente eseguire i test che hai sviluppato per garantire che le funzionalità esistenti non vengano interrotte quando nuove funzionalità sono introdotto.


Pianificazione del nostro plugin

Uno dei modi migliori per iniziare con i test unitari è quello di farlo nel contesto di un'applicazione pratica. In questa serie in due parti costruiremo un semplice plug-in e test di scrittura per coprire tutte le funzionalità.

Innanzitutto, pianifichiamo il progetto: scriveremo un piccolo plug-in che aggiungerà un semplice messaggio nella parte superiore di un singolo post che accoglie l'utente in base a come ha trovato un post specifico sul blog. L'idea è molto simile a Welcome Reader ma non includerà quasi tutte le funzionalità: stiamo semplicemente costruendo una demo per imparare i dettagli del testing.

Ad ogni modo, ecco come funzionerà il plugin:

  • Se l'utente naviga nel sito da Google, daremo un messaggio univoco
  • Se l'utente naviga sul sito da Twitter, daremo un messaggio unico
  • Altrimenti, non mostreremo nulla

Semplice abbastanza, giusto? Ciò fornirà anche una base su cui aggiungere messaggi personalizzati per altri servizi e ampliare ulteriormente le nostre capacità di test delle unità qualora lo desideriate.


Preparare l'ambiente

Per testare il nostro codice unitario, avremo bisogno di una libreria di terze parti che includeremo nel nostro progetto che eseguirà effettivamente i test che scriviamo. In questa serie, useremo PHPUnit. Puoi prenderne una copia qui.

Successivamente, dobbiamo preparare il nostro ambiente di sviluppo, eliminare il nostro plugin e includere le librerie necessarie per testare il nostro codice. Questo articolo presuppone che tu abbia già installato e funzionante un'installazione di WordPress funzionante.

Quindi, per prima cosa, prepariamo la directory dei plugin:

  • Nel / Wp-content / plugins crea una directory chiamata Ciao-Reader
  • Nel Ciao-Reader directory, creare un file chiamato plugin.php e una directory chiamata test
  • Cancelleremo il plug-in per assicurarci che WordPress visualizzi correttamente il nostro progetto
  • Importeremo le librerie di test delle unità in modo che possiamo iniziare a scrivere i nostri test

Ecco lo scheletro per il plug-in che creeremo:

/ * Nome plugin: Hello Reader Plugin URI: http://github.com/tommcfarlin/Hello-Reader Descrizione: un semplice plug-in utilizzato per aiutare a dimostrare i test delle unità nel contesto di WordPress. Versione: 1.0 Autore: Tom McFarlin Autore URI: http://tom.mcfarl.in Autore Email: [email protected] Licenza: Copyright 2012 Tom McFarlin ([email protected]) Questo programma è software libero; è possibile ridistribuirlo e / o modificarlo secondo i termini della GNU General Public License, versione 2, pubblicata dalla Free Software Foundation. Questo programma è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza nemmeno la garanzia implicita di COMMERCIABILITÀ o IDONEITÀ PER UN PARTICOLARE SCOPO. Vedi la GNU General Public License per maggiori dettagli. Dovresti aver ricevuto una copia della GNU General Public License insieme a questo programma; in caso contrario, scrivere alla Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * / // Creare un'istanza del plugin solo se non esiste già in GLOBALS if (! array_key_exists ('ciao-reader', $ GLOBALS)) class Hello_Reader function __construct ()  // end constructor // end class // Salva un riferimento al plugin in GLOBALS in modo che i nostri test unitari possano accedervi $ GLOBALS ['hello-reader'] = new Hello_Reader ();  // finisci se

A questo punto, dovresti essere in grado di navigare verso i "Plugin" nella tua dashboard di WordPress e vedere una voce per "Hello Reader". Ovviamente, questo plugin non fa ancora nulla, ci concentreremo su questo (e sul perché stiamo sfruttando il $ GLOBALS array) nel prossimo articolo.

Infine, impostiamo il framework di test in modo che saremo in grado di scrivere i nostri test. Per prima cosa, avremo bisogno di installare PHPUnit e quindi avremo bisogno di installare i test di WordPress.

Nota: La prossima sezione richiederà di lavorare con il terminale e probabilmente richiederà l'emissione di alcuni comandi per creare collegamenti simbolici. Ho cercato di renderlo il più semplice e semplice possibile, ma ogni sistema operativo e configurazione saranno diversi. Si prega di seguire attentamente e vi invito a condividere le vostre istruzioni per i vostri sistemi operativi nei commenti.

Installazione di PHPUnit

PHPUnit è un pacchetto framework unit test specifico per PHP. I test WordPress e il framework che useremo per scrivere i nostri test WordPress dipendono da questo. Sfortunatamente, l'installazione varia in base alla tua piattaforma. Attualmente sto eseguendo Mac OS X Lion con MAMP Pro e PHP 5.3.6. Se stai utilizzando una piattaforma diversa, assicurati di fare riferimento alla documentazione e / o sentiti libero di condividere i tuoi passaggi nei commenti.

Prima apri un terminale e aggiorna Pera (questa è la funzione che useremo per installare PHPUnit):

$ cd /Applicazioni/MAMP/bin/php/php5.3.6/bin
$ sudo ./pear upgrade pera

Quindi, istruisci Pear ad usare i repository che specificheremo nel terminale:

$ sudo /Applications/MAMP/bin/php/php5.3.6/bin/pear config-set auto_discover 1

Successivamente, installa Pear emettendo il seguente comando:

$ sudo /Applicazioni/MAMP/bin/php/php5.3.6/bin/pear install pear.phpunit.de/PHPUnit

Questo installerà PHPUnit nel contesto della tua installazione MAMP. Per testarlo, esegui il seguente comando nella sessione del terminale:

$ /Applications/MAMP/bin/php/php5.3.6/bin/phpunit --version

Dopo di che dovrebbe essere visualizzato il seguente messaggio:

PHPUnit 3.6.11 di Sebastian Bergmann.

Nota: Se si verifica un errore del terminale che menziona "unserialize ()", esiste una discrepanza tra la configurazione della pera e la versione della pera. Per risolvere, emettere il seguente comando (questo semplicemente rinomina il file se si desidera ripristinarlo in un secondo momento):

$ /Applications/MAMP/bin/php/php5.3.6/conf/pear.conf /Applications/MAMP/bin/php/php5.3.6/conf/pear.conf.old

Installazione dei test di WordPress

Ora che PHPUnit è installato e funzionante, è ora di configurare il framework di test di WordPress. Puoi prendere il pacchetto da GitHub. Se sei a tuo agio nel clonare il repository, sentiti libero di farlo; altrimenti, scarica semplicemente un archivio del progetto ed estrailo nel test directory che abbiamo creato in precedenza in questo articolo.

Prima di eseguire effettivamente i test, dovremo creare un file di configurazione per eseguire test di WordPress. Questo è esattamente come modificare il wp-config.php file con una nuova installazione di WordPress, ma lo faremo invece per un database di test. Di seguito, ho incollato il mio file di configurazione e ho aggiunto commenti. Sarò sicuro di affidarlo anche al repository GitHub di questo articolo.

/ * Percorso della base di codici WordPress in relazione alla posizione di questi test. Dal momento che sono inclusi nel nostro plugin, facciamo riferimento ad alcune directory sopra. * / define ('ABSPATH', '... / ... / ... / ... / ... /'); / * Il nome del database per l'esecuzione dei test. Assicurati che questo sia un database solo per i test poiché è stato creato e cestinato durante i test. * / define ('DB_NAME', 'throwaway'); / * Le solite credenziali per un database locale. * / define ('DB_USER', 'root'); define ('DB_PASSWORD', "); define ('DB_HOST', 'localhost'); define ('DB_CHARSET', 'utf8'); define ('DB_COLLATE',"); define ('WPLANG', "); define ('WP_DEBUG', true); define ('WP_DEBUG_DISPLAY', true); define ('WP_TESTS_DOMAIN', 'localhost'); define ('WP_TESTS_EMAIL','[email protected] '); define (' WP_TESTS_TITLE ',' Test Blog '); / * Non è preoccupato di testare reti o sottodomini, quindi impostare su false. * / define (' WP_TESTS_NETWORK_TITLE ',' Test Network '); define (' WP_TESTS_SUBDOMAIN_INSTALL ', false); $ base = '/'; / * Cron tenta di fare una richiesta HTTP al blog, che fallisce sempre, perché i test vengono eseguiti solo in modalità CLI * / define ('DISABLE_WP_CRON', true); / * Inoltre no interessato a testare il multisito per questo progetto, quindi impostare su false. * / define ('WP_ALLOW_MULTISITE', false); if (WP_ALLOW_MULTISITE) define ('WP_TESTS_BLOGS', 'primo, secondo, terzo, quarto'); if (WP_ALLOW_MULTISITE &&! defined ('WP_INSTALLING')) define ('SUBDOMAIN_INSTALL', WP_TESTS_SUBDOMAIN_INSTALL); define ('MULTISITE', true); define ('DOMAIN_CURRENT_SITE', WP_TESTS_DOMAIN); define ('PATH_CURRENT_SITE', '/'); d efine ('SITE_ID_CURRENT_SITE', 1); define ('BLOG_ID_CURRENT_SITE', 1);  $ table_prefix = 'wp_';

Per verificare di aver installato correttamente i test, puoi eseguire il seguente comando nel tuo terminale:

$ /Applications/MAMP/bin/php/php5.3.6/bin/phpunit tutti

Se si verifica un errore, è perché i test di WordPress stanno cercando di utilizzare un socket per il database MySQL piuttosto che quello utilizzato da MAMP. Per risolvere questo problema, è necessario creare un collegamento simbolico dal socket di MAMP alla posizione su disco utilizzata dai test dell'unità. Emetti i seguenti comandi nella sessione del terminale:

$ sudo mkdir / var / mysql $ sudo ln -s /Applicazioni/MAMP/tmp/mysql/mysql.sock/var/mysql/mysql.sock $ sudo ln -s /Applicazioni/MAMP/tmp/mysql/mysql.sock / var / mysql / mysql.sock

Ora prova a eseguire nuovamente i test e dovresti vedere qualcosa come il seguente screenshot.

Anche in questo caso, il tuo chilometraggio può variare in base alla piattaforma che utilizzi, quindi sentiti libero di condividere la tua esperienza nei commenti o persino di impegnarti nel file README su GitHub, in modo che altri possano avere un punto di riferimento.

A questo punto, siamo pronti per iniziare a sviluppare il nostro plugin e scrivere i nostri test unitari. Il codice sopra è stato aggiunto a GitHub e lo svilupperò mentre lavoriamo al prossimo articolo della serie. Nel frattempo, assicurati di avere la configurazione dell'ambiente e di essere pronto per iniziare lo sviluppo. Nel prossimo articolo, inizieremo veramente a scrivere test, a costruire il nostro plugin ea vedere l'intero progetto venire insieme dall'inizio alla fine.


risorse

  • PHPUnit
  • Test di WordPress
  • Ciao lettore