Procesele tradiționale de testare pot fi uneori greoaie. Trebuie să încetați să scrieți codul pentru a vă putea efectua testele. Din fericire, există soluții care oferă posibilitatea de a rula automat testele pe măsură ce codificați. În acest tutorial, veți învăța cum să utilizați o bijuterie Ruby, numită watchr, pentru a monitoriza codul și pentru a rula automat testele corespunzătoare ori de câte ori salvați munca.
Orice instrument care vă ajută să obțineți feedback mai rapid este un element valoros.
Acest tutorial folosește PHP pentru exemplul de cod, totuși, tehnicile sunt aplicabile pentru orice limbă, care oferă un utilitar CLI pentru testarea unității. Ruby este necesar pentru că vom folosi pietre prețioase. Deci, asigurați-vă că aveți o instalare de lucru Ruby și PHP cu PHPUnit.
Apoi, asigurați-vă că aveți libnotify instalat, dacă sunteți pe Linux; Utilizatorii Windows și Mac OSX au nevoie de "creștere". Acest tutorial este direct aplicabil pe Linux, dar vă voi sugera comenzi alternative și setări acolo unde este posibil.
Acum, este timpul să instalați bijuteria watchr. Deschideți o consolă și asigurați-vă că vă aflați în dosarul în care puteți rula direct bijuterie
. Tastați următoarea comandă:
gem instalează ceas
Când un fișier sau un dosar este modificat, watchr poate declanșa o funcție de apel invers.
Bijuteria watcher este un program executabil scris în Ruby, care împachetează caracteristicile găsite într-un sistem de fișiere al sistemului de operare pentru a oferi posibilitatea de a urmări schimbările aduse unui anumit fișier sau dosar. Firește, aceste caracteristici ale sistemului de fișiere diferă pentru fiecare sistem de operare și sistem de fișiere.
watchr oferă o interfață unificată de programare a aplicațiilor (API) pentru toate sistemele de operare. Pe Linux, folosește Inotify, biblioteca de evenimente a sistemului de fișiere a kernel-ului; pe alte sisteme de operare, utilizează alternativa adecvată. Dacă, din anumite motive, sistemul de operare nu are un serviciu de eveniment disponibil, observatorul efectuează periodic sondaje asupra fișierului sau a dosarului vizionat.
Când un fișier sau un dosar este modificat, watchr poate declanșa o funcție de apel invers. Vom folosi această funcție pentru a rula testele noastre.
Proiectul nostru este destul de simplu. Replicați structura de directoare simplă prezentată în imaginea următoare:
În Nettuts.php
fișier, adăugați următorul cod:
Apoi, adăugați următorul cod la NettutsTest.php
:
object = new Nettuts; funcția protejată tearDown () ?>
În acest moment, fișierul de test este pur și simplu un schelet și, după cum puteți vedea în imaginea de mai sus, testele trec.
Acum, trebuie să creați un fișier Ruby în dosarul proiectului nostru; să spunem asta autotest_watchr.rb
. Apoi, adăugați următorul cod în fișier:
ceas ("Classes /(.*). php") nu se potrivesc run_test% Teste / # match] [1] Test.php sfârșit
Testele automate sunt IDE independente - un mare plus în cartea mea.
Acest cod folosește ceas
metoda de a urmări toate .php
fișierele din proiectul nostru Clase
pliant. Când un .php
modificările fișierelor, sistemul de operare emite un eveniment, și al nostru ceas
metoda va fi declanșată. Numele .php
fișierul este returnat (minus extensia) într-o poziție a matricei de potrivire 1
. Ca și în cazul oricărei expresii regulate, parantezele sunt folosite pentru a specifica o variabilă de potrivire, iar în acest cod le folosim în condiția de potrivire pentru a prelua numele fișierului. Apoi, numim run_test
cu calea numelui fișierului test compus.
De asemenea, ar trebui să urmăriți fișierele noastre de testare; astfel încât, adăugați următorul cod la fișierul Ruby:
ceas ("Teste /.* Test.php") nu se potrivesc run_test match [0] end
Rețineți că Meci
array conține numele complet al fișierului în poziție 0
, și îl transmitem direct către run_test
metodă.
Scriptul Ruby este creat pentru a ne urmări .php
dosare, iar acum trebuie să punem în aplicare run_test
metodă. În cazul nostru, dorim să executăm PHPUnit pentru fișierul specific.
def run_test (fișier), cu excepția cazului în care File.exist? (fișierul) pune "# file nu există" capătul de returnare pune "Running # file" result = 'phpunit # file
Ne asigurăm mai întâi că fișierul există și pur și simplu se întoarce dacă nu. Apoi, rulați testul cu PHPUnit și trimiteți rezultatul la consola. Să ne conducem scenariul de supraveghere. Deschideți consola dvs., navigați la directorul proiectului dvs. și apoi executați:
watchr ./autotest_watchr.rb
Utilizatorii Windows ar trebui să omiteți "./" din comanda de mai sus.
Acum, modificați unul dintre .php
(doar adăugați o linie goală la sfârșitul fișierului), salvați-o și observați ieșirea din consola. Ar trebui să vedeți ceva similar cu cel prezentat mai jos:
Running Teste / NettutsTest.php PHPUnit 3.6.0 de Sebastian Bergmann. F Timp: 0 secunde, Memorie: 3.75Mb A existat 1 eșec: 1) Avertizare Nu au fost găsite teste în clasa "NettutsTest". / usr / bin / phpunit: 46 FAILURI! Teste: 1, afirmații: 0, Eșecuri: 1.
Da, nu avem încă un test pentru a alerga; așa că să punem un test fals. Adăugați următorul cod în fișierul de testare PHP:
funcția testDummyPassingTest () $ this-> assertTrue (true);
Rulați din nou scriptul Ruby și ar trebui să vedeți:
Running Teste / NettutsTest.php PHPUnit 3.6.0 de Sebastian Bergmann ... Timp: 0 secunde, Memorie: 3.75Mb OK (1 test, 1 afirmatie)
Să noțiam utilizatorul, prin mecanismul de notificare al sistemului, despre rezultatele testelor. Vom modifica run_tests
metoda de a declanșa o metodă, numită notifica
. Mai jos este modificat run_tests
:
def run_tests (file) dacă File.exist? (fișierul) nu pune "# file nu există" sfârșitul retur pune "Running # file" result = 'phpunit # OK /) notificați "# file", "Teste reușite", "succes.png", sfârșitul anului 2000
Numele fișierului imagine, success.png
, indică imaginea pe care doriți să o afișați în zona de notificare. Această imagine nu este furnizată în acest tutorial; astfel încât va trebui să găsiți propriul dumneavoastră. Acum, să scriem notifica
metodă:
def notificare titlu, msg, img, show_time imagini_dir = "~ / .autotest / images" sistem "notificare-trimite" ########################################################################################## show_time "
Utilizatorii Mac OSX și Windows: înlocuiți notifica-trimite
comandă cu alternativa corespunzătoare Growl. Modificați ceva în fișierul de testare sau de cod astfel încât testul să treacă încă. Salvați fișierul modificat PHP și vizionați magia. Mai jos este o imagine a rezultatului pe sistemul meu:
Apoi, trebuie să prindem eșecurile. Următorul cod adaugă câteva linii la run_tests
:
def run_tests (file) dacă File.exist? (fișierul) nu pune "# file nu există" sfârșitul retur pune "Running # file" result = 'phpunit # OK /) notificați "# file", "Teste reușite", "succes.png", 2000 elsif result.match (/ FAILURES \! /
De asemenea, să adăugăm notify_failed
la fișier:
def notific_failed cmd, rezultat failed_examples = result.scan (/ failure: \ n \ n (. *) \ n /) notificare "# cmd", failed_examples [0], "failure.png"
Modificați oricare dintre fișierele dvs. PHP pentru a face testul să eșueze; salvați fișierul modificat. Respectați mesajul de notificare. Acesta conține numele primului test de eșec. Acest nume este selectat de expresia regulată din metodă notify_failed
, care analizează ieșirea PHPUnit.
Adăugați următoarea metodă în scriptul dvs. Ruby și asigurați - vă că îl apelați în run_test
metodă. Codul ar trebui să funcționeze în Linux și Mac OSX, deși este posibil să trebuiască să faceți niște cercetări pentru Windows.
def clear_console pune "\ e [H \ e [2J" sfârșitul consolei #clear
Ori de câte ori programați utilizând TDD, orice instrument care vă ajută să obțineți feedback mai rapid este un element valoros. Colegii mei folosesc scripturi similare cu supraveghetorul sau alternative (unele sunt scrise în jur fs_event
pe MacOS). Inutil să mai spunem că acum suntem răsfățați și nu ne putem imagina în curs de dezvoltare nimic fără a efectua teste automate.
Testele automate sunt IDE independente - un mare plus în cartea mea. Prea multe IDE-uri vă obligă să utilizați un cadru de testare specific și să nu fiți implicat în testarea la distanță. Prefer sa folosesc scripturile de genul asta zilnic si cu siguranta sa le recomand tuturor dezvoltatorilor agile de software.