Ghidul începătorului pentru testarea unităților construirea de teme testabile

În primele două articole din această serie, am analizat la nivel înalt ce teste de unitate este și cum se aplică în contextul dezvoltării plugin-urilor. Desigur, există mai mult pentru WordPress decât scrierea pluginurilor, nu-i așa? O parte semnificativă a unei slujbe de dezvoltatori WordPress - pentru unii este cel mai parte importantă - este dezvoltarea temelor.

Astfel, în acest articol, vom examina cum să dezvoltăm teme testabile. În mod specific, vom examina modul în care temele sunt diferite de pluginuri și apoi vom scrie o temă extrem de simplă, care va fi utilizată pentru a demonstra principiile de testare a unităților și care poate fi aplicată în dezvoltarea viitoare.


Înțelegerea modului în care temele sunt diferite de pluginuri

Înainte de a începe să creați o temă sau să revizuiți orice cod, este important să înțelegeți diferența în dezvoltarea temelor și pluginurilor. În primul rând, pluginurile pot fi scrise în două moduri:

  • Ca obiect care încapsulează un set de funcții (ceea ce am făcut în acest articol).
  • Ca o simplă colecție de funcții

Ambele metode fac același lucru: adică folosesc o colecție de funcții și filtre pentru a introduce noi funcționalități în WordPress. Diferența principală este modul în care sunt încapsulate funcțiile.

Dar când vine vorba de dezvoltarea temelor, există într-adevăr o singură cale de a dezvolta o temă și anume prin utilizarea unei colecții de funcții definite în functions.php. Aceasta prezintă următoarele două provocări pentru scrierea testelor de unitate pentru teme:

  • Deoarece tema nu este orientată pe obiect, nu există nicio modalitate pentru a stoca într-adevăr obiectul într-un matrice cum am făcut-o în ultimul articol
  • Trebuie să determinăm o modalitate de a scrie și de a evalua funcțiile temei noastre care pot funcționa independent de încărcarea unei teme într-un browser

Deoarece temele bune utilizează o colecție de filtre și acțiuni, vom crea o temă care urmează acele bune practici și pentru că accentul pus de acest articol rezidă în temele unității de testare, se va pune accent mai mult pe scrierea testelor, creând o temă bună, foarte funcțională.


Pregătirea pentru testul unității

Înainte de a codifica, să inițializăm directorul proiectului nostru. Trebuie să configurați scheletul temei astfel încât, în directorul temă WordPress, să creați un nou director pentru temă. Mina este chemată Basic-Tema. Adăugați următoarele fișiere (le vom completa mai târziu):

  • footer.php
  • functions.php
  • header.php
  • index.php
  • style.css

Hai să mergem mai departe și să înșfăcăm foaia de stil astfel încât WordPress să recunoască tema și să ne permită să o activăm din tabloul de bord. Pentru aceasta, adăugați următorul cod:

 / * Tema nume: Tema tematică de bază URI: TODO Versiune: 1.0 Descriere: O temă de bază folosită pentru a demonstra cum să scrieți teste unitare pentru teme. Autor: Tom McFarlin Autor URI: http://tommcfarlin.com Licență: GNU General Public License v2.0 Licență URI: http://www.gnu.org/licenses/gpl-2.0.html * /

Pentru a fi completă, continuați și adăugați deschiderea și închiderea etichetelor PHP la începutul și la sfârșitul fișierului funcțiilor. Acest lucru ne va face să ne asigurăm că avem temele pregătite atunci când începem să scriem funcții tematice mai târziu în acest articol.

Și adăugați un nou director numit teste. Aici, va trebui să plasăm testul WordPress.


Testele WordPress: Un cuvânt rapid

Mai devreme în această serie am furnizat o legătură cu testele WordPress situate pe GitHub. Deși aceste teste sunt bine de folosit, cele mai recente teste WordPress, menținute automat, se află în acest depozit Subversion.

Dacă sunteți un dezvoltator avansat, vă recomand să verificați aceste teste; cu toate acestea, dacă sunteți doar începutul cu unitatea de testare - nici o problema! Am furnizat tot codul sursă - inclusiv Testele WordPress - într-un depozit GitHub pe care îl veți putea descărca, referi și utiliza pentru propriile dvs. proiecte.

Odată ce testele sunt instalate, directorul temei dvs. ar trebui să arate astfel:

Deoarece PHPUnit trebuie executat din linia de comandă, va trebui să deschideți o sesiune de terminal (sau un prompt de comandă), navigați la teste și ar trebui să le puteți rula utilizând următoarea comandă (ca exemplu):

 testele phpunit / test_user_capabilities.php

Terminalul dvs. ar trebui apoi să emită ceva de genul acesta:

Atenție: Dacă nu reușiți să efectuați testele, vă rugăm să consultați înapoi primul articol din serie pentru a verifica configurația. În plus, kilometrajul dvs. poate varia în funcție de sistemul dvs. de operare, serverul web și configurația mașinii locale. Dacă sfârșesc prin a face ceva diferit, vă rugăm să împărtășiți notele dvs. în comentarii pentru a le ajuta pe alții.

Teme de bază: O temă WordPress testabilă

În acest moment, să mergem mai departe și să activam tema din Tabloul de bord. Tema ar trebui să fie activată (dacă nu, asigurați-vă că nu aveți caractere neregulate în fișierele șablon). Dacă încercați să vizualizați tema, acesta va afișa în mod natural un ecran alb.

Înainte de a scrie orice teste, hai să mergem înainte și să populeze fișierele noastre șablon cu un pic de conținut doar așa putem avea ceva apărea pe interfață.

În header.php, adăugați următorul cod:

       <?php wp_title("); ?>   > 
Acesta este antetul.

În index.php, adăugați următorul cod:

  
Acesta este conținutul.

Si in footer.php, adăugați următorul cod:

 
Acesta este subsolul.

Simplu, știu, dar asta ne va da suficient pentru a lucra cu fiecare dată când începem să scriem teste. Salvați-vă munca, examinați tema în browser și ar trebui să vedeți acest lucru:


Sisteme de testare

Activarea temei de testare

În tine teste director, creați un fișier numit test_basic_theme.php și stubați fișierul pentru a arăta astfel:

 // Includeți funcțiile pentru tema include_once ('... /functions.php'); clasa Test_Basic_Theme extinde WP_UnitTestCase  // clasa de sfârșit

Mai sus, definim o clasă care va fi utilizată pentru a încheia toate testele unității temelor noastre.

Mai întâi, să definim înființat metodă. înființat metoda este o funcție oferită de cadrul de testare WordPress și o putem folosi pentru a declanșa anumite funcții înainte de a începe testele. De exemplu, atunci când testele WordPress se execută, se întâlnesc cu tema prestabilită - adică, Twenty Eleven. În cazul nostru, dorim să executăm testele pe tema proprie.

Pentru a face acest lucru, va trebui să îi spunem WordPress să schimbe temele înainte de a rula celelalte teste. Deoarece acest lucru trebuie să se întâmple înainte de efectuarea testelor, acesta trebuie definit în înființat metodă. Are sens?

Deci, să ne scriem înființat metodă:

 funcția setUp () părinte :: setUp (); switch_theme ("temă de bază", "temă de bază");  // configurare finală

Încă o dată, să executăm testele noastre. Putem face acest lucru executând aceeași comandă ca atunci când am setat inițial testul:

 testele phpunit / test_basic_theme.php

Permițând că ați făcut totul în mod corect, ar trebui să observați un eșec atunci când testul rulează:

Mesajul de eroare este clar:Nu s-au găsit teste în clasa "Test_Basic_Theme""Deci, haideți să atenuăm acest lucru și să scrieți primul test pentru tema: poate fi ceva extraordinar de simplu, dar nu uitați de postul anterior pe care nu dorim să îl testați doar calea optimă, dar și calea de eșec.

Ca atare, trebuie să testați că tema de bază este activă și că Twenty Eleven nu este activă. Pentru a face acest lucru, vom folosi metoda assertTrue și metoda assertFalse și vom face acest lucru în contextul a două funcții. Uitați-vă la codul de mai jos și actualizați fișierul de testare în consecință:

 funcția testActiveTheme () $ this-> assertTrue ('Temă de bază' == get_current_theme ());  // end testThemeInitializarea funcției testInactiveTheme () $ this-> assertFalse ('Twenty Eleven' == get_current_theme ());  // test endInactiveTheme

Încă o dată, executați testele și ar trebui să le vedeți că se execută verde. Bine, bine?

Aceasta este o funcționalitate relativ simplă, deci să luăm în considerare câteva funcții avansate pe care tema noastră le-ar putea avea.

Testați-vă că jQuery este încorporată

În afara căsuței, Tema de bază nu include jQuery, așa că o vom include în tema noastră. Dacă vă amintiți din posturile anterioare, metodologia adecvată de testare a unităților este următoarea:

  1. Scrieți testul
  2. Executați testul (și acesta va eșua)
  3. Scrieți codul necesar pentru efectuarea testului
  4. Executați testul (și ar trebui să treacă, permițând pasul 3 să fie făcut corect)

Deci, hai să facem exact asta pentru jQuery.

În primul rând, trebuie să scriem un test pentru a determina dacă jQuery este încărcat. Vom folosi funcția WordPress wp_script_is. Deoarece tema trece prin ciclul normal de viață al paginii într-un browser, va trebui să spunem WordPress manual să încarce jQuery utilizând funcția do_action.

 funcția testjQueryIsLoaded () $ this-> assertFalse (wp_script_is ('jquery')); do_action ('wp_enqueue_scripts'); $ this-> assertTrue (wp_script_is ('jquery'));  // end testjQueryIsLoaded

Înainte de a merge mai departe, este important să notăm aici: Nu-mi place să plasez mai multe afirmații într-o singură funcție deoarece cred că fiecare funcție ar trebui să servească pentru a testa un singur scop; cu toate acestea, există excepții. Aici, trebuie să ne asigurăm că jQuery nu este încărcate înainte de a apela do_action.

Oricum, conduceți testul și acesta va eșua. Așa că trebuie să adăugăm codul functions.php care va asigura că jQuery este adăugat la tema noastră. Pentru aceasta, includeți următoarea funcție în fișierul de funcții:

 funcția basic_add_jquery () wp_enqueue_script ('jquery');  // end basic_remove_jquery add_action ('wp_enqueue_scripts', 'basic_add_jquery');

În cele din urmă, executați testul și ar trebui să fie verde. Destul de ușor, nu-i așa??

Testați meta descrierile

Să presupunem că dorim să includem o descriere meta implicită pe pagina principală. În cel mai simplu caz, nu va fi nimic mai mult decât descrierea blogului. Deci, urmând metodologia noastră prezentată mai sus, să introducem o funcție pentru a testa că șirul de meta descriere adăugat elementului head corespunde cu ceea ce așteptăm:

 funcția testBasicMetaDescription () $ meta_description = '„; $ this-> expectOutputString ($ meta_description, basic_meta_description ());  // end testBasicMetaDescription

Rulați-o - va eșua. Rețineți că nu utilizez standardul assertTrue, assertFalse funcții - vor fi mai multe detalii despre acest lucru într-un moment. Acum, să introducem următoarea funcție în functions.php:

 funcția basic_meta_description () echo '„;  // end basic_meta_description add_action ('wp_head', 'basic_meta_description');

Observați că această funcție se cuplează în wp_head acțiune. Pentru a scrie meta descrierea în elementul de cap, trebuie ecou mai degrabă decât șirul întoarcere șirul.

Acum, rețineți că în testul de mai sus pe care îl folosim expectOutputString. Acest lucru este util atunci când trebuie să evaluăm o funcție care să fie echo lui un șir (mai degrabă decât se intoarce o sfoară). Din moment ce wp_head acțiunea va reveni la o cantitate semnificativă de date (adică întregul element de cap), avem nevoie doar de o evaluare a meta-descrierii returnate. Și de aceea, mai degrabă decât să sunați do_action ('wp_head'), Pur și simplu am sunat funcția însăși și evaluând rezultatul împotriva a ceea ce aștept să aibă.

Încă o dată, rulați PHPUnit, iar testele dvs. ar trebui să treacă.


Testați toate lucrurile

În mod clar, am zgâriat doar suprafața a ceea ce testarea unității poate face pentru dezvoltarea temelor noastre. Există încă multe lucruri care pot fi testate - nici măcar nu am aruncat o privire asupra testelor The Loop, a diferitelor modalități de evaluare a formatelor postale sau chiar a modului de examinare a comentariilor.

Tine minte asta este un ghid pentru începători și cele trei articole acoperă o mulțime de teren.

Cu toate acestea, principiile sunt aceleași: este o chestiune de a vă asigura că programați focul funcției sau acțiunii adecvate și evaluați rezultatele sale în ambele cazuri așteptate și neașteptate.

În cele din urmă, puteți găsi întregul proiect împreună cu funcțiile documentate în acest depozit GitHub.


Resurse

Iată un rezumat al resurselor utilizate în acest articol:

  • Ce este unitatea de testare?
  • Construirea unui Plugin Testabil
  • PHPUnit
  • Testele oficiale WordPress
  • assertTrue
  • assertFalse
  • wp_script_is
  • do_action
  • wp_head
  • expectOutputString
  • Temă de bază pe GitHub
Cod