Dacă vă întrebați: "Ce este Yii?" verificați tutorialul meu anterior, Introducere în Cadrul Yii, care analizează beneficiile Yii și include o prezentare generală a ceea ce este nou în Yii 2.0, lansat în octombrie 2014.
În această programare cu seria Yii2, ghid direct cititorii în folosirea cadrului Yii2 pentru PHP. În acest tutorial, voi explora testarea automată utilizând Codeception, care este integrată cu cadrul de dezvoltare Yii2.
Desigur, experiența mea de a scrie teste cu codul meu este insuficientă. De multe ori fac parte din proiecte solo sau mici, cu resurse limitate. În timpul petrecut la Microsoft, am avut echipe distincte de testare care au făcut acest lucru. Dar sincer, acest lucru este probabil tipic pentru tine, nu? Programatorii preferă să codifice, nu scriu teste - cel puțin programatori de școală vechi nu au făcut-o.
Codeception este o bibliotecă inovatoare care își propune literalmente să facă distracție și ușor de testare. Și aș spune că au reușit într-o măsură rezonabilă. Când m-am scufundat în apa de la "Lake Codeception", era mai ușor și mai distractiv. Cu toate acestea, pe măsură ce am început să merg mai adânc, am întâlnit probleme de configurare cu Yii și modulele specifice folosite în această serie. Au fost cu siguranță provocări. În general, totuși, sunt impresionat și văd beneficiul învățării mai mult.
Pune pur și simplu, Codeception și integrarea sa cu Yii mă face să vreau să scriu mai multe teste, o primă pentru mine. Bănuiesc că veți avea o experiență similară.
Un mic memento inainte de a incepe, eu particip la comentariile de mai jos. Sunt interesat în special dacă aveți gânduri suplimentare sau doriți să sugerați subiecte pentru tutoriale viitoare. Dacă aveți o sugestie de întrebare sau subiect, vă rugăm să postați mai jos. Puteți să mă contactați și pe Twitter @reifman direct.
Pentru a mă îndruma, am folosit documentația de configurare a mediului de testare Yii. Am inceput cu o instalare globala de codificare, asa ca am putea sa o folosesc din orice proiect.
$ composer global require "codeception / codeception = 2.1." "A fost actualizat directorul curent în /Users/Jeff/.composer ./composer.json a fost actualizat Încărcarea depozitelor de compozitori cu informații despre pachete Actualizarea dependențelor (inclusiv necesitatea dev) - Instalarea simfony / yaml (v3.1.1) Încărcare din cache ... coding / codeception sugerează instalarea symfony / phpunit-bridge (Pentru suport phpunit-bridge) Fișier de blocare de scriere Generarea fișierelor autoload
De asemenea, trebuie să solicitați codeception / specifica
:
$ composer global necesită "codeception / specify = *" A fost actualizat directorul curent în /Users/Jeff/.composer ./composer.json a fost actualizat Încărcarea depozitului compozitorului cu informații despre pachet Actualizarea dependențelor (inclusiv requet-dev) compozitor necesită "codeception / verify = * "- Instalarea codecului / specificați (0.4.3) Descărcarea: 100% Fișier de blocare de scriere Generarea fișierelor autoload
Și codeception / verificarea
:
$ compozitor necesită codificare / verificare = * "./composer.json a fost actualizat Încărcarea depozitelor compozitorului cu informații despre pachete Actualizarea dependențelor (inclusiv necesitatea dev) - Instalarea codecului / verificării (0.3.0) Descărcarea: 100% fișiere autoload
Apoi, ajută la crearea unui alias pentru codecept
folosind directorul dvs. global pentru compozitori:
$ status global composer Modificat directorul curent în /Users/Jeff/.composer Nu există modificări locale
Aceasta stabilește aliasul:
$ alias codecept = "/ Utilizatori / Jeff / .composer / vânzător / bin / codecept"
Yii necesită, de asemenea, să instalați Faker, care generează date false de testare pentru aplicația dvs.:
$ compozitorul necesită --dev yiisoft / yii2-faker: * ./composer.json a fost actualizat Încărcarea depozitelor compozitorului cu informații despre pachete Actualizarea dependențelor (inclusiv necesitatea dev) Nimic de instalat sau actualizat Generarea fișierelor autoload
Codul de bootstrap
inițializează codificarea pentru aplicația dvs. Yii, creând o varietate de fișiere de configurare pentru construirea și executarea testelor împotriva aplicației dvs. Folosim aplicația Hello din această serie pentru acest tutorial. Consultați link-ul GitHub din această pagină pentru a obține codul.
$ codecept bootstrap Inițierea codecului în / Users / Jeff / Sites / hello Fișierul codeception.yml a fost creat <- global configuration tests/unit created <- unit tests tests/unit.suite.yml written <- unit tests suite configuration tests/functional created <- functional tests tests/functional.suite.yml written <- functional tests suite configuration tests/acceptance created <- acceptance tests tests/acceptance.suite.yml written <- acceptance tests suite configuration tests/_output was added to .gitignore --- tests/_bootstrap.php written <- global bootstrap file Building initial Tester classes Building Actor classes for suites: acceptance, functional, unit -> AcceptanceTesterActions.php a generat cu succes. 0 metode adăugate \ AcceptanceTester include modulele: PhpBrowser, \ Helper \ Acceptance AcceptanceTester.php create. -> FunctionalTesterActions.php a generat cu succes. 0 metode adăugate \ FunctionalTester include module: \ Helper \ Functional FunctionalTester.php creat. -> UnitTesterActions.php a generat cu succes. 0 metode adăugate \ UnitTester include modulele: Asserts, \ Helper \ Unit UnitTester.php create. Bootstrap se termină. Check out / Utilizatori / Jeff / Sites / hello / director de teste
Din anumite motive, am ajuns, de asemenea, cu directoare de testare duplicat în salut / teste; ștergerea doar a salut / teste / funcțional, salut / teste / acceptare, și salut / teste / unitate clarificat lucrurile. Toate testele trăiesc în salut / teste / codificare / *.
Codeception este axat pe trei tipuri de teste:
Și suportă trei tipuri diferite de formate de testare pentru codul dvs. de testare:
Să începem cu un exemplu de teste de acceptare utilizând cept format:
Vom folosi codificarea Bine ati venit
exemplul de testare mai întâi.
$ codecept generate: test de acceptare cept de acceptare a fost creat în /Users/Jeff/Sites/hello/tests/acceptance/WelcomeCept.php
Acest lucru generează Teste / acceptare / WelcomeCept.php
, pe care o vom edita mai jos.
Deoarece testele de acceptare necesită browserul, trebuie să editați /tests/acceptance.suite.yml în proiectul nostru pentru a furniza adresa URL de dezvoltare, http: // localhost: 8888 / salut:
# Suite Test Suite Configuration # # Suite pentru testele de acceptare. # Executați teste în browser utilizând WebDriver sau PhpBrowser. # Dacă aveți nevoie de teste WebDriver și PHPBrowser - creați o suită separată. class_name: Module AcceptanceTester: activat: - PhpBrowser: url: http: // localhost: 8888 / hello / - \ Helper \ Acceptance
Acum, suntem gata să modificăm testul inițial în test / acceptance / WelcomeCept.php. Scriu un test care încarcă prima pagină pentru a vă asigura că funcționează conform așteptărilor.
Testele de testare au conceptul de actor, în acest caz, $ I = nou AcceptanceTester ()
.
Iată cum descriu actorii în documentația "Codificare":
Avem un UnitTester, care execută funcții și testează codul. Avem, de asemenea, un tester funcțional, un tester calificat, care testează aplicația în ansamblul său, cu cunoștințele sale interne. Și un AcceptanceTester, un utilizator care lucrează cu aplicația noastră printr-o interfață pe care o oferim.
Puteți comenta testele cu cod, cum ar fi $ I-> wantTo ("efectuați un anumit test")
sau "asigurați-vă că pagina principală funcționează"
.
În testul meu, vreau să văd $ I-> vezi
text pentru 'Felicitări!'
și 'Yii-alimentat'
:
wantTo ("asigurați-vă că lucrează în frontpage"); $ I-> amOnPage ( '/'); $ I-> vezi ( 'Felicitări!'); $ I-> vezi ( 'Yii-alimentat');
Iată pagina de pornire actuală Hello:
Apoi, să conducem testul pur și simplu codecept run
:
$ codecept rula Codeception PHP Testing Framework v2.1.11 Powered by PHPUnit 5.3.5 de către Sebastian Bergmann și contributorii. Teste de acceptare (1) --------------------------------------------- ------------------------------------------ Asigurați-vă că prima pagină funcționează (WelcomeCept) Ok -------------------------------------------------- -------------------------------------------------- -------- Teste funcționale (0) ------------------------ ------------- -------------------------------- Teste de unitate (0) ------------- ----------------- --------------------------------- ------------ Timp: 554 ms, Memorie: 10.25MB OK (1 test, 2 afirmații)
După cum puteți vedea, testul nostru a trecut și codul pentru a verifica această funcționalitate a fost destul de lizibil și simplu.
Pentru a merge mai departe, am început să folosesc testele implicite ale lui Yii. În acest moment, am dat peste un număr de probleme de configurare - cel mai mult datorită utilizării de către mine a modulului personalizat yii2-user din această serie. Alții s-au datorat unor bug-uri mici cu Yii, pe care echipa sa a răspuns rapid și le repară atunci când au fost raportate pe GitHub; în unele cazuri, problemele au fost rezolvate în versiunile ulterioare ale copacului yii2-basic.
De asemenea, pentru că am actualizat arborele yii2-basic pentru această serie, a trebuit să fac mici modificări la unele dintre testele implicite.
Iată un exemplu de ieșire pentru executarea testelor de acceptare implicite odată ce am efectuat unele ajustări minore:
$ codecept rula Codeception PHP Testing Framework v2.1.11 Powered by PHPUnit 5.3.5 de către Sebastian Bergmann și contributorii. Teste de acceptare (4) --------------------------------------------- -------------------------------------------------- - Asigurați-vă că despre lucrări (AboutCept) Ok Asigurați-vă că contactul funcționează (ContactCept) Ok Asigurați-vă că pagina de lucru funcționează (HomeCept) Ok Asigurați-vă că login-ul funcționează (LoginCept) ----------------------------------------------------------------------------------------------------------------------
Pentru a obține teste funcționale pentru a funcționa, trebuia să rulez o instanță a serverului încorporat Yii. Nu știam despre această componentă până când Alex Makarov de la Yii nu a menționat-o în schimbul nostru GitHub.
$ ./yii servesc
Am efectuat mici modificări la testele funcționale în / teste / codeception / funcțional, mai ales pentru a căuta șiruri de text actualizate specifice, adică "Autentificare nevalidă sau parolă" în loc de implicit Yii. Iată o privire la LoginCept.php:
wantTo ("asigurați-vă că lucrările de conectare"); $ loginPage = ConectarePagina :: openBy ($ I); $ I-> vezi ( 'Conectare'); $ I-> amGoingTo ('încercați să vă conectați cu acreditări goale'); $ LoginPage-> conectare ( ""); $ I-> expectTo ('vedeți erori de validare'); $ I-> vezi ("Login-ul nu poate fi gol"); $ I-> vezi ("Parola nu poate fi goală"); $ I-> amGoingTo ("încercați să vă conectați cu acreditări greșite"); $ loginPage-> login ("admin", "greșit"); $ I-> expectTo ('vedeți erori de validare'); $ I-> vezi ("Autentificare nevalidă sau parolă"); $ I-> amGoingTo ('încercați să vă conectați cu acreditările corecte'); $ loginPage-> login ('admin', 'admin11'); $ I-> expectTo ('vezi informații despre utilizator'); $ I-> vezi ( 'Ieșire');
Practic, codul accesează LoginForm
model și teste diferite metodele sale folosind Yii servi.
Iată codul de testare /tests/codeception_pages/LoginPage.php pe care îl folosiți (de asemenea, am modificat-o pentru modificările aduse seriei):
clasa LoginPage extinde BasePage public $ route = 'user / login'; / ** * @param string $ username * @param string $ password * / funcția publică login ($ username, $ password) $ this-> actor-> fillField ('input [name = "login-form [login]" ] ', $ username); $ this-> actor-> fillField ("introducere [nume =" login-form [parola] "], $ parola); $ This-> bazata pe individ> clic (butonul '[type = submit]');
Puteți vedea că îi codificăm actorul fillFields
și clic
butoanele pentru câmpurile de formular actualizate.
În timp ce depistarea integrării codificării cu Yii, mi-a fost util să rulați aceste teste în modul verbose:
$ codecept run -vvv
Iată rezultatul verbose din testele funcționale de conectare - în Terminalul MacOS, A TRECUT
și A EȘUAT
sunt colorate în culori roșii sau roz și inversate pentru vizibilitate:
Teste funcționale (4) --------------------------------------------- -------------------------------------------------- - Module: Sistem de fișiere, Yii2 ... ------------------------------------------ -------------------------------------------------- -------------------------- Asigurați-vă că lucrările de conectare (LoginCept) Scenariu: * Sunt pe pagina "/index-test.php/user/ conectați "[Pagina] /index-test.php/user/login [Răspuns] 200 [Solicitați fișiere cookie] [] [Anteturi de răspuns] " tip conținut ": [" text / html; charset = UTF-8 "] * Văd "Logare" * Voi încerca să vă autentificați cu acreditări goale * Am completat câmpul de intrare [nume = "login-form [login]"] "," -form [parola] "]", "" Apas butonul "[tip = trimite]" [URI] ":" VEpvcmk3bVgFH1Y9AVsmYWQQDEouTSggYXMFGStdKBEnCyQfBxo8Bw == "," login-form [login] ":" "," login-form [parolă] ":" http: //localhost/index-test.php/user/login [Răspuns] 200 [Cookie-uri de solicitare] "_csrf": "dd395a9e5e3c08 cfb1615dae5fc7b5ba0a2025c003e430ba0139b300f4a917ada: 2: i: 0; s: 5; "_csrf"; i: 1; s: 32: "QU9OhlK90Zc8GzEx59jkBjEIsAKmn-Q_"; " ; charset = UTF-8 "] * Mă aștept să vadă erori de validare * Văd că" Conectarea nu poate fi necompletată "* Văd că" Parola nu poate fi necompletată "* Am de gând să încerc să mă autentifică cu acreditări greșite * "input [nume =" login-form [login] "]," admin "* I fill field" submit] "[Uri] http: //localhost/index-test.php/user/login [Metoda] POST [Parametrii] " _csrf ":" QjFBRl9hMjMTZHgJNw15CnJrIn4YG3dLdwgrLR0Ld3oxcAorMUxjbA == " "," login-form [parolă] ":" greșit " [Pagina] http: //localhost/index-test.php/user/login [Răspuns] 200 [Request cookies] " _csrf ":" dd395a9e5e3c08cfb1615dae5fc7b5ba0a2025c003e430ba0139b300f4a917ada: 2 : i: 0; s: 5: "_csrf"; i: 1; s: 32: "QU9OhlK90Zc8GzEx59jkBjEIsAKmn-Q_"; charset = UTF-8 "] * Mă aștept să văd erori de validare * văd" autentificare sau parolă nevalidă "* Voi încerca să vă autentificați cu acreditările corecte * am completat câmpul de intrare [nume =" ] "", "admin" "I am completat câmpul" introduceți [nume = "login-form [parolă]"] /index-test.php/user/login [Metoda] POST [Parametrii] "_csrf": "bG8uMXdPYk49Ohd.HyMpd1w1TQkwNSc2WVZEWjUlJwcfLmVcGWIzEQ ==", "login-form [login] ":" admin11 " [Anteturi] " locație ": [" http: //localhost/index-test.php "]," tip de conținut ": [" text / html; [url = http: //localhost/index-test.php/user/login [Response] 302 [Request Cookies] "_csrf": "dd395a9e5e3c08cfb1615dae5fc7b5ba0a2025c003e430ba0139b300f4a917ada: 2: i: 0; s : ":": "_Csrf"; i: 1; s: 32: "QU9OhlK90Zc8GzEx59jkBjEIsAKmn-Q_"; " conținut de tip ": [" text / html; [url = http: //localhost/index-test.php] [Response] 200 [Request Cookies] "_csrf": [url = http: //localhost/index-test.php] " [Anteturi de răspuns] " tip de conținut ": [" text / text " html; charset = UTF-8 "] * Mă aștept să văd informațiile despre utilizator * văd" Logout "PASSED
În general, există un pic de învățat pentru a începe cu Codeception și corect codul testelor. Dar rezultatele sunt impresionante și utile.
Practic, testele unitare sunt testarea programatică a infrastructurii și modelelor noastre. În mod ideal, vom scrie teste pentru fiecare metodă și variație de utilizare a modelelor noastre.
Din păcate, nu am putut obține teste de unitate pentru a lucra în cadrul copacului nostru fie din cauza bug-urilor mici Yii care urmează să fie lansate, fie a problemelor de configurare dintre Codeception și yii2-user pe care le-am integrat în modul de programare cu Yii2: Integrarea înregistrării utilizatorilor.
Teste unitate (3) --------------------------------------------- -------------------------------------------------- ----- Module: ------------------------------------------- -------------------------------------------------- ---------------------- Încercarea de a testa autentificarea nici unui utilizator (teste \ codeception \ unit \ models \ LoginFormTest :: testLoginNoUser) ...PHP Eroare fatală 'yii \ base \ ErrorException' cu mesajul 'Apelați la teste de funcții nedefinite \ codeception \ unit \ models \ expect ()'Voi încerca din nou unitatea de testare în seria noastră de pornire care nu folosește yii2-user, ci utilizează integrarea integrată a utilizatorului arborelui Yii Advanced.
Să aruncăm o privire la câteva exemple din arborele Yii2-app-basic.
Testarea e-mailurilor formularului de contact
Testele hello / tests / codeception / unit / models / ContactFormTest.php trimitând un e-mail prin utilizarea programatică a modelelor:
mailer-> fileTransportCallback = funcția ($ mailer, $ message) return 'test_message.eml'; ; funcția protejată tearDown () unlink ($ this-> getMessageFile ()); părinte :: teardown (); funcția publică testContact () $ model = $ this-> createMock ('app \ models \ ContactForm', ['validate']); $ Model-> se așteaptă ($ this-> o dată ()) -> metoda ( 'Validează') -> va ($ this-> returnValue (true)); $ model-> attributes = ['name' => 'Tester', 'email' => '[email protected]', 'subject' => mesajul ",]; $ Model-> de contact ('[email protected] '); $ this-> specify ('email trebuie să fie trimis', funcția () așteptați ('fișierul e-mail ar trebui să existe', file_exists ($ this-> getMessageFile ()) -> true; $ this-> specify ('mesajul trebuie să conțină datele corecte', funcția () folosiți ($ model) $ emailMessage = file_get_contents ($ this-> getMessageFile () -> conține ($ model-> nume); așteptați ("emailul trebuie să conțină e-mailul expeditorului", $ emailMessage) -> conține ($ model-> nume); ($ model-> subiect); așteptați ("emailul trebuie să conțină corpul", $ emailMessage) -> conține ($ model-> corp);); funcția privată getMessageFile () retur Yii :: getAlias (Yii :: $ app-> mailer-> fileTransportPath). '/Testing_message.eml';Nu am reușit să reușesc acest test să treacă din cauza unui mic bug în Yii care nu a fost actualizat încă (sau cel puțin nu am putut găsi codul actualizat). Dropul meu din codul de bază Yii numea e-mailurile de ieșire cu ștampile de date și codul de mai sus căuta un nume de fișier fix. Astfel, a eșuat întotdeauna. Cu toate acestea, este util să vedem cum testarea programată poate folosi modelele pentru a genera un fișier și apoi căuta fișierul respectiv și validează conținutul acestuia pentru a verifica dacă codul funcționează.
Testarea de conectare
Să ne uităm la hello / tests / codeception / unit / models / LoginFormTest.php. Din nou, utilizarea mea de yii2-user a făcut prea greu să se integreze în momentul în care a scris acest tutorial; cu toate acestea, ne putem uita la abordarea conceptuală a funcțiilor modelului de testare a unităților de utilizator.
Iată
testLoginCorrect ()
, care pare să vadă dacă logarea reușește cu o parolă corectă:funcția publică testLoginCorrect () $ model = nou LoginForm (['username' => 'admin', 'password' => 'admin11',]); $ this-> specify ("utilizatorul ar trebui să poată să se autentifice cu acreditările corecte", funcția () utilizează ($ model) așteptați ('modelul trebuie să se autentifice utilizator', $ model-> login ()) -> true (); așteptați ("utilizatorul ar trebui să fie conectat", Yii :: $ app-> user-> isGuest) -> fals(); );Utilizează
LoginForm
pentru a conecta în mod programabil la utilizator, și apoi se pare programat pentru a vedea dacă utilizatorul curent al lui Yii nu mai este acum un oaspete.așteptați ("utilizatorul ar trebui să fie conectat", Yii :: $ app-> user-> isGuest) -> false ();Ce urmeaza?
Sper că ți-a plăcut să învăț despre modelul de codificare și integrarea lui cu Yii, în ciuda unora dintre obstacolele pe care le-am întâlnit. Instalarea standard a yii2-basic astăzi ar trebui să funcționeze mai bine.
Dacă doriți să citiți mai multe despre decizia când și ce să testați și de ce, vă recomandăm să citiți Prezentarea de testare Yii. Este cu siguranță mai mult de învățat despre Codeception și scrierea unor teste mai complete.
Urmăriți tutorialele viitoare în programul nostru de programare cu seria Yii2 în timp ce continuăm să vă scufundăm în diferite aspecte ale cadrului. Dacă doriți să știți când vine următorul tutorial Yii2, urmați-mă @reifman pe Twitter sau verificați pagina de instructor.
De asemenea, vă recomandăm să verificați seria noastră Building Your Startup With PHP, care utilizează șablonul avansat al lui Yii2, pe măsură ce construim o aplicație în lumea reală. De fapt, puteți încerca astăzi aplicația de pornire, Planificatorul de întâlniri.
Link-uri conexe