Automatisk testing for TDD med PHP

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.


Trinn 1: Programvarekrav

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

Trinn 2: Teknisk bakgrunn

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.


Trinn 3: Opprett et PHP-prosjekt

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.


Trinn 4: Opprett First Watchr Script

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.


Trinn 5: Gjør scriptet Kjør testene

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)

Trinn 6: Analyser testutgangen

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.


Trinn 7: Fjern konsollen før hvert testkjøring

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

Konklusjon

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.