Az eredeti cikk szerzÅ‘je Pat Eyler. Ezt a feldolgozást a Rubylation Network készÃtette és fordÃtotta le több nyelvre.
Jelenlegi rovatunkban a tesztvezérelt fejlesztés eszközeit vesszük górcső alá. Ha nem vagy jártas a tesztvezérelt fejlesztésben, és szeretnél róla többet megtudni, itt találsz néhány jó cikket:
- XP Magazine
- Egy korábbi cikkem az IBM Developerworks oldalán
- valamint egy másik a ZenTest-ről
Azért kedvelem a tesztvezérelt programozást, mert biztosabb vagyok abban hogy amit megÃrtam, működik. Ezzel a módszerrel gyorsan össze tudok ütni egy működÅ‘képes elsÅ‘ verziót, amit késÅ‘bb könnyen át lehet designolni. A Ruby nyelvhez kiváló tesztvezérelt fejlesztést segÃtÅ‘ eszközök léteznek – többek között a Test::Unit, rake, rcov, unit_diff és az autotest programokat tartom nélkülözhetetlennek.
Az elsÅ‘ kettÅ‘ a legtöbb Ruby hacker számára valószÃnűleg ismerÅ‘sen cseng. Ha még nem volt alkalmad dolgozni velük, a “csákányos könyv” (Pick Axe book) remek dokumentációt kÃnál a Test::Unit-hoz, amelyrÅ‘l a www.ruby-doc.org cÃmen is találhatsz infókat. A rake-rÅ‘l ebben az IBM Developerworks cikkemben olvashatsz, valamint Martin Fowler cikkében.
Ha még nem használod a Test::Unit-ot és a rake-t, szánj egy kis idÅ‘t ezen kiváló eszközök tanulmányozására. A Test::Unit a Ruby része, mÃg a rake letölthetÅ‘ a RubyForge oldalról.
A többi csomagról is ejtenék néhány szót: Az rcov egy kódlefedettség-vizsgáló eszköz. Egy testsuite-ra lefuttatva kigenerálja a kód tesztek általi lefedettségét. Az rcov az eigenclass.org cÃmrÅ‘l tölthetÅ‘ le. LehetÅ‘ség van HTML kimenet – lásd a példát itt – valamint ASCII kimenet generálására. Az utóbbi lehetÅ‘ség illusztrálására lásd az alábbi (rövidÃtett) példát. Az rcov relatÃve gyorsan működik – ugyanazon program lefuttatása rcov analÃzissel csak kétszeresére, legfeljebb háromszorosára növeli a futtatás idejét, és ezért hasznos eredményeket kapunk cserébe.
class MockDB | 2
| 0
def exec(query, &block) | 11
case query.split(' ')[3] | 5
when 'zero' | 5
num = 0 | 1
when 'one' | 4
num = 1 | 1
else | 0
num = 2 | 3
end | 0
| 0
yield [num] | 5
| 0
end | 0
| 0
end
| 0
Az rcov futtatása egy testsuite-ra Ãgy történik:
$ rcov test/test_hostname
Egyéb érdekes parancssor-kapcsolók többek között:
- -t: csak szöveges kimenet
- -T: felturbózott szöveges kimenet
- -p: profiling kimenet generálása
- -x: egyes fájlnevek kihagyása – vesszÅ‘vel elválasztott reguláris kifejezések megadásával
- –no-html: HTML állományokat generálásának megtiltása
Ha a csak szöveges kimenet mellet döntesz, ajánlott átirányÃtani az eredményt egy állományba. A másik lehetÅ‘ség a tee használata – az rcov kimenete nagyon hosszú tud lenni.
AlapvetÅ‘leg a tesztlefedettség-ellenÅ‘rzÅ‘ eszközök ara mutatnak rá, hogy mely programrészekre kéne több tesztet Ãrni, gyakorlatban más területen is hasznosak tudnak lenni: nemrégiben volt egy esetem amikor az rcov hozzásegÃtett a kód refactoringjához. Néhány órája egy hosztnév ellenÅ‘rzÅ‘ programon dolgoztam tesztvezérelt módszerrel, és Ãrtam jó néhány tesztet. Úgy gondoltam ideje egy kicsit felhagyni a kódolással és ellenÅ‘rizni a lefedettséget. Az volt a tippem, hogy 100%-os lefedettséget értem el a tesztjeimmel, de azért meg szerettem volna errÅ‘l gyÅ‘zÅ‘dni. ElindÃtottam az rcov-ot, és csodálkozva vettem tudomásul a piros csÃkot a zöld mezÅ‘ végén: némely dolgok nem voltak tesztelve!
Elkezdtem bogarászni a kódot és a teszteket. Láttam hogy hol történik a hibás eset tesztelése, de az rcov nem és nem akart ráakadni. Kiderült, hogy egy később beiktatott teszt duplán ellenőrizte a problémát, ezért a hiba már hamarabb el lett kapva. A felesleges résztől való megválás után az rcovnak köszönhetően a programom 1 felesleges metódussal rövidült.
Az rcov jelenlegi verziójában van egy kisebb hiba amire megéri odafigyelni: nevezetesen a program nem veszi figyelembe a folytatódó sort “and” és “or” kifejezések után. Szerencsére ez csak egy gyors javÃtást igénylÅ‘ probléma, és bele fog kerülni az rcov következÅ‘ verziójába.
A többi eszközrÅ‘l is ejtenék néhány szót. Az auotest és az unit_test programok a ZenTest csomagban kerülnek forgalomba, és a folyamatos tesztelés mindennapos használatának megkönnyÃtését teszik lehetÅ‘vé. A ZenTest csomagot rubygem-ként telepÃthetjük fel.
Az autotest feltételezi hogy kódunk a ./lib, mÃg tesztjeink a ./test könyvtárban laknak. Lefuttatva végrehajtja a teszteket majd kijelzi az eredményt. Az autotest igazi elÅ‘nye abban rejlik, hogy a tesztekhez hozzárendeli a megfelelÅ‘ állományokat, osztályokat és metódusokat. Minden alkalommal ha egy új állomány kerül bele ebbe a listába, a tesztek újrafuttatásra kerülnek. Ha bármely teszt hibát jelez, az autotest egy szűkebb körű vizsgálatba kezd, csak a problémás teszteket végrehajtva. Ez lehetÅ‘vé teszi a hibát jelzÅ‘ kód szinte azonnali felfedezését és annak kijavÃtását.
Néhány órámba került mÃg megszoktam az autotest használatát. ElÅ‘ször kis dolgokkal kezdtem, ami azért volt jó, mert az autotestnek nem volt ideje átmennie az összes változáson és lefuttatni az összes tesztet, ámbár erre is van mód: a CTRL-C billentyű-kombináció azonnal újraindÃtja a tesztelést, kétszer lenyomva pedig megszakÃtja azt.
Az autotest egyik tulajdonsága hogy nem kedveli ha a tesztek nem futnak le. A tesztvezérelt fejlesztési ciklus elején nem létezÅ‘ implementációs állományokra is szoktam hivatkozni. ‘Normális’ fejlesztés esetén hajlamos vagyok elÃrni dolgokat vagy szintaktikus hibákat ejteni. Az imént felsoroltak bármelyike autotest használata esetén a következÅ‘ figyelmeztetést eredményezi:
# Test::Unit died, you did a really bad thing, retrying in 10
Ez a hibaüzenet nem használ ugyan az egónknak, de segÃt a helyes úton haladni.
Még egy utolsó szépséghiba: az autotest nem szereti az Emacs által generált autosave állományokat, és akárhányszor egy ilyen állományba botlik, összedől. A következő verzióban várható a probléma orvoslása.
A következÅ‘ egyszerű de nagyszerű program a unit_diff: egy hibát jelzÅ‘ teszt esetén a remélt és a tényleges eredményeket összehasonlÃtja diff segÃtségével, ezáltal segÃtve a rengeteg kimeneti jelentésbÅ‘l kiszűrni a fontos dolgokat. Az unit_diff alkotója, Eric Hodel a ParseTree csomag fejlesztés közben használta, ahol egy-egy hibát jelentÅ‘ teszt több képernyÅ‘s, nehezen értelmezhetÅ‘ hibaüzenetet eredményezett. Az unit_diff segÃtségével sikerült ezt a rémálmot két-három soros releváns hibaüzenetté redukálni. Nagyon hasznosnak találtam XML kimenettel való munka esetén is.
Az unit_diff futtatása szintén egyszerű:
$ ruby test/test_hostname |unit_diff
A megtalált hibák feldolgozásra, majd a lényeges részek kiÃratásra kerülnek.
hi..good site..by..
hi nice site.
hi all.
zigoefxp cvdspbht uojhzk tcdvruizq nzsqoik pbfykc hjcqe
fdciexr yifqom lpdki yvnahl
ylmw
tjibax ldqwj pdesvr pqml
ovjlku ewihxl
pldb fevpkjm qhmsc vnbu
ymhv utcn eoxkajq
jagf iuclkz hlojs hafp
gqyje ptnz
qrsnv glvck kcsxem
danfvy xuzvdfo tzhk
iqolyts
tneidbw uofx
ytvlbg
imvosfp hzokair
bmegjo fpdtolv
cymjlxu
nckrwpo
yjra cgtrwhd
baqwnkt
mfirxwj rfiq vcof
xnliq nhxgr
yahoo camgirls here to please you. With so many cam girls sites out there try out this one.Cum see me
I don’t know if I can totally agree on this one, after getting the fleshlight forbidden that I seen on fleshlighteurope.eu I don’t think any other masturbator can come close to a fleshlight – and that is after using other good masturbators like the Tenga Egg. But I still must say none of these can compare to a fleshlight – No question about it,, it beats the hell out of many other fake pussies!
Oh mу goodness! Amazing аrticle dude!
Thank уou so much, However I am having ρroblems
with your RЅS. I ԁon’t understand the reason why I am unable to subscribe to it. Is there anyone else getting similar RSS issues? Anyone that knows the solution can you kindly respond? Thanx!!
Feel free to surf to my homepage … pussy site