Ghidul începătorului pentru testarea unităților Ce este unitatea de testare?

În funcție de fundalul dvs., ați putea sau nu ați auzit despre testarea unității, dezvoltarea bazată pe teste, dezvoltarea bazată pe comportament sau alt tip de metodologie de testare. De multe ori, aceste metodologii se aplică în contextul sistemelor sau aplicațiilor software mai mari și mai puțin în contextul proiectelor bazate pe WordPress (deși este a se imbunatati!)

Sincer, comunitatea de dezvoltare este puțin împărțită pe testarea automată a software-ului - aveți niște oameni care cred că ar trebui să aibă teste pentru 100% din codul dvs., unii cred că 80% este suficient, aproximativ 50%, iar unele sunt mulțumiți 20% sau cam asa ceva. Indiferent de situație, acest articol nu se referă la argumentarea unui caz pentru nivelul testelor pe care ar trebui să-l aveți în proiectul dvs. și nici nu se ocupă de testarea generală a software-ului.

În schimb, vom examina ceea ce este necesar pentru a te ridica și a alerga cu o unitate care testează proiectele de dezvoltare WordPress. Vom aborda această serie din perspectiva unui începător absolut, astfel încât să putem înțelege beneficiile testării unităților și cum să configuram mediul înconjurător pentru a sprijini bibliotecile de testare a unităților, astfel încât să putem începe să facem acest lucru în activitatea noastră viitoare. În cele din urmă, toate acestea vor fi realizate prin construirea și testarea unui plugin simplu și testabil de la bază.


Ce este unitatea de testare?

Înainte de a începe să ne stabilim mediul și să scriem orice cod, să definim exact ce teste de unitate este, de ce merită să facem și cum să începem să o încorporăm în proiectele noastre.

La un nivel înalt, testarea unității se referă la practica de testare a anumitor funcții și zone - sau unități - ale codului nostru. Acest lucru ne oferă posibilitatea de a verifica dacă funcțiile noastre funcționează conform așteptărilor. Asta inseamna ca pentru orice functie si dat un set de intrari, putem determina daca functia isi returneaza valorile corecte si se va ocupa cu gratie de defectiunile in timpul executarii ar trebui sa fie furnizate date nevalide.

În cele din urmă, acest lucru ne ajută să identificăm eșecurile din algoritmii și / sau logica noastră pentru a îmbunătăți calitatea codului care compune o anumită funcție. Pe măsură ce începeți să scrieți tot mai multe teste, sfârșesc să creați o serie de teste pe care să le puteți rula în orice moment în timpul dezvoltării, pentru a verifica în permanență calitatea muncii dvs..

Un al doilea avantaj pentru abordarea dezvoltării dintr-o perspectivă a unității de testare este că probabil veți fi scris cod care este ușor de testat. Deoarece testarea unității necesită ca codul dvs. să fie ușor de testat, înseamnă că codul dvs. trebuie să susțină acest tip particular de evaluare. Prin urmare, este mai probabil să aveți un număr mai mare de funcții mai mici, mai concentrate, care oferă o singură operație pe un set de date, decât funcții mari care efectuează o serie de operațiuni diferite.

Un al treilea avantaj pentru scrierea testelor unitare solide și a codului bine testat constă în faptul că puteți preveni schimbările viitoare de la ruperea funcționalității. Din moment ce testați codul în timp ce introduceți funcționalitatea dvs., veți începe să dezvoltați o suită de cazuri de testare care pot fi executate de fiecare dată când lucrați pe logica dvs. Când se întâmplă un eșec, știi că ai ceva de rezolvat.

Bineînțeles, acest lucru se întâmplă în detrimentul investiției timpului pentru a scrie o serie de teste la începutul dezvoltării, dar pe măsură ce proiectul crește, puteți rula pur și simplu testele pe care le-ați dezvoltat pentru a vă asigura că funcționalitatea existentă nu este ruptă atunci când este nouă funcționalitate a introdus.


Planificarea Pluginului nostru

Una dintre cele mai bune modalități de a începe cu testarea unităților este să faceți acest lucru în contextul unei aplicații practice. De-a lungul acestei serii din două părți vom construi un simplu plugin și vom scrie teste pentru a acoperi toate funcționalitățile.

Mai întâi, să planificăm proiectul: Vom scrie un plugin mic care va adăuga un mesaj simplu în partea superioară a unei singure posturi care salută utilizatorul în funcție de modul în care a găsit o anumită postare pe blog. Ideea este foarte asemănătoare cu programul Welcome Reader, dar nu va include aproape atât de multă funcționalitate - construim pur și simplu un demo pentru a afla instrumentele de testare.

Oricum, iată cum va funcționa plugin-ul:

  • Dacă utilizatorul navighează către site-ul de la Google, vom da un mesaj unic
  • Dacă utilizatorul navighează pe site de pe Twitter, vom da un mesaj unic
  • În caz contrar, nu vom afișa nimic

Destul de bine, nu? Aceasta va oferi, de asemenea, o bază pe care să adăugați mesaje personalizate pentru alte servicii și să extindeți în continuare abilitățile noastre de testare a unităților, dacă doriți să faceți acest lucru.


Pregătirea mediului

Pentru a ne testa codul, vom avea nevoie de o bibliotecă terță parte pe care o includem în proiectul nostru, care va executa efectiv testele pe care le scriem. În această serie, vom folosi PHPUnit. Puteți lua o copie aici.

Apoi, trebuie să ne pregătim mediul de dezvoltare, să eliminăm plugin-ul nostru și să includem bibliotecile necesare pentru testarea codului nostru. Acest articol presupune că aveți deja o instalare funcțională WordPress.

Deci, în primul rând, să pregătim directorul plugin:

  • În / Wp-content / plugins crea un director numit Hello-Reader
  • În Hello-Reader director, creați un fișier numit plugin.php și un director numit teste
  • Vom elimina plugin-ul pentru a vă asigura că WordPress văd în mod corespunzător proiectul nostru
  • Vom importa bibliotecile care testează unitatea, astfel încât să putem începe să scriem testele noastre

Iată scheletul plugin-ului pe care îl vom crea:

/ * Nume Plugin: URI Plugin Hello Reader: http://github.com/tommcfarlin/Hello-Reader Descriere: Un plugin simplu folosit pentru a demonstra testarea unităților în contextul WordPress. Versiune: 1.0 Autor: Tom McFarlin Autor URI: http://tom.mcfarl.in Autor: Email: [email protected] Licență: Copyright 2012 Tom McFarlin ([email protected]) Acest program este software liber; îl puteți redistribui și / sau modifica în conformitate cu termenii GNU General Public License, versiunea 2, publicată de Fundația pentru Software Liber. Acest program este distribuit în speranța că va fi util, dar FĂRĂ NICI O GARANȚIE; fără nici măcar garanția implicită de VANDABILITATE sau de FITNESS PENTRU UN SCOP SPECIC. Pentru mai multe detalii, consultați Licența publică generală GNU. Ar fi trebuit să fi primit o copie a Licenței Publice Generale GNU împreună cu acest program; dacă nu, scrieți la Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 SUA * / / Creați doar o instanță a plugin-ului dacă nu există deja în GLOBALS dacă (! array_key_exists ('hello-reader', $ GLOBALS)) clasa Hello_Reader function __construct ()  // constructor final // // clasa de sfarsit // Pastreaza o referinta la plugin-ul din GLOBALS, GLOBALS ['hello-reader'] = noul Hello_Reader ();  // if end

În acest moment, ar trebui să navigați la "Plugin-urile" din Tabloul de bord WordPress și să vedeți o intrare pentru "Hello Reader". Evident, acest plugin nu face nimic încă - vom fi concentrându-ne pe acest lucru (de asemenea, de ce folosim $ GLOBALS array) în următorul articol.

În sfârșit, să configuram cadrul de testare astfel încât să putem scrie testele noastre. În primul rând, vom avea nevoie să instalați PHPUnit și apoi va trebui să instalați Testele WordPress.

Notă: Următoarea secțiune va necesita să lucrați cu terminalul și probabil va trebui să emiteți câteva comenzi pentru a crea legături simbolice. Am încercat să fac acest lucru cât mai simplu și mai ușor posibil, dar fiecare sistem de operare și configurație vor fi diferite. Urmați cu atenție și vă invit să partajați instrucțiunile pentru sistemele de operare în comentariile dvs..

Instalarea PHPUnit

PHPUnit este un pachet cadru de testare unitate special pentru PHP. Testele WordPress și cadrul pe care vom folosi pentru scrierea testelor WordPress depind de acest lucru. Din păcate, instalarea variază în funcție de platforma dvs. În prezent rulez Mac OS X Lion cu MAMP Pro și PHP 5.3.6. Dacă aveți o altă platformă, asigurați-vă că consultați documentația și / sau nu ezitați să partajați pașii dvs. în comentarii.

Mai întâi deschideți un terminal și actualizați pere (aceasta este facilitatea pe care o vom folosi pentru a instala PHPUnit):

$ cd /Applications/MAMP/bin/php/php5.3.6/bin
$ sudo ./pear upgrade pere

Apoi, instruiește Pear să folosească depozitele pe care le vom specifica în terminal:

$ sudo /Aplicații/MAMP/bin/php/php5.3.6/bin/pear config-set auto_discover 1

După aceea, instalați Pear prin emiterea următoarei comenzi:

$ sudo /Applications/MAMP/bin/php/php5.3.6/bin/pear instala pear.phpunit.de/PHPUnit

Aceasta va instala PHPUnit în contextul instalării MAMP. Pentru a le testa, executați următoarea comandă în sesiunea terminală:

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

După care trebuie afișat următorul mesaj:

PHPUnit 3.6.11 de Sebastian Bergmann.

Notă: Dacă întâmpinați o eroare terminal care menționează "unserialize ()", atunci există o discrepanță între configurația de pere și versiunea dvs. de pere. Pentru a rezolva, lansați următoarea comandă (acest lucru redenumeste pur și simplu fișierul dacă doriți să-l restabiliți mai târziu):

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

Instalarea testelor WordPress

Acum, când am instalat și funcționează PHPUnit, este timpul să configurați cadrul de testare WordPress. Puteți lua pachetul de la GitHub. Dacă sunteți confortabil clonarea depozitului, atunci nu ezitați să faceți acest lucru; altfel, pur și simplu descărcați o arhivă a proiectului și extrageți-l în Test director pe care l-am creat mai devreme în acest articol.

Înainte de a executa efectiv testele, va trebui să creați un fișier de configurare pentru testele WordPress. Aceasta este exact ca editarea wp-config.php fișier cu o nouă instalare WordPress, dar o facem pentru o bază de date de testare. Mai jos, mi-am lipit fișierul de configurare și am adăugat comentarii. De asemenea, voi fi sigur că vă veți angaja și în depozitul GitHub al acestui articol.

/ * Calea spre codul WordPress în legătură cu localizarea acestor teste. Deoarece acestea sunt incluse în pluginul nostru, ne referim la câteva directoare de mai sus. * / define ("ABSPATH", "... / ... / ... / ... / ... /"); / * Numele bazei de date pentru efectuarea testelor. Asigurați-vă că aceasta este o bază de date doar pentru testare, deoarece este creată și trasă în timpul testelor. * / define ('DB_NAME', 'throwaway'); / * Acreditările obișnuite pentru o bază de date locală. * / define ('DB_USER', 'root'); define ('DB_PASSWORD', '); define (' DB_HOST ',' localhost '); define (' DB_CHARSET ',' utf8 '); define ('WP_TESTS_DOMAIN', 'localhost'), define ('WP_TESTS_EMAIL','[email protected] '), define (' WPLANG ', '), definește (' WP_TESTS_NETWORK_TITLE ',' Test Network '), definește (' WP_TESTS_SUBDOMAIN_INSTALL ',' false); $ base = '/'; / * Cron încearcă să facă o solicitare HTTP la blog, care întotdeauna eșuează, deoarece testele sunt executate doar în modul CLI * / define ('DISABLE_WP_CRON', true); (WP_ALLOW_MULTISITE) define ('WP_TESTS_BLOGS', 'primul, al doilea, al treilea, al patrulea'); dacă (WP_ALLOW_MULTISITE) &&! definit ('WP_INSTALLING')) define ('SUBDOMAIN_INSTALL', WP_TESTS_SUBDOMAIN_INSTALL), defini ('MULTISITE', true); efine ("SITE_ID_CURRENT_SITE", 1); define ('BLOG_ID_CURRENT_SITE', 1);  $ table_prefix = 'wp_';

Pentru a verifica dacă ați instalat corect testele, puteți rula următoarea comandă în Terminal:

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

Dacă întâmpinați o eroare, este pentru că testele WordPress încearcă să utilizeze un soclu la baza de date MySQL, mai degrabă decât pe cea utilizată de MAMP. Pentru a rezolva acest lucru, trebuie să creați o legătură simbolică de la mufa MAMP la locația de pe disc pe care o folosesc testele unității. Eliberați următoarele comenzi în sesiunea terminală:

$ sudo mkdir / var / mysql $ sudo ln -s /Aplicații/MAMP/tmp/mysql/mysql.sock/var/mysql/mysql.sock $ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock / var / mysql / mysql.sock

Acum, încercați să efectuați din nou testele și ar trebui să vedeți ceva asemănător capturii de ecran următoare.

Din nou, kilometrajul dvs. poate varia în funcție de platforma pe care o utilizați, astfel încât să vă simțiți liber să vă împărtășiți experiența în comentarii sau chiar să vă angajați la fișierul README de pe GitHub, de asemenea, pentru ca alții să aibă un punct de referință.

În acest moment, suntem gata să începem să construim pluginul și să scriem testele unității. Codul de mai sus a fost adăugat la GitHub și îl voi construi pe măsură ce lucrăm prin următorul articol din serie. Între timp, asigurați-vă că vă asigurați setarea mediului și că sunteți gata să începeți dezvoltarea. În următorul articol, vom începe de fapt să scriem teste, să construim pluginul nostru și să vedem că întregul proiect se reunește de la început până la sfârșit.


Resurse

  • PHPUnit
  • Teste WordPress
  • Hello Reader
Cod