Dezvoltare pe bază de test cu Laravel & Doctrină

În calitate de dezvoltator PHP, puteți folosi tehnica de dezvoltare bazată pe test (TDD) pentru a vă dezvolta software-ul prin scrierea de teste. În mod tipic, TDD va împărți fiecare sarcină a dezvoltării în unități individuale. Un test este apoi scris pentru a se asigura că unitatea se comportă așa cum era de așteptat.

Fiecare proiect care folosește dezvoltarea testată rulează în mod repetat trei pași simpli:

  • Scrieți un test pentru următorul bit de funcționalitate pe care doriți să îl adăugați.
  • Scrieți codul funcțional până când trece testul.
  • Refactorul atât codul nou cât și codul vechi îl fac bine structurat.

Continuați să mersați cu bicicleta prin acești trei pași, câte un test, construind funcționalitatea sistemului. Testarea vă va ajuta să refaceți, ceea ce vă permite să vă îmbunătățiți design-ul în timp și faceți mai multe probleme de proiectare mai evidente.

Se numesc testele care conțin componente individuale mici teste unitare. În timp ce testele unității pot fi efectuate independent, dacă testați unele dintre componente atunci când sunt integrate cu alte componente, faceți acest lucru testarea integrării. Cel de-al treilea tip de testare este testele de încercare. Testele de testare vă permit să vă testați codul fără a trebui să efectuați apeluri reale către o bază de date.

De ce funcționează TDD

În zilele noastre, pe măsură ce utilizați sintaxa modernă IDE PHP, feedback-ul nu este o afacere mare. Unul dintre aspectele importante ale dezvoltării dvs. este să vă asigurați că codul face ceea ce vă așteptați să facă. Pe măsură ce software-ul este complicat (componente diferite integrate unul cu celălalt), ar fi dificil ca toate așteptările noastre să devină realitate. Mai ales la sfârșitul proiectului, datorită dezvoltării, proiectul va deveni mai complex și, deci, mai dificil de depanat și de testat.

TDD verifică faptul că codul face ceea ce vă așteptați să facă. Dacă ceva nu merge bine, există doar câteva linii de cod pentru a verifica din nou. Greșelile sunt ușor de găsit și repede. În TDD, testul se concentrează pe comportament, nu pe implementare. TDD oferă codul dovedit, care a fost testat, proiectat și codat.

PHPUnit & Laravel

PHPUnit este standardul de facto pentru testarea unităților PHP. Este în esență un cadru pentru scrierea de teste și furnizarea instrumentelor de care veți avea nevoie pentru a rula teste și a analiza rezultatele. PHPUnit își derivă structura și funcționalitatea de la Knit Beck's SUnit.

Există mai multe afirmații diferite care vă pot ajuta să testați rezultatele tuturor tipurilor de apeluri din aplicațiile dvs. Uneori trebuie să fii puțin mai creativ pentru a testa o funcție mai complexă, dar afirmațiile oferite de PHPUnit acoperă majoritatea cazurilor pe care le-ai dori să le testezi. Iată o listă a câtorva dintre cele mai obișnuite pe care le veți folosi în testele dvs.:

  • AssertTrue: Verificați intrarea pentru a verifica dacă este egal cu adevărat.
  • AssertFalse: Verificați intrarea pentru a verifica dacă aceasta este egală cu valoarea falsă.
  • AssertEquals: Verificați rezultatul cu o altă intrare pentru o potrivire.
  • AssertArrayHasKey (): Raportează o eroare dacă matricea nu are cheia.
  • AssertGreaterThan: Verificați rezultatul pentru a vedea dacă este mai mare decât o valoare.
  • AssertContains: Verificați dacă intrarea conține o anumită valoare.
  • AssertType: Verificați dacă o variabilă este de un anumit tip.
  • AssertNull: Verificați dacă o variabilă este nulă.
  • AssertFileExists: Verificați dacă există un fișier.
  • AssertRegExp: Verificați intrarea împotriva unei expresii regulate.

În mod implicit, PHPUnit 4.0 este instalat în Laravel și este posibil să executați următoarea comandă pentru ao actualiza:

bash compozitor global necesită "phpunit / phpunit = 5.0." "

phpunit.xml fișierul din directorul rădăcină Laravel vă va permite să faceți unele configurații. În acest caz, dacă doriți să înlocuiți configurația implicită, puteți edita fișierul:

„xml

./ Teste / app /

"

După cum vedeți în codul de mai sus, am adăugat configurația bazei de date a eșantionului (care nu este utilizată în articol).

Ce este doctrina ORM?

Doctrina este un ORM care implementează modelul de mapper de date și vă permite să faceți o separare clară a regulilor de afaceri ale aplicației de stratul de persistență al bazei de date. Pentru a configura doctrina, există o punte care să permită potrivirea cu configurația existentă a lui Laravel 5. Pentru a instala Doctrina 2 în cadrul proiectului Laravel, executăm următoarea comandă:

bash compozitorul cere laravel-doctrină / orm

Ca de obicei, pachetul trebuie adăugat la app / config.php, ca furnizor de servicii:

php LaravelDoctrină \ ORM \ DoctrineServiceProvider :: clasă,

Aliasul ar trebui, de asemenea, să fie configurat:

php 'EntityManager' => LaravelDoctrină \ ORM \ Facade \ EntityManager :: clasa

În cele din urmă, publicăm configurația pachetului cu:

bash php artizan vânzător: publish --tag = "config"

Cum se testează depozitele doctrinei

Înainte de orice altceva, ar trebui să știți despre fixări. Luminile sunt folosite pentru a încărca un set de date controlate într-o bază de date, de care avem nevoie pentru testare. Din fericire, Doctrina 2 are o bibliotecă care vă ajută să scrieți corpurile de lucru pentru Doctrina ORM.

Pentru a instala pachetul de fișiere în aplicația noastră Laravel, trebuie să executați următoarea comandă:

bash compozitorul necesită - doctrină / doctrine-fixtures-bundle

Să ne creăm dispozitivul Teste / Fixtures.php:

"Testarea spațiului de nume php, folosiți Doctrine \ Common \ Persistence \ ObjectManager; utilizați Doctrine \ Common \ DataFixtures \ FixtureInterface; utilizați aplicația \ Entity \ Post;

($) Postare = Post nou (['title' => 'hello world']) , 'corp' => 'acesta este corpul']); $ Manager-> persistă ($ post); $ Manager-> flush ();

"

După cum vedeți, clasa de corp ar trebui să pună în aplicare FixtureInterface și ar trebui să aibă încărcare (ObjectManager $ manager) metodă. Instrumentele Doctrine2 sunt clase PHP unde puteți crea obiecte și le puteți persista în baza de date. Pentru a ne autoliza setul de lucruri în Laravel, trebuie să modificăm composer.json în rădăcina Laravel:

json ... "autoload-dev": "classmap": ["tests / TestCase.php", "teste / Fixtures.php" // adaugat aici], ...

Apoi rulați:

bash compozitor dump-autoload

Să creăm fișierul nostru de testare în directorul de teste DoctrineTest.php.

"php namespace Test, folosiți aplicația, utilizați App \ Entity \ Post, utilizați Doctrine \ Common \ DataFixtures \ Executor \ ORMExecutor, utilizați Doctrine \ Common \ DataFixtures \ Purger \ ORMPurger; \ PostRepo;

clasa doctrineTest extinde TestCase private $ em; depozit privat de $; încărcător privat $; funcția publică setUp () părinte :: setUp (); $ this-> em = App :: make ("Doctrină \ ORM \ EntityManagerInterface"); $ this-> repository = PostRepo nou ($ this-> em); $ this-> executor = ORMExecutor nou ($ this-> em, new ORMPurger); $ this-> loader = încărcător nou; $ this-> loader-> addFixture (new Fixtures);

/ ** @test * / funcția publică funcțională () $ purger = new ORMPurger (); $ executor = ORMExecutor nou ($ this-> em, $ purger); $ Executor-> execute ($ this-> loader-> getFixtures ()); $ user = $ this-> repository-> PostOfTitle ("salut lume"); $ This-> Molodva> clară (); $ this-> assertInstanceOf ('Aplicație \ Entity \ Post', $ user);  "

În înființat() metodă, instanțiez ORMExecutor și încărcătorul. De asemenea, încărcăm Programe clasa pe care am implementat-o.

Nu uitați că /** @Test */ adnotarea este foarte importantă și fără aceasta, phpunit-ul va reveni Nu au fost găsite teste în clasă eroare.

Pentru a începe testarea în rădăcina proiectului nostru, trebuie doar să executați comanda:

bash sudo phpunit

Rezultatul ar fi:

"bash PHPUnit 4.6.6 de Sebastian Bergmann și colaboratori.

Configurația a fost citită de la /var/www/html/laravel/phpunit.xml. Timp: 17.06 secunde, Memorie: 16.00M OK (1 test, 1 afirmație) "

Dacă doriți să împărțiți obiecte între fișiere, este posibil să adăugați cu ușurință o referință la obiect după nume și apoi să o referiți pentru a forma o relație. Iată un exemplu:

"Testarea spațiului de nume php, folosiți Doctrine \ Common \ Persistence \ ObjectManager; utilizați Doctrine \ Common \ DataFixtures \ FixtureInterface; utilizați aplicația \ Entity \ Post;

clasa PostFixtures implementează FixtureInterface / ** * Încărcați fișierele utilizatorului * * @param ObjectManager $ manager * @return void * / încărcare funcțională publică (ObjectManager $ manager) $ postOne = Post nou (['title' => , 'corp' => 'acesta este corpul']); $ postTwo = Post nou (['title' => 'hello there', 'body' => 'acesta este corpul doi']); $ Manager-> persistă ($ postOne); $ Manager-> persistă ($ postTwo); $ Manager-> flush ();

 // stocarea referinței la rolul admin pentru relația Utilizator cu rolul $ this-> addReference ('new-post', $ postOne);  "

și componenta Comentariu:

"Testarea spațiului de nume php, folosiți Doctrine \ Common \ Persistence \ ObjectManager; utilizați Doctrine \ Common \ DataFixtures \ FixtureInterface; utilizați aplicația \ Entity \ Post;

Class CommentFixtures implementează FixtureInterface / ** * Încărcați fișierele utilizatorilor * * @param ObjectManager $ manager * @return void * / încărcare funcțională publică (ObjectManager $ manager) $ comment = nou Comentariu (['title' => , 'email' => '[email protected]', 'text' => 'frumos post']); $ Comment-> setPost ($ this-> getReference ( 'nou-post')); // încărcați referința stocată $ manager-> persist ($ comment); $ Manager-> flush (); // magazin referință la post nou pentru Comentariu relație la post $ this-> addReference ('new-post', $ postOne); "

Cu două metode de getReference () și setReference (), puteți partaja obiecte între elementele de fixare.

Dacă ordonarea programelor este importantă pentru dvs., puteți să le comandați cu ușurință getOrder în cadrul programelor dvs., după cum urmează:

funcția publică php getOrder () return 5; // numărul în care ordine de încărcare a dispozitivelor

Observați că ordonarea este relevantă pentru clasa Loader.

Unul dintre lucrurile importante despre programare este capacitatea lor de a rezolva problemele de dependență. Singurul lucru pe care trebuie să-l adăugați este o metodă în dispozitivul dvs., așa cum am făcut mai jos:

php funcția publică getDependencies () return array ('Test \ CommentFixtures'); // fixarea clasei de fixare depinde de

Concluzie

Aceasta este doar o descriere a testului de dezvoltare cu Laravel 5 și PHPUnit. La testarea depozitelor, este inevitabil să apăsați baza de date. În acest caz, doctrinele sunt importante.

Cod