Testarea funcțională de bază cu crawlerul Symfony 2

Testarea aplicațiilor dvs. web este unul dintre cele mai bune lucruri pe care le puteți face pentru a vă asigura sănătatea, siguranța și securitatea, atât pentru aplicație, cât și pentru vizitatorii aplicației dvs. Symfony 2 oferă o suită completă de testare pentru integrare pe care o puteți utiliza pentru a vă asigura că aplicațiile dvs. rulează la fel cum vă așteptați. Astăzi vom analiza modul în care putem utiliza Symfony 2 și PHPUnit, cadrul de testare pe care îl utilizează, pentru a scrie teste funcționale de bază folosind Crawler.

Instalare

Înainte de a începe orice fel de testare, să ne configurați proiectul descărcând cadrul Symfony 2, configurați-l și apoi descărcați și PHPUnit. 

Instalarea Symfony 2

Cel mai bun mod de a descărca Symfony 2 este de a utiliza Compozitor. Dacă nu știți încă ce este Compozitor, asigurați-vă că ați completat câteva dintre cele mai minunate articole și cursuri Tuts + pe aceasta, vă vor aduce rapid. 

Mai întâi vom dori să ne deschidem interfața Terminal sau linia de comandă pentru a putea emite câteva comenzi compozitor. Odată ce ați terminat în terminalul dvs., schimbați directoarele în webroot-ul dezvoltării locale. Pentru mine, pe OS X, asta va fi al meu ~ / Site-uri director:

cd ~ / Site-uri

Odată ajuns în directorul propriu, putem folosi acum Compozitor pentru a crea un nou proiect Symfony 2 care va descărca și instala cadrul și multe dintre dependențele sale. 

compozitor crea-proiect simfony / frame-edition-crawling ediție standard / '~ 2.5'

Această comandă îi spune compozitorului să creeze un nou proiect utilizând cadrul Symfony 2 într-un nou nume de director crawling/, și apoi specificăm și versiunea exactă de descărcat, versiunea ~ 2.5. Dacă aceasta este prima dată când descărcați cadrul, acest lucru poate dura ceva timp, deoarece există o mulțime de biblioteci de descărcat pentru toți furnizorii. Deci, poate doriți să faceți o pauză rapidă și să vă întoarceți în câteva minute. 

După terminarea descărcării, Terminalul dvs. ar trebui să afișeze acum un expert interactiv care vă va ajuta să configurați configurația. Este foarte explicativ, doar introduceți-vă propriile acreditări sau luați defaults așa cum am făcut:

Odată ce introduceți informațiile config, Symfony 2 este descărcat, instalat și gata de utilizare. Acum trebuie doar să obținem PHPUnit pentru a putea testa codul nostru.

Instalarea PHPUnit

Pentru a descărca PHPUnit putem folosi o comandă wget în Terminalul nostru pentru a prelua .Phar fișier sau doar descărcați-l de pe site-ul lor, este de până la tine:

wget https://phar.phpunit.de/phpunit.phar

Cu .Phar descărcat, acum trebuie să-i ajustăm permisiunile și să-l mutăm într-o locație unde Terminalul sau linia de comandă și PHP va avea acces la el. Pe mașina mea, folosind OS X, am mutat acest lucru în mine / / Local / bin usr director. De asemenea, am redenumit dosarul pentru a fi just PHPUnit așa că nu trebuie să-mi fac griji în legătură cu extensia atunci când încerc să-mi execut testele, economisind puțin timp:

chmod + x phpunit.phar sudo mv phpunit.phar / usr / local / bin / phpunit

Acum ar trebui să putem verifica dacă PHPUnit a fost instalat și este accesibil prin Terminal executând PHPUnit comanda. Ar trebui să vedeți ceva de genul:

Crearea pachetului de crawlere

Acum avem nevoie de un pachet pentru a ne ține aplicația și codul de testare. Să creăm una folosind consola Symfony 2, din Terminalul nostru:

cd ~ / Site-uri / crawling app / consola php generează: bundle --namespace = Crawling / FtestingBundle --format = yml

Aici, mai întâi schimbăm directoarele în noi crawling proiect și apoi utilizați consola pentru a genera un nou pachet. De asemenea, specificăm numele vânzătorului și numele grupului, separat printr-un slash înainte (/). În cele din urmă, îi spunem să utilizeze YAML ca format pentru configurația noastră. Acum, puteți folosi orice formular doriți dacă nu doriți să utilizați YAML și puteți să vă numiți, de asemenea, pachetul pe care îl preferați, atâta timp cât îl dați mai întâi unui nume de furnizor și finalizați numele pachetului cu sufixul Pachet.

După ce ați executat comanda de mai sus, vom obține din nou un vrăjitor frumos pentru a ajuta la finalizarea instalării pachetului. Tocmai am lovit introduceți pentru fiecare prompt pentru a lua implicit, deoarece acest lucru păstrează întregul proces frumos și simplu și netezește orice probleme de cale prin punerea fișierelor în locații personalizate. Iată o captură de ecran a vrăjitorului meu pachet:

Cum să executați testele

Ok, avem Symfony 2, PHPUnit și pachetul nostru; Cred că suntem gata să învățăm acum să conducem testele PHPUnit împreună cu Symfony. De fapt, este foarte ușor, doar schimbați directoarele în dvs. crawling proiect și eliberarea phpunit -c app / comanda pentru a rula toate testele aplicatiei. Ar trebui să obțineți următorul rezultat în Terminalul dvs.:

Când am generat pachetul nostru, a generat și un mic exemplu de cod pentru noi. Testul pe care îl vedeți a funcționat mai sus face parte din acel exemplu de cod. Puteți vedea că avem un bar verde, care ne spune că testele noastre au trecut. Acum chiar deasupra Timp: 1,97 secunde, avem de asemenea un singur punct care ne arată că a fost fugit doar un test. În barul verde avem statutul nostru O.K precum și cât de multe teste și afirmații au fugit. 

Deci, executând doar această comandă, știm că aplicația Symfony 2 este instalată, rulează corect și testată! 

Crearea unui controler, șablon și rută

Acum avem nevoie de un cod de aplicație real pe care îl putem testa. 

Controlerul

Să începem prin crearea unui nou dosar de clasă de controler și a unei acțiuni de controler. În interiorul dvs. crawling proiect, sub src / crawling / FtestingBundle / Controler, creați un nou fișier numit CrawlingController.php și introduceți în el următoarele:

În acest fișier definim doar structura de bază a controlorului de clasă, oferindu-i spațiul de nume propriu și incluzând cele necesare Controlor clasa părinților. 

Acțiunile controlorului

În interiorul clasei noastre, să definim acum cele două acțiuni ale controlorului nostru simplu. Ei vor face doar două pagini diferite: a Acasă pagina și an alte pagină:

funcția publică homeAction () return $ this-> render ('CrawlingFtestingBundle: Crawling: home.html.twig');  funcția publică otherAction () return $ this-> render ('CrawlingFtestingBundle: Crawling: other.html.twig'); 

Șabloanele

Acum trebuie să creăm fișiere șablon pentru aceste acțiuni ale controlorului. Sub src / crawling / Ftesting / Resurse / vizualizări, creați un nou director numit Crawling să ne ținem CrawlingController's fișiere șablon. În interior, mai întâi creați home.html.twig fișier, cu următoarele HTML în interiorul:

Crawling Home Page

Iată pagina noastră de pornire cu crawlere.

Vă rugăm să vizitați și această altă pagină!

Aceasta conține doar câteva coduri de bază și un link către alte pagină.

Acum, mergeți mai departe și creați other.html.twig fișier, cu acest HTML interior:

Alte pagini

Iată o altă pagină, care a fost legată de pagina noastră de pornire, doar pentru scopuri de testare.

Rutele

În cele din urmă, pentru codul nostru de aplicare, să definim rutele pentru aceste două pagini. Deschide src / crawling / FtestingBundle / Resurse / config / routing.yml și introduceți următoarele două rute, sub ruta generată implicit care a venit cu fișierul nostru de ruta:

crawling_home: calea: / crawling / home default: _controller: crawlingFtestingBundle: crawling: home crawling_other: path: / crawling / other defaults: _controller: CrawlingFtestingBundle:

Aici definesc două rute, una pentru fiecare dintre acțiunile controlorului nostru. Începem cu numele traseelor ​​pe care le putem folosi în link-uri etc ... și apoi specificăm calea traseului care este URI-ul său pentru a accesa pagina din browser și apoi îi spunem ce controler ar trebui să hartă prea.

Acum, amintiți-vă cu YAML că nu doriți să utilizați nicio filă, folosiți întotdeauna spații sau rutele dvs. nu vor funcționa!

Deci, doar cu aceste două pagini, chiar și cu cât sunt de bază și statice, putem învăța în continuare mult despre modul de utilizare a crawlerului Symfony 2 pentru a testa că întregul spectru de a avea un controler, un șablon, o rută și o legătură funcționează ca un întreg integrat (un test funcțional), precum și pentru a ne asigura că paginile noastre afișează structura HTML corectă. 

Scrierea unui test funcțional

Suntem gata să începem să învățăm cum să scriem teste funcționale utilizând crawlerul. În primul rând, vom crea un fișier de testare.

Crearea fișierului nostru de testare

Toate testele din Simfonia 2, testele PHPUnit sunt stocate în pachetele tale Teste / Controler director Fiecare controler ar trebui să aibă propriul fișier de control al controlorului numit după clasa controlerului pe care o testează. Din moment ce avem CrawlingController, va trebui să creați o CrawlingControllerTest.php fișier înăuntru src / Crawling / FtestingBundle / Teste / Controler, cu următoarea definiție a clasei:

Aici vom numi testul nostru și apoi vom include în clasa parentală WebTestCase, oferindu-ne funcționalitatea noastră de testare PHPUnit. Clasa noastră de testare este denumită exact același nume ca și numele de fișier și extindem clasa parentală WebTestCase astfel încât să moștenim caracteristicile acesteia.

Acum, să creați o metodă de testare pentru a ține afirmațiile pe care le vom face pentru a testa pagina noastră de pornire. În interiorul clasei noastre de test, hai să creăm următoarea metodă:

funcția publică funcția testHome () 

Ori de câte ori creați o metodă de testare folosind PHPUnit în Symfony 2, noi întotdeauna prefixăm numele metodei noastre cu testul de cuvânt. Puteți da numele metodei în sine orice nume doriți, deși convenția trebuie să o numească după acțiunea controlerului pe care îl testați. Deci, aici am numit-o pe a mea testHome să urmeze această convenție.

Clientul

Acum, în cadrul metodei noastre de testare, avem nevoie de o modalitate de a simula un browser astfel încât să putem emite o solicitare HTTP pe una din rutele noastre și să verificăm că totul funcționează așa cum ne așteptăm. Pentru a face acest lucru, vom crea un obiect client prin apelarea unui static createClient () metodă:

$ client = statică :: createClient ();

Acum putem folosi acest lucru $ client obiect pentru a face această solicitare HTTP și a începe să utilizeze crawler-ul.

The Crawler

Crawlerul se află în centrul testelor funcționale din Symfony 2 și ne permite să traversăm și să colectăm informații despre pagina noastră de aplicații web, precum și să efectuăm acțiuni cum ar fi clicurile pe linkuri sau trimiterea formularelor. Să definim obiectul crawler făcând o cerere HTTP folosind clientul. Adăugați următoarele drepturi sub dvs. $ client obiect, în testHome metodă:

$ crawler = $ client-> cerere ('GET', '/ crawling / home');

Aceasta va returna un obiect Crawler pentru a testa pagina noastră de pornire. Acest lucru ne va anunța că pagina noastră există, are codul HTML și formatarea corectă și că controlerul, șablonul și ruta funcționează ca unitate.  

Testarea rubricii și paragrafului

Pentru a începe testele noastre funcționale, dorim să afirmăm că pagina noastră de pornire conține titlul corespunzător cu conținutul adecvat din interiorul acestuia. Noi ne folosim $ pe șenile obiect și metodele sale diferite de a face acest lucru. Aceste metode vor întoarce înapoi un alt obiect crawler care conține răspunsul actual al paginii testate. Apoi, vom testa acest răspuns pentru a ne asigura că totul este așa cum era de așteptat.

Adăugați următorul cod la adresa dvs. testHome metodă:

$ heading = $ crawler-> filtru ('h1') -> eq (0) -> text (); $ this-> assertEquals ("Pagina principală de accesare cu crawlere", titlul $);

Începem prin apelarea noastră $ pe șenile obiecte filtru() metoda de filtrare a răspunsului paginii și selectarea tuturor h1 elemente. Putem lanțuri apoi pe alte metode de apel pentru a filtra selecția noastră chiar mai departe. Aici folosesc eq () care acceptă o poziție index a elementului h1 pe care dorim să-l selectăm. Am ales să selectez indexul 0, prima poziție. În cele din urmă, am lanț pe apelul metodei text, care va returna conținutul textului elementului HTML și va stoca rezultatul într-o variabilă de titlu $.

După filtrarea elementului h1 pentru care vrem să testăm, trebuie să afirmăm că avem elementul corect. Noi facem asta folosind assertEquals () metodă care acceptă ca primul argument valoarea pe care ne așteptăm ca o să o aibă și, ca al doilea argument, valoarea reală a răspunsului returnat, care este suma noastră în sine. Procedând astfel, vom ști că suntem pe pagina corectă, dacă conținutul corespunde cu ceea ce așteptăm să fie.

Executarea testului de poziționare

Astfel, cu doar patru linii simple de cod PHP, vom putea testa controlerul de acasă, șablonul și traseul. Să facem testul pentru a ne asigura că trece. În terminalul tău, din interiorul tău crawling Proiectul Symfony, rulați phpunit -c app /. Ar trebui să vedeți următoarele:

Aici avem acum două teste și două afirmații, toate trecând! Acum puteți testa pentru un singur paragraf de sub poziția similară, dar de data aceasta vom folosi primul(), astfel:

$ para1 = $ crawler-> filtru ('p') -> primul () -> text (); $ this-> assertEquals ("Aici este pagina noastră de pornire crawling", $ para1);

Dacă reluați testele dvs., acum avem trei afirmații trecătoare. Bună treabă!

Testarea Faceți clic pe o legătură

Acum, să încercăm să testați procesul de a face clic pe link-ul nostru de altă pagină. Ar trebui să ne ducă la cealaltă pagină și să afișăm și conținutul corespunzător acolo. Introduceți în codul dvs. următoarele coduri testHome metodă:

$ link = $ crawler-> filter ('a: conține ("această altă pagină")') -> first () -> link (); $ otherPage = $ client-> clic ($ link); $ this-> assertEquals ('Altă pagină', $ otherPage-> filter ('h1') -> first () -> text ());

Începem prin filtrarea paginii noastre de start A Etichete. Noi folosim : Conține () filtra metoda pentru a filtra A etichetele de conținut, astfel încât să ne asigurăm că selectați link-ul corect. Apoi lanțem doar pe primul() metoda de a lua primul și apelarea legătură() metoda pe ea pentru a crea un obiect de legătură, astfel încât să putem simula clic pe ea folosind noastre $ client.

Acum că avem a $ link- obiect, trebuie să faceți clic pe el, sunând la $ client obiecte clic() metoda și trecerea în $ link- obiecte la acesta și stocarea răspunsului înapoi în $ otherPage variabil. Acest lucru este la fel ca orice alt obiect crawler, metoda de clic returnează răspunsul. Foarte usor!

Și apoi, în cele din urmă, afirmăm asta $ otherPagetextul rubricii este egal cu ceea ce ne așteptăm să utilizeze assertEquals () metodă. Dacă este, știm că link-ul nostru funcționează!

Executați testele dvs. ultima oară!

Să facem testele noastre o singură dată pentru a vă asigura că linkul nostru funcționează corect și că suntem pe pagina potrivită după ce faceți clic pe acesta. Iată rezultatele mele Terminal:

Avem două teste și patru afirmații, toate trecând. Aplicația este completă!

Concluzie

Si asta e. Am testat faptul că controlerul nostru, acțiunile controlerului, șabloanele și rutele funcționează împreună și știm că HTML și conținutul fiecărui element se afișează corect pe pagină, precum și faptul că linkul nostru se leagă de locația corectă. Lucru bine făcut.

Acum vă încurajez să încercați ceea ce ați învățat prin testarea alte , adăugând mai multe coduri HTML sau link-uri către acesta și, în general, simțind că utilizați crawlerul pentru a vă asigura că pagina dvs. funcționează conform așteptărilor. 

Cod