lad os derfor et enkelt app i folkesundhedsprogrammet

, lad os derfor et enkelt app i folkesundhedsprogrammet,,,,, 64,,,,,,,, 44,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss. denne post er en del af en serie kaldet prøvekørt folkesundhedsprogrammet. automatisk test til tdd med phpdeciphering afprøvning jargon, i denne lektion, jeg vil præsentere en gennemgående eksempel på en simpel anvendelse - nøje med tdd i folkesundhedsprogrammet.jeg vil følge dig gennem de enkelte skridt, en ad gangen, og at forklare de valg, jeg har truffet for at få arbejdet gjort.f.eks. følger nøje regler for tdd: skrive test, skrive koden, refactor.,,,, trin 1 - indledning til tdd - & phpunit, prøvekørt udvikling (tdd), derfor er en "test" teknik til at udvikle og udforme software.det er næsten altid i deres grupper, er et af de vigtigste instrumenter for fleksibel udvikling af software.derfor blev defineret og indført til fagfolk i kent beck i 2002.siden da er det blevet en accepteret - og anbefalede - teknik i den daglige planlægning. derfor har tre grundlæggende regler:,,, du ikke har lov til at skrive en produktion kode, hvis der ikke er en ikke - test til at begrunde den. det er ikke tilladt at skrive mere af en enhed test, end hvad der er strengt nødvendigt for at gør det ikke.ikke at udarbejde /løber ikke. du har ikke lov til at skrive en større produktion, kode, end hvad der er strengt nødvendigt for at gøre de ikke prøve bestå.,, phpunit, phpunit er det instrument, der giver mulighed for at udføre forsøg på programmører enhed, og praksis prøvekørt udvikling.det er en komplet enhed afprøvning ramme med "støtte.selv om der er nogle alternative valg, phpunit er det mest anvendte og mest fuldstændige løsning for folkesundhedsprogrammet i dag. at installere phpunit, du kan følge med den forrige lektion i vores "tdd i folkesundhedsprogrammet" samling, eller du kan bruge pærer, som forklaret i den officielle dokumentation, blive, rod. eller brug, sudo, sørg for, at du har den seneste pærer:, pære opgradere pære, give auto opdagelse:, pære ud sat auto_discover 1, installere phpunit:, pære installere pear.phpunit.de/phpunit, mere information og vejledning til at installere ekstra phpunit moduler kan findes i den officielle dokumentation, nogle linux udlodninger. tilbud, phpunit, som precompiled pakke, selv om jeg altid anbefale et anlæg, via pære, fordi den sikrer that de seneste og mest ajourførte version er installeret og anvendes. netbeans & phpunit, hvis du er en fan af netbeans, kan du få det til at arbejde med phpunit ved at følge disse trin:,, gå til netbeans "konfiguration (værktøj /optioner), udvælger php /enhed, afprøvning, kontrol af, at" phpunit manuskript "indgangssteder til en gyldig phpunit fuldbyrdes.hvis den ikke gør det, netbeans vil fortælle dig dette, så hvis du ikke ser nogen rød meddelelser på den side, du er god til at gå.hvis ikke, se til phpunit eksekverbar på dit system og gå sin vej i input område.systemer til linux, denne vej er typisk /bar /bin /phpunit,.,, hvis du ikke bruger en ide med enhed afprøvning af støtte, kan du altid løbe din test direkte fra konsollen:, cd /min /ansøgninger /test /mappe phpunit, trin 2 - problem at løse. vores hold er tager sig af gennemførelsen af en "pakke" træk. lad os antage, at vi er en del af et stort selskab, der har en avanceret anvendelse til at udvikle og opretholde.vores hold er tager sig af gennemførelsen af en "pakke" træk.vores kunder ønsker ikke at se horisontalt skriftrulle, barer, og det er job at overholde. i dette tilfælde, er vi nødt til at skabe en klasse, der er i stand til formatering en vilkårlig lidt tekst, der gives som input.resultatet skal være ord, pakket ind i et bestemt antal personer.reglerne for ord indpakning, bør følge de opførsel af andre hver dag ansøgninger, som tekst, redaktører, hjemmeside tekst områder osv. vores klient forstår ikke reglerne for ord indpakning, men de ved, at de vil have det, og de ved, at det vil arbejde på samme måde, som de har oplevet i andre programmer.,, trin 3 - planlægning, tdd - hjælper du opnå en bedre udformning, men det fjerner ikke behovet for foran design og tænkte.,, en af de ting, som mange programmører glemmer, når de begynder at tdd, er at tænke og planlægge på forhånd.derfor hjælper med at opnå en bedre udformning af det meste af tiden, med mindre kode og kontrollerede funktioner, men det fjerner ikke behovet for foran design og menneskelige tænkning. hver gang, du er nødt til at løse et problem, du skulle afsættes tid til at tænke over det, at forestille sig en lille design - ikke noget smart - nok til at få dig i gang.er det en del af jobbet hjælper også dig til at forestille dig, og gæt, mulige scenarier for logikken i anvendelse. lad os tænke på de grundlæggende regler for en ord - træk.jeg tror, nogle fn - tekst vil blive givet til os.vi vil vide, antallet af personer pr. linje, og vi vil have det til at være pakket ind.det første, der kommer til mit sind er, at teksten er flere tegn end antallet på en linje, vi bør tilføje en ny budgetpost i stedet for den sidste plads karakter, der er stadig på linjen, det vil opsummere opførsel af systemet, men det er alt for kompliceret for en test.for eksempel, hvad med, når et ord er længere end antallet af tegn, tillades i en linje?hmmm...det ligner en kant, sag. vi kan ikke erstatte et rum med en ny linje, fordi vi ikke har nogen plads på den linje.vi skal tvinge pakke ordet, effektivt at opdele det i to. disse forslag bør være klart nok til, at vi kan begynde at programmering.vi har brug for et projekt og en klasse.lad os kalde det, indpakning,.,, trin 4 - projektet, og at skabe den første test, lad os skabe vores projekt.der bør være en vigtigste mappe til kilde klasser, og en test /, servietter, naturligvis, for de prøver. den første sag, vi vil skabe, er en prøve på, test, mappe.alle vores fremtidige test vil være indeholdt i denne mappe, så jeg vil ikke angive det igen udtrykkeligt i denne forelæsning.navn testen klasse noget beskrivende, men enkel., wrappertest, vil gøre nu. vores første test ser sådan noget, require_once dirname (__file__)./... /papir. folkesundhedsprogrammet "klasse wrappertest udvider phpunit_framework_testcase {funktion testcancreateawrapper() {$indpakning = nye wrapper();}}, husker du nok.vi har ikke lov til at skrive en produktion kode før en ikke - test - ikke engang en klasse erklæring.det er derfor, jeg skrev den første prøve ovenfor, cancreateawrapper,.nogle mener, at dette skridt er nytteløst, men jeg mener, at det er en god lejlighed til at tænke over den klasse, vi vil skabe.har vi brug for en klasse?hvad skal vi kalde det?skal det være statisk?når du afprøve ovenfor, vil de modtage en fatal fejl budskab, som følgende: under folkesundhedsprogrammet fatal fejl: require_once(): ikke påkrævet "/vej åbning /til /wordwrapphp /test /... /papir. folkesundhedsprogrammet (include_path =.: /bar /andel /php5: /bar /andel /folkesundhedsprogrammet aspektet") i /sti //wordwrapphp /test /wrappertest.php på linje 3, for pokker!vi bør gøre noget ved det.skabe et tomt papir, klasse i projektets vigtigste mappe. klasse indpakning {}, det er det.hvis du løber testen igen, det går over.tillykke med din første prøve.,, trin 5 - den første virkelige test, så har vi vores projekt, der er oprettet og fungerer, og nu er vi nødt til at tænke på vores første virkelige test. det ville være den letteste... den dummeste... den mest grundlæggende prøve at gøre vores nuværende produktion koden, ikke?det første, man kommer til at tænke på ", giver det en kort nok ord, og at resultatet er uændret." det lyder tiltalende. lad os skrive testen. require_once dirname (__file__)./... /papir. folkesundhedsprogrammet "klasse wrappertest udvider phpunit_framework_testcase {funktion testdoesnotwrapashorterthanmaxcharsword() {$indpakning = nye wrapper(); assertequals ('word, $indpakning - > bind ('word ', 5)}}, det ser temmelig kompliceret.hvad betyder "maxchars" i funktion navn?hvad betyder, 5, i pakker, metode henviser til?jeg tror, noget er ikke rigtigt her.er der ikke en enkel test, som vi kan løbe?jo, der er!hvad hvis vi er færdige...intet. - tom snor?det lyder godt.det komplicerede test ovenfor, og i stedet lægger vores nye, enklere, som vist nedenfor: require_once dirname (__file__)./... /papir. folkesundhedsprogrammet "klasse wrappertest udvider phpunit_framework_testcase {funktion testitshouldwrapanemptystring() {$indpakning = nye wrapper(). $- > assertequals (" $indpakning - > bind (')), det her er meget bedre.navnet på den test er let at forstå, vi har ikke nogen tråde eller numre, og mest af alt, er det ikke!, fatal fejl: opfordring til udefinerede metode indpakning: wrap()... som du kan se, jeg slettede vores første test.det er nytteløst at udtrykkeligt kontrollere, om en genstand kan være i brug, når andre undersøgelser har også brug for det.det er normalt.med tiden, vil du finde, at slette test er en fælles sag.undersøgelser, især enhed prøver, skal løbe hurtigt - meget hurtigt.og ofte meget hyppigt.i betragtning af, at afskedigelse i test, er vigtigt.forestil dig, at du løber tusindvis af test, hver gang du redde projektet.det bør ikke tage mere end et par minutter, højest, for dem at løbe.så, du skal ikke være bange for at slette en test, hvis det er nødvendigt. for at vende tilbage til vores produktion kode, lad os gøre det test give: klasse papir (funktion pakke ($tekst) {afkast), ovenfor, har vi tilføjet absolut ikke mere kode, end det er nødvendigt for at gøre test passere. trin 6 - der presser på, for den næste ikke test, funktion testitdoesnotwrapashortenoughword() {$indpakning = nye wrapper(). $- > assertequals ('word, $indpakning - > bind ('word ', 5)}, ikke besked:, ikke hævde, at deres tændstikker forventede "ordet". og den kode, der gør det forbi:, funktion pakke ($tekst) {tilbage $tekst;}, wow!det var nemt, ikke?mens vi er på den grønne, konstatere, at vores test kode kan begynde at rådne op. vi er nødt til at refactor et par ting.husk altid at refactor, når din test give; det er den eneste måde, det kan de være sikker på, at du har refactored korrekt. lad os fjerne overlapningen af de initialization af papir objekt.vi kan kun gøre dette, når den, setup(), metode, og bruge det til begge prøvninger. klasse wrappertest udvider phpunit_framework_testcase (private $indpakning; funktion setup() {$- > papir = nye wrapper();} funktion testitshouldwrapanemptystring() {$- > assertequals ("$- > papir - > bind ('));} funktion testitdoesnotwrapashortenoughword() {$- > assertequals ('word, $- > papir - > bind ('word', 5)}},,, fælde, metode vil løbe, før hver ny test.,, der er nogle uklare stykker i den anden test.hvad er ordet "?hvad er "5"?lad os gøre det klart, at den næste programmør, der læser disse tests, behøver ikke at gætte., glem aldrig, at din test er også den mest opdatering til dato dokumentation for din kode.en anden programmør bør være i stand til at læse de prøvninger, som er let, som de kan læse den dokumentation,., funktion testitdoesnotwrapashortenoughword() ($texttobeparsed = "ord" $maxlinelength = 5 $- > assertequals ($texttobeparsed $- > papir - > bind ($texttobeparsed, $maxlinelength))), læs nu denne påstand.ikke at læse bedre?selvfølgelig gør det det.du skal ikke være bange for lange variable navne for din test; auto afslutning er din ven!det er bedre at være beskrivende som muligt. nu, for den næste ikke test, funktion testitwrapsawordlongerthanlinelength() ($texttobeparsed = alongword. $maxlinelength = 5 $- > assertequals ("sammen. nword" $- > papir - > bind ($texttobeparsed - maxlinelength)), og den kode, der gør det forbi:, funktion pakke ($tekst, $linelength) (hvis (strlen ($tekst) > $linelength) tilbage substr ($tekst, 0 $linelength). "\\ n ".substr ($tekst, $linelength); tilbage $tekst;}, det er indlysende - kode for at gøre vores sidste test.men pas på - det er også en kode, der gør vores første test, ikke passere!,, vi har to muligheder for at løse dette problem:,, ændre koden - anden parameter, valgfrit, ændre den første test - og gøre det til den kode med en parameter, hvis du vælger den første mulighed, at parameteren frivilligt, det ville give et lille problem med de nuværende kode.en valgfri parameter er også indledes med en fast værdi.hvad kan en sådan værdi?nul lyder logisk, men det ville indebære, at skrive kode for at behandle det særlige tilfælde.fastsættelse af et meget stort antal, så den første, hvis udtalelse ikke ville resultere i korrekt, kan være en anden løsning.men, hvad er det?- er det 10.det er 10.000?er det 10000000?vi kan ikke sige, at alle disse, vil jeg bare ændre den første test:, funktion testitshouldwrapanemptystring() {$- > assertequals ("$- > papir - > bind (, 0)}, igen, grøn.vi kan nu gå videre til den næste test.lad os sørge for, at hvis vi har en meget lang ord, vil det få på flere strækninger., funktion testitwrapsawordseveraltimesifitstoolong() ($texttobeparsed = averyverylongword. $maxlinelength = 5 $- > assertequals ("avery. nveryl. nongwo. nrd" $- > papir - og gt pakke ($texttobeparsed, $maxlinelength)}, dette er naturligvis ikke, fordi vores faktiske produktion kode var kun en gang, ikke påberåbe sig, at to betingelser er lige.- forventede + + + faktiske @ @ @ @ "avery - veryl - ongwo - rd + verylongword, kan du lugte det, mens, loop kommer?tænk igen.er en, mens, loop - den enkleste kode, der ville gøre testen bestået?i henhold til omdannelse prioriteter (af robert c. martin), er det ikke.recursion er altid mere enkel end en løkke, og det er meget mere testes, funktion, pak ($tekst, $linelength) (hvis (strlen ($tekst) > $linelength) tilbage substr ($tekst, 0 $linelength). "\\ n ".$- > bind (substr ($tekst, $linelength), $linelength); tilbage $tekst;}, kan du se det?det var enkelt.alt, vi gjorde, i stedet for concatenating med resten af den snor, vi concatenate med værdien af at kalde os tilbage med resten af snor.perfekt!,, trin 7 - bare to ord, den næste enkle test?hvad med to ord kan pakke, når der er en plads i slutningen af linjen., funktion testitwrapstwowordswhenspaceattheendofline() ($texttobeparsed = 'ord, ord, $maxlinelength = 5 $- > assertequals ("ordet. nword" $- > papir - > bind ($texttobeparsed, $maxlinelength)}, det passer.men løsningen kan være lidt sværere nu. først, du kunne henvise til, str_replace(), til at slippe af med den plads, og indsætte en ny linje.ikke; den vej fører til en blindgyde, den anden mest indlysende valg ville være, hvis udtalelse.sådan noget, funktion pakke ($tekst, $linelength) (hvis (strpos ($tekst, ") = = $linelength) tilbage substr ($tekst, 0, strpos ($tekst,"). "\\ n ".$- > bind (substr ($tekst, strpos ($tekst, ") + 1), $linelength); hvis (strlen ($tekst) > $linelength) tilbage substr ($tekst, 0 $linelength)."\\ n ".$- > bind (substr ($tekst, $linelength), $linelength); tilbage $tekst;} imidlertid, at i det uendelige, hvilket vil give den test til fejl. under folkesundhedsprogrammet fatal fejl: tilladt hukommelses størrelse af 134217728 bytes er opbrugt, denne gang, vi er nødt til at tænke!problemet er, at vores første test er en tekst med en længde på nul.også strpos(), vender forkert, når det ikke kan finde en snor.en sammenligning af falske med nul...er?det er sandt.det er skidt for os, fordi den blev uendeligt loop.den løsning?lad os ændre den første betingelse.i stedet for at søge efter en plads og sammenligne sin holdning med den linje, længde, lad os i stedet forsøge at direkte tage karakter på position angivet af linjen er længde.vi vil gøre, substr(), kun et tegn, begynder på det rigtige sted i teksten, funktion, pak ($tekst, $linelength) (hvis (substr ($tekst, $linelength - 1, 1) = = ') tilbage substr ($tekst, 0, strpos ($tekst' '). "\\ n ".$- > bind (substr ($tekst, strpos ($tekst, ") + 1), $linelength); hvis (strlen ($tekst) > $linelength) tilbage substr ($tekst, 0 $linelength)."\\ n ".$- > bind (substr ($tekst, $linelength), $linelength); tilbage $tekst;}, men hvad hvis det rum er ikke i slutningen af linjen?funktion testitwrapstwowordswhenlineendisafterfirstword() ($texttobeparsed = 'ord, ord, $maxlinelength = 7 $- > assertequals ("ordet. nword" $- > papir - > bind ($texttobeparsed, $maxlinelength)}, hmm...vi er nødt til at ændre vores forhold igen.jeg tænker, at vi trods alt har brug for at finde frem til en holdning af rummet karakter., funktion pakke ($tekst, $linelength) (hvis (strlen ($tekst) > $linelength) (hvis (strpos (substr ($tekst, 0 $linelength) ').= 0) tilbage substr ($tekst, 0, strpos ($tekst, ")."\\ n ".$- > bind (substr ($tekst, strpos ($tekst, ") + 1), $linelength); tilbage substr ($tekst, 0 $linelength)."\\ n ".$- > bind (substr ($tekst, $linelength), $linelength)} tilbage $tekst;}, wow!det virker faktisk.vi flyttede den første betingelse i den anden, så vi undgår uendelige, og vi tilføjede, at finde plads.alligevel, det ser ret grim.indlejrede forhold?føj.det er tid for nogle refactoring., funktion pakke ($tekst, $linelength) (hvis (strlen ($tekst) < = $linelength) afkast $tekst; hvis (strpos (substr ($tekst, 0 $linelength) ').= 0) tilbage substr ($tekst, 0, strpos ($tekst, ")."\\ n ".$- > bind (substr ($tekst, strpos ($tekst, ") + 1), $linelength); tilbage substr ($tekst, 0 $linelength)."\\ n ".$- > bind (substr ($tekst, $linelength), $linelength)}, det er meget bedre.,, trin 8 - hvad med flere ord?,, intet ondt kan ske som følge af en test, den næste enkle test ville være at have tre ord indpakning på tre linjer.men prøven passerer.vil du skrive en test, når man ved, at det vil gå?det meste af tiden, men, hvis du er i tvivl, eller du kan forestille dig direkte ændringer til den kode, der ville gøre de nye test ikke, og de andre pas, så skriv det!intet ondt kan ske som følge af en test.desuden mener, at dine prøver er deres dokumentation.hvis din test udgør en væsentlig del af din logik, så skriv det!yderligere, de undersøgelser, vi kom op med går, er et tegn på, at vi er tæt på en løsning.selvfølgelig, når du har en algoritme, en test, som vi skriver vil gå. nu - tre ord på to linjer med den linje, der i det sidste ord, nu, at det ikke fungerer testitwraps3wordson2lines() {$. texttobeparsed = 'ord, ord, ord, $maxlinelength = 12 $- > assertequals ("ord, ord. nword" $- > papir - > bind ($texttobeparsed, $maxlinelength)}, jeg næsten forventede dette arbejde.når vi undersøger den fejl, vi får, ikke hævde, at to betingelser er lige.- forventede + + + faktiske @ @ @ @ -'word ord - "+'word + ord, ord, ja.vi skal pakke på den yderste højre rum i en linje., funktion pakke ($tekst, $linelength) (hvis (strlen ($tekst) < = $linelength) afkast $tekst; hvis (strpos (substr ($tekst, 0 $linelength) ').= 0) tilbage substr ($tekst, 0, strrpos ($tekst, ")."\\ n ".$- > bind (substr ($tekst, strrpos ($tekst, ") + 1), $linelength); tilbage substr ($tekst, 0 $linelength)."\\ n ".$- > bind (substr ($tekst, $linelength), $linelength)}, blot erstatter den, strpos() med, strrpos(), i den anden, hvis udtalelse.,, trin 9 - andre ikke - test?kant sager?det bliver sværere.det er ret svært at finde en ikke - test.eller en test, for det spørgsmål, som endnu ikke var skrevet. det er et tegn på, at vi er meget tæt på en endelig løsning.men, hey, jeg tænkte bare på en prøve, som vil mislykkes!funktion testitwraps2wordson3lines() ($texttobeparsed = 'ord, ord, $maxlinelength = 3 $- > assertequals (hsc) nd. nwor) og "$- > papir - > bind ($texttobeparsed, $maxlinelength)}, men jeg tog fejl.det går over.hmm...er vi klar?vent, vent, vent!hvad med det her?funktion testitwraps2wordsatboundry() ($texttobeparsed = 'ord, ord, $maxlinelength = 4 $- > assertequals ("ordet. nword" $- > papir - > bind ($texttobeparsed, $maxlinelength)}, ikke det!fremragende.når de har samme længde som de ord, vi ønsker den anden linje til ikke at begynde med et rum, ikke påberåbe sig, at to betingelser er lige.- forventede + + + faktiske @ @ @ @ 'ord - ord » + isc + d', der er flere løsninger.vi kan indføre en anden, hvis erklæring for at kontrollere fra rummet.det ville være i overensstemmelse med resten af de hypoteser, som vi har skabt.men er der ikke en enkelt løsning?hvad hvis vi bare, trim() teksten?, funktion pakke ($tekst, $linelength) ($tekst = beklædning ($tekst); hvis (strlen ($tekst) < = $linelength) afkast $tekst; hvis (strpos (substr ($tekst, 0 $linelength) ').= 0) tilbage substr ($tekst, 0, strrpos ($tekst, ")."\\ n ".$- > bind (substr ($tekst, strrpos ($tekst, ") + 1), $linelength); tilbage substr ($tekst, 0 $linelength)."\\ n ".$- > bind (substr ($tekst, $linelength), $linelength)}, der går vi.,, trin 10 - vi er færdige, på dette punkt, kan jeg ikke opfinde ikke prøve at skrive.vi skal være færdige.vi har nu brugt tdd - at opbygge et enkelt, men nyttige, seks linje algoritme. et par ord om at stoppe og "." hvis du bruger tdd, du tvinge dig selv til at tænke på alle mulige situationer.du så skrive test for disse situationer, og i den forbindelse begynder at forstå problemet meget bedre.normalt, at denne proces resulterer i et indgående kendskab til den algoritme.hvis du ikke kan finde en anden ikke prøver at skrive, betyder det, at din algoritmen er perfekt?ikke nødvendig, medmindre der er en forud fastlagt sæt af regler.derfor ikke garanterer insekt under kode, men hjælper dig skrive bedre kode, der bedre kan forstås og ændret.og endnu bedre, hvis du vil opdage et insekt, er det meget lettere at skrive en test, der viser insekt.på denne måde kan man sikre, at insekt aldrig opstår igen - - fordi du har prøvet det!endelig bemærker, du kan hævde, at denne proces ikke er teknisk "derfor". og du har ret.dette eksempel er tættere på, hvor mange daglige programmører.hvis du vil have et rigtigt "tdd - som du mener det eksempel, læg en bemærkning nedenfor, og jeg planlægger at skrive en i fremtiden. tak for det!,





Previous:
Next Page: