Tradisjonell testdrevet utvikling kan til tider være tungvint. Du må slutte å skrive kode for å kunne kjøre testene dine. Heldigvis finnes det løsninger, som gir muligheten til automatisk å kjøre testene dine når du koden. I denne opplæringen lærer du hvordan du bruker en Ruby perle, kalt watchr, å overvåke koden din og automatisk kjøre de riktige testene når du lagrer arbeidet ditt.
Ethvert verktøy som hjelper deg med å få raskere tilbakemelding er en verdifull ressurs.
Denne opplæringen bruker PHP til kodeeksemplet, men teknikkene gjelder for alle språk, som tilbyr et CLI-verktøy for enhetstesting. Ruby er påkrevd fordi vi vil bruke watchr-perlen. Så sørg for at du har en fungerende installasjon av Ruby og PHP med PHPUnit.
Deretter sørg for at du har libnotify installert, hvis du er på Linux; Windows og Mac OSX-brukere trenger "Growl." Denne opplæringen er direkte anvendelig på Linux, men jeg vil foreslå alternative kommandoer og innstillinger der det er mulig.
Nå er det på tide å installere watchr-perlen. Åpne en konsoll, og sørg for at du er i mappen der du kan kjøre direkte perle
. Skriv inn følgende kommando:
perle installasjon watchr
Når en fil eller mappe er endret, kan watchr utløse en tilbakeringingsfunksjon.
Watchr-perlen er et eksekverbart program skrevet i Ruby, og det brytes rundt funksjoner som finnes i operativsystemets filsystem for å gi mulighet til å se etter endringer som er gjort i en bestemt fil eller mappe. Naturligvis er disse filsystemfunksjonene forskjellige for hvert operativsystem og filsystem.
watchr gir et enhetlig program programmeringsgrensesnitt (API) for alle operativsystemer. På Linux bruker den inotify, kjernens filsystemhendelsebibliotek; På andre operativsystemer bruker den det riktige alternativet. Hvis operativsystemet av en eller annen grunn ikke har en tilgjengelig hendelsestjeneste, overvåker periodisk den overvåkte filen eller mappen.
Når en fil eller mappe er endret, kan watchr utløse en tilbakeringingsfunksjon. Vi bruker denne funksjonen til å kjøre testene våre.
Prosjektet vårt er ganske enkelt. Replikk den enkle katalogstrukturen som vises i følgende bilde:
I Nettuts.php
fil, legg til følgende kode:
Deretter legger du til følgende kode i NettutsTest.php
:
objekt = nye Nettuts; beskyttet funksjon tearDown () ?>
På dette tidspunktet er testfilen bare et skjelett, og som du kan se på bildet over, går testene.
Nå må vi lage en Ruby-fil i prosjektets mappe; la oss kalle det autotest_watchr.rb
. Deretter legger du til følgende kode i filen:
se ("Classes /(.*). php") gjør | match | run_test% Tests / # match [1] Test.php slutten
Automatiserte tester er IDE-uavhengige - et stort pluss i boken min.
Denne koden bruker se
metode for å se alle .php
filer i prosjektet vårt klasser
mappe. Når en .php
filendringer, operativsystemet utsteder en hendelse og vår se
Metoden vil bli utløst. Navnet på .php
filen returneres (minus utvidelsen) i en kampsammens posisjon på 1
. Som med alle vanlige uttrykk, brukes parenteser til å spesifisere en kampvariabel, og i denne koden bruker vi dem i samsvarende tilstand for å hente filnavnet. Så kaller vi run_test
metode med banen til det sammensatte testfilnavnet.
Vi bør også se våre testfiler; så legg til følgende kode i Ruby-filen:
watch ("Tests /.* Test.php") do | match | run_test match [0] end
Legg merke til at kamp
array inneholder hele filnavnet på posisjon 0
, og vi sender det direkte til run_test
metode.
Ruby-skriptet er satt opp for å se vår .php
filer, og nå må vi implementere run_test
metode. I vårt tilfelle vil vi kjøre PHPUnit for den spesifikke filen.
def run_test (fil) med mindre File.exist? (fil) setter "# file eksisterer ikke" return end ends "Kjører # file" result = 'phpunit # file' setter resultat slutten
Vi sørger først for at filen eksisterer, og bare returnere hvis den ikke gjør det. Deretter kjører vi testen med PHPUnit og sender resultatet til konsollen. La oss kjøre vårt watchr-skript. Åpne konsollen din, naviger til prosjektets katalog, og kjør deretter:
watchr ./autotest_watchr.rb
Windows-brukere bør utelate "./" fra kommandoen ovenfor.
Endre nå en av .php
filer (bare legg til en tom linje på slutten av filen), lagre den, og følg utgangen i konsollen. Du bør se noe som ligner på det som er vist nedenfor:
Running Tests / NettutsTest.php PHPUnit 3.6.0 av Sebastian Bergmann. F Tid: 0 sekunder, Minne: 3,75Mb Det var 1 feil: 1) Advarsel Ingen tester funnet i klassen "NettutsTest". / usr / bin / phpunit: 46 feil! Test: 1, påstander: 0, feil: 1.
Ja, vi har ennå ikke en prøve å løpe; så la oss legge inn en dummy test. Legg til følgende kode i testen PHP-fil:
funksjonstestDummyPassingTest () $ this-> assertTrue (true);
Kjør Ruby-skriptet igjen, og du bør se:
Running Tests / NettutsTest.php PHPUnit 3.6.0 av Sebastian Bergmann ... Tid: 0 sekunder, Minne: 3,75Mb OK (1 test, 1 påstand)
La oss varsle brukeren, via systemets varsel mekanismm om testresultatene. Vi vil endre run_tests
metode for å utløse en metode, kalt gi beskjed
. Nedenfor er den endrede run_tests
:
def run_tests (fil) med mindre File.exist? (fil) setter "# file eksisterer ikke" return end ends "Kjører # file" result = 'phpunit # file' setter resultat hvis result.match (/ OK /) varsle "# file", "Tests Passed Successfuly", "success.png", 2000 slutten
Navnet på bildefilen, success.png
, peker til bildet du vil vise i varslingsområdet. Dette bildet er ikke gitt i denne opplæringen; så du må finne din egen. Nå, la oss skrive gi beskjed
metode:
def notify-send '# title "# msg' -i # images_dir / # img -t # msgid show_time "slutt
Mac OSX og Windows-brukere: erstatte varsle sending
kommandoen med riktig Growl-alternativ. Endre noe i enten test- eller kodefilen din slik at testen fortsatt går. Lagre den endrede PHP-filen, og se på magien skje. Nedenfor er et bilde av resultatet på systemet mitt:
Deretter må vi ta feilene. Følgende kode legger til et par linjer til run_tests
:
def run_tests (fil) med mindre File.exist? (fil) setter "# file eksisterer ikke" return end ends "Kjører # file" result = 'phpunit # file' setter resultat hvis result.match (/ OK /) varsle "# file", "Tests Passed Successfuly", "success.png", 2000 elsif result.match (/ FAILURES \! /) Notify_failed fil, resultat endeend
La oss også legge til notify_failed
metode til filen:
def notify_failed cmd, resultat failed_examples = result.scan (/ failure: \ n \ n (. *) \ n /) varsle "# cmd", failed_examples [0], "failure.png", 6000 end
Endre en av PHP-filene dine for å få testen feilet; lagre den endrede filen. Vær oppmerksom på meldingsmeldingen. Den inneholder navnet på den første sviktende testen. Dette navnet er valgt av det vanlige uttrykket i metoden notify_failed
, som analyserer PHPUnit-utgangen.
Legg til følgende metode i Ruby-skriptet ditt, og sørg for å ringe det i run_test
metode. Koden skal fungere i Linux og Mac OSX, selv om du kanskje trenger å gjøre noen undersøkelser for Windows.
def clear_console setter "\ e [H \ e [2J" #clear konsollend
Når du programmerer ved hjelp av TDD, er et verktøy som hjelper deg med å få raskere tilbakemelding en verdifull ressurs. Mine kolleger bruker lignende skript med watchr eller alternativer (noen er skrevet rundt fs_event
på MacOS). Unødvendig å si, vi er bortskjemt nå, og kan ikke forestille oss å utvikle noe uten å kjøre tester automatisk.
Automatiserte tester er IDE-uavhengige - et stort pluss i boken min. For mange IDEer tvinger deg til å bruke et bestemt testing rammeverk, og ikke få meg startet på ekstern testing. Jeg foretrekker å bruke skript som dette daglig, og absolutt anbefale dem til enhver smidig programvareutvikler.