Testing av webapplikasjonene dine er en av de beste tingene du kan gjøre for å sikre sin helse, sikkerhet og sikkerhet, både for appen og appens besøkende. Symfony 2 tilbyr en komplett integreringstestpakke som du kan bruke til å sikre at programmene dine går som du forventer. I dag ser vi på hvordan vi kan bruke Symfony 2 og PHPUnit, testrammen som den bruker, for å skrive grunnleggende funksjonstester ved hjelp av Crawler.
Før vi kan starte noen form for testing, la oss sette opp vårt prosjekt ved å laste ned Symfony 2-rammen, konfigurere det og deretter også laste ned PHPUnit.
Den beste måten å laste ned Symfony 2 på er å bruke Komponist. Hvis du ennå ikke vet hva Composer er, pass på å sjekke ut noen av de fantastiske Tuts + artiklene og kursene på den, så tar de deg raskt opp.
Vi vil først åpne vårt Terminal- eller kommandolinjegrensesnitt, slik at vi kan utstede noen komposittkommandoer. En gang i Terminal, bytt kataloger til din lokale utviklings webroot. For meg, på OS X, vil dette være min ~ / nettsteder
katalogen:
cd ~ / Nettsteder
En gang i riktig katalog kan vi nå bruke Komponist til å lage et nytt Symfony 2-prosjekt som vil laste ned og installere rammen pluss noen av dens avhengigheter.
komponent create-project symfony / rammeverk-standard-utgave gjennomgang / '~ 2,5'
Denne kommandoen forteller komponist for å lage et nytt prosjekt ved hjelp av Symfony 2-rammen i et nytt katalognavn krypende /
, og så spesifiserer vi også den nøyaktige versjonen for nedlasting, versjon ~ 2,5
. Hvis dette er første gang du laster ned rammen, kan det ta litt tid siden det er mange biblioteker som skal lastes ned for alle leverandørene. Så du vil kanskje ta en rask pause og komme tilbake om noen få minutter.
Etter at nedlastingen er ferdig, bør Terminal nå vise en interaktiv veiviser som hjelper deg med å konfigurere konfigurasjonen. Det er veldig selvforklarende, bare skriv inn din egen legitimasjon eller ta standardverdiene som jeg har gjort:
Når du har angitt konfigurasjonsinformasjonen din, lastes Symfony 2 ned, installeres og er klar til bruk. Nå trenger vi bare å få PHPUnit, så vi kan teste vår kode.
For å laste ned PHPUnit kan vi bruke en wget-kommando i Terminal for å hente .Phar
fil eller bare last ned den fra deres hjemmeside, er det opp til deg:
wget https://phar.phpunit.de/phpunit.phar
Med .Phar
lastet ned, nå må vi justere sine tillatelser og flytte den til et sted der vår terminal eller kommandolinje og PHP vil ha tilgang til det. På min maskin med OS X flyttet jeg dette inn i min / Usr / local / bin
katalogen. Jeg endret også filen til å være rett PHPUnit
så jeg trenger ikke å bekymre meg for utvidelsen når jeg prøver å kjøre testene mine, og sparer meg litt tid:
chmod + x phpunit.phar sudo mv phpunit.phar / usr / local / bin / phpunit
Vi bør nå kunne verifisere at PHPUnit ble installert og er tilgjengelig via Terminal ved å kjøre PHPUnit
kommando. Du bør se noe slikt:
Nå trenger vi et bunt for å holde vår søknad og testkode. La oss lage en som bruker Symfony 2-konsollen, fra vår terminal:
cd ~ / Sites / crawling php app / console generere: bunt --namespace = Crawling / FtestingBundle --format = yml
Her bytter vi først kataloger inn i vår kryp
prosjekt og bruk deretter konsollen til å generere et nytt bunt. Vi spesifiserer også dette buntens leverandør- og buntnavn, skilt av et fremoverstrekk (/
). Til slutt forteller vi det å bruke YAML som formatet for vår konfigurasjon. Nå kan du bruke hvilket som helst format du vil ha hvis du ikke vil bruke YAML, og du kan også nevne buntet ditt, men du foretrekker det, så lenge du først gir det et leverandørnavn og avslutter buntnavnet ditt med suffikset Bunt
.
Etter å ha kjørt kommandoen ovenfor, får vi igjen en fin veiviser for å hjelpe til med å fullføre buntinstallasjonen. Jeg har nettopp slått på Enter for hver ledetekst for å ta standardinnstillingene, da dette holder hele prosessen fin og enkel og jevner ut eventuelle problemer med banen ved å sette filene dine på egendefinerte steder. Her er et skjermbilde av min pakkeveiviser:
Ok, vi har Symfony 2, PHPUnit og vårt bunt; Jeg tror vi er klar til å lære å kjøre våre PHPUnit-tester sammen med Symfony. Det er faktisk veldig enkelt, bare endre kataloger til din kryp
prosjekt og utgitt phpunit -c app /
kommandoen for å kjøre alle programmets tester. Du bør få følgende resultat i Terminal:
Da vi genererte vår pakke, genererte den også en liten prøvekode for oss. Testen du ser løp over er en del av denne prøven. Du kan se at vi har en grønn bar, som forteller oss at våre tester passerte. Nå rett over Tid: 1,97 sekunder, Vi har også en enkelt prikk som viser oss at bare en test ble spilt. I den grønne linjen har vi statusen vår OK så vel som hvor mange tester og påstander som ble spilt.
Så ved å kjøre bare denne kommandoen vet vi at vår Symfony 2 app er installert, kjører riktig og testet!
Vi trenger nå en faktisk kode som vi kan teste.
La oss starte med å opprette en ny kontroller klassefil og kontroller handling. Innsiden av din kryp
prosjekt, under src / Crawling / FtestingBundle / Controller
, opprett en ny fil som heter CrawlingController.php
og sett inn følgende i det:
I denne filen definerer vi bare vår grunnleggende kontrollerklassestruktur, og gir den det riktige navneområdet og inkludert det nødvendige
Controller
foreldre klasse.Controller Actions
Inne i vår klasse, la oss nå definere våre to enkle kontrollerhandlinger. De skal bare gjengi to forskjellige sider: a
hjem
side og anannen
side:offentlig funksjon homeAction () return $ this-> render ('CrawlingFtestingBundle: Crawling: home.html.twig'); offentlig funksjon otherAction () return $ this-> render ('CrawlingFtestingBundle: Crawling: other.html.twig');Maler
Nå må vi lage malfiler for disse kontrolleringshandlingene. Under
src / Crawling / Ftesting / Resources / visninger
, opprett en ny katalog som heterCrawling
å holde vårCrawlingController
s malfiler. Inside, først oppretthome.html.twig
fil, med følgende HTML inne:Gjennomsøker Hjemmeside
Her er vår gjennomsøkingsside.
Vennligst besøk denne siden også!
Dette inneholder bare noen grunnleggende HTML og en link til
annen
side.Nå også gå videre og opprett
other.html.twig
fil, med denne HTML inne:Annen side
Her er en annen side, som var koblet til fra vår hjemmeside, bare for testing.
Rutene
Til slutt, for vår søknadskode, la oss definere ruter for disse to sidene. Åpne opp
src / Crawling / FtestingBundle / Resources / config / routing.yml
og skriv inn i følgende to ruter, under den standardgenererte ruten som fulgte med vår rutefil:crawling_home: path: / crawling / home standard: _controller: CrawlingFtestingBundle: Crawling: home crawling_other: sti: / crawling / andre standardinnstillinger: _controller: CrawlingFtestingBundle: Crawling: otherHer definerer jeg to ruter, en for hver av våre kontrollerhandlinger. Vi starter med rutenavnet, som vi kan bruke i koblinger, etc ... og deretter angir vi rutebanen som er dens URI for å få tilgang til siden i nettleseren, og så forteller vi hvilken kontroller den skal kartlegge.
Husk nå med YAML at du ikke vil bruke noen faner, bruk alltid mellomrom eller ruter vil ikke fungere!
Så med bare disse to sidene, selv med hvor grunnleggende og statiske de er, kan vi fortsatt lære mye om hvordan du bruker Symfony 2s Crawler for å teste at hele spekteret av å ha en kontroller, mal, rute og koblinger fungerer som en integrert helhet (en funksjonell test), samt sørge for at sidene viser riktig HTML-struktur.
Skrive en funksjonstest
Vi er nå klar til å begynne å lære å skrive funksjonelle tester ved hjelp av Crawler. Først skal vi opprette en testfil.
Opprette vår testfil
Alle tester i Symfony 2, PHPUnit-tester lagres i buntens
Tester / Controller
katalog Hver kontroller skal ha sin egen kontroller-testfil oppkalt etter kontrollerklassen som den tester. Siden vi har enCrawlingController
, vi må opprette enCrawlingControllerTest.php
fil innsidensrc / Crawling / FtestingBundle / tester / Controller
, med følgende klasses Definisjon:Her navngir vi vår test og inneholder deretter i WebTestCase foreldreklassen som gir oss vår PHPUnit testfunksjonalitet. Vår testklasse heter nøyaktig det samme som vårt filnavn, og vi utvider forgrunnsklassen WebTestCase slik at vi arver dens egenskaper.
La oss nå lage en testmetode for å holde våre påstander som vi skal gjøre for å teste ut vår hjemmeside. Inne i vår testklasse, la oss lage følgende metode:
offentlig funksjon testHome ()Når du oppretter en testmetode ved hjelp av PHPUnit i Symfony 2, prefixer vi alltid metodenavnet vårt med ordtesten. Du kan gi metodenavnet seg selv et hvilket som helst navn du vil ha, selv om konvensjonen er å navngi den etter kontrollerens handling du tester. Så her, jeg har kalt min
testHome
å følge denne konvensjonen.Klienten
Nå inne i testmetoden vår trenger vi en måte å simulere en nettleser på, slik at vi kan utstede en HTTP-forespørsel til en av våre ruter og teste at alt fungerer som vi forventer det. For å gjøre dette skal vi opprette et klientobjekt ved å ringe en statisk
createClient ()
metode:$ client = static :: createClient ();Vi kan nå bruke dette
$ klient
motsette seg å gjøre HTTP-forespørselen og begynne å bruke Crawler.The Crawler
Crawleren er kjernen i funksjonstesten i Symfony 2, og lar oss krysse og samle inn informasjon om vår nettsøknadsside, samt utføre handlinger som å klikke på koblinger eller sende inn skjemaer. La oss definere vårt Crawler-objekt ved å lage en HTTP-forespørsel ved hjelp av klienten. Legg til følgende rett under din
$ klient
objekt, i dintestHome
metode:$ crawler = $ klient-> forespørsel ('GET', '/ crawling / home');Dette returnerer et Crawler-objekt for å teste vår hjemmeside. Dette vil både fortelle oss at siden vår eksisterer, den har riktig HTML og formatering, og at kontrolleren, malen og ruten alle fungerer som en enhet.
Tester overskriften og avsnittet
For å starte våre funksjonstester, vil vi påstå at vår hjemmeside inneholder riktig overskrift med riktig innhold inni det. Vi bruker vår
$ crawler
objekt og dets forskjellige metoder for å gjøre dette. Disse metodene vil alle returnere tilbake et annet Crawler-objekt til oss som inneholder den faktiske testte sideens respons. Vi vil deretter teste dette svaret for å sikre at alt er som forventet.Legg til følgende kode i din
testHome
metode:$ heading = $ crawler-> filter ('h1') -> eq (0) -> tekst (); $ this-> assertEquals ('Crawling Home Page', $ heading);Vi begynner med å ringe vår
$ crawler
objektetsfilter()
metode for å filtrere sidens svar og velg alleh1
elementer. Vi kan da kjede på andre metallsamtaler for å filtrere utvalget vårt enda lenger. Her bruker jegeq ()
metode som aksepterer en indeksposisjon av h1-elementet vi ønsker å velge. Jeg valgte å velge indeks0
, den første overskriften. Til slutt kjører jeg på tekstmetodeanropet, som vil returnere dette HTML-elementets tekstinnhold og lagre resultatet i en $ overskriftsvariabel.Etter å ha filtrert h1-elementet som vi vil teste for, må vi nå hevde at vi har det riktige elementet. Vi gjør dette ved hjelp av
assertEquals ()
metode som aksepterer som det første argumentet verdien vi forventer at overskriften skal ha, og som det andre argumentet, den faktiske verdien av det returnerte svaret, som er vår $ overskrift selv. Ved å gjøre dette, vet vi at vi er på riktig side, hvis innholdet samsvarer med det vi forventer at det skal være.Kjører overskriftstesten
Så med bare fire enkle linjer med PHP-kode, kan vi teste vår hjemme-kontroller, mal og rute. La oss kjøre testen vår for å sikre at den passerer. I din terminal, fra din side
kryp
Symfony-prosjektet, løpphpunit -c app /
. Du bør se følgende:Her har vi nå to tester og to påstander, som alle passerer! Nå kan du teste for det enkle avsnittet under overskriften på en lignende måte, men denne gangen bruker vi
først()
, metode, slik:$ para1 = $ crawler-> filter ('p') -> første () -> tekst (); $ this-> assertEquals ("Her er vår gjennomsøkingsside.", $ para1);Hvis du gjør om testene dine, har vi nå tre forbigående påstander. Godt jobbet!
Testing Klikk på en lenke
La oss nå prøve å teste ut prosessen med å klikke på denne siden for denne andre siden. Det burde ta oss til den andre siden og vise det riktige innholdet der også. Sett inn følgende kode i din
testHome
metode:$ link = $ crawler-> filter ('a: contains ("denne andre siden")') -> first () -> link (); $ otherPage = $ klient-> klikk ($ link); $ this-> assertEquals ('Other Page', $ otherPage-> filter ('h1') -> første () -> tekst ());Vi starter med å filtrere vår hjemmeside ved
en
tags. Vi bruker: Inneholder ()
filter metode for å filtrereen
koder ved innholdet deres, så vi sørger for å velge riktig kobling. Vi kjeder bare påførst()
metode for å ta tak i den første og ringe tilkobling ()
Metode på det å opprette et koblingsobjekt slik at vi kan simulere klikke på den ved hjelp av vår$ klient
.Nå som vi har a
$ lenke
objekt, vi må klikke på det ved å ringe$ klient
objektetsKlikk ()
metode og passerer i$ lenke
motsette seg det og lagre svaret tilbake i$ otherPage
variabel. Dette er akkurat som alle andre Crawler-objekter, og klikmetoden returnerer svaret. Meget lett!Og så til slutt, hevder vi bare at vår
$ otherPage
Overskriftsteksten er lik det vi forventer at den skal brukeassertEquals ()
metode. Hvis det er, vet vi at vår lenke fungerer!Kjør testene dine en gang!
La oss nå kjøre testene våre en engangs tid for å sikre at vår lenke fungerer riktig, og at vi er på riktig side etter å ha klikket på den. Her er mine Terminalresultater:
Vi har to tester og fire påstander, som alle passerer. Appen er fullført!
Konklusjon
Og det er det. Vi har testet at våre kontroller, kontrollerhandlinger, maler og ruter alle virker sammen, og vi vet at HTML og innhold for hvert element vises riktig på siden, samt at vår lenke, koblinger til riktig sted. Jobb godt utført.
Jeg oppfordrer deg nå til å prøve ut det du har lært, ved å teste ut
annen
side, legger til flere HTML eller lenker til det, og får vanligvis en følelse av å bruke Crawler for å sikre at siden din fungerer som forventet.