You are on page 1of 23

Laravel Tesztels Egyszeren ( Magyarul!

)
A tesztelsi knyv, amelyre mindig is vgytatok!
JeffreyWay and Zsellr Istvn
This book is for sale at http://leanpub.com/laravel-testing-decoded-hungarian
This version was published on 2013-08-30

This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing
process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and
many iterations to get reader feedback, pivot until you have the right book and build traction once
you do.
2013 JeffreyWay and Zsellr Istvn

Tartalomjegyzk
Legyetek dvzlve . . . . . .
Megkezddtt . . . . . . . .
Nekem rtk ezt a knyvet? .
Mirt Laravel specifikus? . .
Gyakorlatok . . . . . . . . .
Hibk . . . . . . . . . . . .
Hogyan olvasd ezt a knyvet
Jelentkezz nekem . . . . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

1
1
2
2
3
3
3
3

Bele az ismeretlenbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Els fejezet: Tesztelj mindent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Mr eddig is teszteltl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6 nyer tulajdonsga a TDD-nek . . . . . . . . . . . . . . . . . . . . . . . . . . .
1. Biztonsg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2. Rszvtel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3. Felnttkorba lps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4. A tesztelhetsg minsgi architektrt biztost . . . . . . . . . . . . . . .
5. Dokumentci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6. Szrakoztat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mit kell tesztelnem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6 A tesztelhetetlen kd jelei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1. New Opertorok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2. Ellenrzsmnis konstruktorok . . . . . . . . . . . . . . . . . . . . . . .
3. s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 md, hogy szrevegyk a tl sok mindennel foglalkoz osztlyokat .
4. Tl sok tvonal? Polimorfizmust neki! . . . . . . . . . . . . . . . . . . . .
5. Tl sok fggsg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6. Tl sok hiba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Teszt zsargon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Egysgtesztels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Modell Tesztels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Integrci Tesztels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Funkcionlis (Kontroller) Tesztels . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

5
5
6
6
6
7
8
8
8
8
9
9
11
12
12
12
15
15
16
16
16
17
17

TARTALOMJEGYZK

Elfogadsi teszt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nyugi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17
19

Legyetek dvzlve
Tl sokszor lttam ezt mr. Ahogyan egy applikci nvekszik, ugyangy a ronda, teszteletlen kd
is. Nemsokra gy rzed magad, mint aki fulladozik, ahogyan megprblod kzi vezrlsen tesztelni
minden funkcijt! Ilyenkor jut eszedbe, st bizonyoss vlsz, hogy szksg van automatikus
tesztelsre. Megkockztatom, mr olvastl TDD knyvet, de, ahogyan minden dolog az letben,
tapasztalat nlkl nem megy, s az aha pillanat vrat magra.
A gond az, hogy a tesztels elgg trkks foglalatossg. Knnyedn elfordulhat az is, ahogyan
a kdodat rtad, hogy tesztelhetetlen! Amit tudatostani kell, az, hogy a tesztels nem csak arra
garancia, hogy a kdod mkdik, de ezzel a mintval te is jobb fejlesztv vlhatsz. A ronda,
tesztelhetetlen, s kifacsart kdtl rkre megszabadulsz. Higgy nekem: mihelyt megkrded magadtl hogyan tesztelhetnm ezt a dolgot mieltt mg egy sort is rnl, vissza fogsz emlkezni a
rgi nmagadra, s nevetve gondolsz majd azokra az idkre, amikor mg kzpkori mdszerekkel
eszkbltl programokat.
Lgy dvzlve a modern szoftverfejleszts idszakban.
A szoftvertesztels alaptrvnyei (s a TDD) nyelvtl fggetlenek, amikor is a vgrehajtshoz rnk, millird technikval s eszkzzel szembeslnk. Ez a kny legalbb annyira
bevezets a TDD-be, mint egy mlyensznt analzis, hogyan kell ezt a Laravelben vgezni.

Megkezddtt
Amikor programozsi nyelvekr?l beszlnk, mindenkinek megvan a sajt vlemnye. Amikor pedig
ppen a PHP-rl diskurlunk, kszlj fel egy kis szvatsra . Annak ellenre, hogy ez a nyelv jcskn
megizmosodott az elmlt t vben , mindig lesznek olyanok, akik nem tudjk a PHP komolyan venni.
A hitetlenek nem ltjk az 5.5-s verzit, vagy az OOP-ot, vagy a modern keretrendszereket, mint a
Laravel, esetleg sosem hallottak a Composerrl, nem beszlve a test-first fejlesztsrl. Nem bizony,
k mg mindig a rgi, csf PHP 4 kdrl beszlnek, vagy egy rosszul sszedobott WordPress
sablonrl 2008-bl.
Szebb a PHP mint a Ruby? Nem. Az API-ja inkonzisztens idnknt? Biztosan. A kzssg vezet -e
az innovciban s szoftvertervezsben ? Definitve nem. A krds akkor, MIRT? Mirt dominl a
PHP - 80 szzalkos rsszel amikor a versenyben lv nyelvek mindegyike elegnsabb? Az okokat
mshol kell keresnnk. Tegyk fel, a tny, hogy ltrehozol egy fjlt, echo hello world tartalommal,
s mindjrt ltod is a kimenetet a bngszben sokkal inkbb felhasznlbart, mint azt magunknak
be merjk vallani. Lehetsges, hogy a flexibilitsa elnyre vlik, nem pedig htrnyra.

Legyetek dvzlve

Mita kell a knny felhasznlhatsgot lekicsinyelni?


Az igazsg az, hogy a PHP nem az j lny a grundon. Nem klnskppen sexy. Nincs btban.
De, tudod mit? Megcsinlja azt, amit mondanak neki. Beszljenek, amennyit csak akarnak a PHP
4-rl. Ameddig azzal foglalkoznak, mi felhasznljuk mindazt, amit a nyelv legjabb vvmnyai, s
a krltte ltez koszisztma nyjt.
A PHP lesajnlsnak vge. A PHP renesznsza mr elkezddtt. Modern objektum-orientlt technikkat hasznlunk, csomagokat osztunk meg a Composeren keresztl, verzi kontrollt alkalmazunk s
continuous integrationt, modern keretrendszereket hasznlunk, hisznk a tesztelsben (nemsokra
te is fogsz), dvzljk az jonnan jvket (s nem csapjuk senki orrra az ajtt), mikzben a
legszlesebb mosolyunkat mutatjuk.
A legjobb rsz pedig, Laravel felhasznlknt, TE is rszese vagy a mozgalmunknak ! Amikor elszr
csatlakoztam a Laravel IRC csatornjra, nem kellett sokat vrni, s mr valaki ksznttt is Lgy
dvzlve a csaldunkban. Semmi sem rja le szebben a kzssgnket. Egyek vagyunk. Ez az a
PHP kzssg, amelyet n szeretek.
Ha megvetted ezt a knyvet, valsznleg szksged van egy kis segtsgre a tesztelsnl. A Laravel
szellemben, dvzllek a csaldban. Tanuljuk meg ezt egytt.

Nekem rtk ezt a knyvet?


A gondokat a technikai knyvek rsakor az okozza, hogy hol hzzuk meg a hatrt, abbl a
szempontbl, hogy az olvasktl milyen eltudst kveteljnk meg. Ha mr hallottl a kvetkez
dolgokrl, akkor vgj bele !
PHP 5.3
Laravel 3 (lehetleg 4)
Composer

Mirt Laravel specifikus?


A knyvben bemutatott technikk nagy rsze akrmilyen nyelvre,vagy keretrendszerre alkalmazhat, de, tapasztalatom szerint , ebben az j vilgban az els lpseket a legknyelmesebb cipkben
kell megtenni. Megtanulhat a teszt-vezrelt fejleszts egy Java knyvbl? Fogadni mernk r !
Knnyebb lenne-e egy nyelven, s keretrendszerrel, amelyet mr ismerek? Minden bizonnyal.
Msodsorban, egy ltalnos tesztelsi knyvben nem tudnm demonstrlni a PHP-specifikus funkcik s csomagok nagy rszt, amelyet szemlyesen hasznlok mindennapi munkmban. Krbeleli
ez a PHPUnit segtcsomagokat, az acceptance testing keretrendszerekig, mint a Codeception.
Remlem, ahogyan vgigolvasod ezt a knyvet , tesztelsi ismereteid bvtse mellett , sok Laravelspecifikus tippet s trkkt is megismersz.

Legyetek dvzlve

Gyakorlatok
Itt-ott ebben az iromnyban, Gyakorlatok-nak nevezett rszleteket fogsz ltni. Gondolj ezekre,
mint rszletes HOGYAN-okra, amelyeket neked kell megvalstanod, a fejezet rsa kzben. Az
elmlet nmagban nem elg; a programok rsa az, amely ezeket a mintkat, s technikkat
megjegyezhetv teszi.
Teht, amikor egy Gyakorlatok fejezethez rsz, kapcsold be a szmtgpet, s programozzunk
egytt!

Hibk
Krlek, tartsd szben azt, hogy megtettem mindent ami emberileg lehetsges, hogy ez a m lehetleg
hibamentes legyen, de n is csak haland vagyok. Ha valami hasonlt szlelsz, krlek jelentsd a
GitHubon, n pedig javtom, amint lehet. A legkitartbb hibartk jutalma csoportos lels.

Hogyan olvasd ezt a knyvet


Ha kedved van az elejtl a vgig, de kezdheted azzal a fejezettel, amelyik legjobban rdekel.
Minden fejezet egy egszet alkot. Pldul ha mr ismered a unit testing alapjait, biztosan nem kell
elolvasnod a Unit Testing 101 fejezetet! Lapozz t rajta, n addig behunyom a szemem.

Jelentkezz nekem
gy tnik sok idt fogunk egytt tlteni, kzs munklkodsunk sorn. Ha szeretnl kzelebbrl is
megismerni, esetleg pr krdsed lenne, ne felejts el beksznni.
IRC (#laravel channel): JeffreyWay
Twitter: @jeffrey_way
https://github.com/JeffreyWay/Laravel-Testing-Decoded
http://twitter.com/jeffrey_way

Bele az ismeretlenbe
Az j stt ftylt bortotta rnk Vrjunk csak, ez egy msik trtnet. Szval, az j csndes volt, csak
a lgkondi zrgtt egy picit. A felesgem s az llataim mr rgen magamra hagytak, s az igazak
lmt aludjk. A kutym, ahogyan ltalban, a legkitartbb volt, de nem rovok semmit sem a terhre;
ki vagyok n, hogy eltljem ket azrt, mert jjel hromkor aludni szeretnnek? Mindenesetre a
krlmnyek ppen megfelelek voltak. reztem legbell. Ahogyan minden figyelmemet a laptopom
kpernyjre irnytottam, a gondolataim egyszerre egyv forrtak .
A fejlesztk ismerik ezt az rzst: azok a ritka pillanatok, amikor, hirtelen, az azeltt megfejthetetlen,
most, legalbbis els pillantsra, rtelmet nyert. Sokan ezt aha pillanatnak nevezik. Az els
alkalom, amikor megrtettem, mire j a <div> olyan volt. Most mr, persze, mindenkinek rthet,
de ez nem tegnap volt. Minek pakolnm tele a HTML-t <div> -ekkel? A bngsz ugyanazt jelenti
meg! Az egyik nap azt mondtk nekem, gondoljak r mint kosarakra; tedd a HTML-t a kosrba,
aztn, ha valamit odbb kell raknod, csak a <div> -et kell jra pozicionlni. s vgre megrtettem.
Egy csom hasonl pillanatot idzhetnk fel, klnskppen a nehezen megjv tvgyamat az
objektum-orientlt programozshoz, interface-ek kdolsra, vgl teszt-vezrelt fejlesztsre.
Igen, az utbbi dolog nem volt szerelem els ltsra, be kell vallanom. Ahogyan a legtbb fejleszt
is, olvastam egy knyvet, vagy egy cikket rla, aztn azt gondoltam, Hmm, ez rdekesnek tnik
aztn folytattam mindent ahogyan azeltt. Vgl is megmaradt a tudatomban, s az elejn olyan
lgy hangocska egyre hangosabb, s kveteldzbb lett.
Ezt tesztelned kell, Jeffrey. Ha ezt mr tesztelted volna, mr nem kne megint meg
megint futtatnod a programot Ki fognak rhgni, ha erre a pull requestre nem rsz
teszteket.
Mint ahogyan a legtbb dolog az letben, az igazi vltozs ers elhatrozst kvn, s nem rt, ha
az egsz vilggal tudatjuk, Soha tbb! Vgeztem a rgi dolgokkal. s megtettem. Ezrek tettk
ugyanezt. Most pedig rajtad a sor.
Ahogyan Leeroy Jenkins mondan, rendben: fogjunk neki! Ez az a tesztelsi knyv, amelyre
mindannyian vrtatok.
http://www.youtube.com/watch?v=LkCNJRfSZBU

Els fejezet: Tesztelj mindent


Minden ltez tesztelssel foglalkoz knyv tartalmazza a Mirt teszteljnk fejezetet. Ha egy kicsit
dondolkozol rajta, , az, hogy megvetted ezt a knyvet mr azt mutatja, hogy rdekldsz a technika
irnt. Azrt nzzk csak meg mirt tartjk msok olyan fontosnak.
Az applikcik tesztelsnek megtanulsa, sajnos, kezdetben nem knny . Ez meglepnek tnhet;
nekem legalbbis az volt! Az alapgondolat meglepen egyszer: rj teszteket, hogy bebizonytsd ,
hogy a kdod gy mkdik, ahogyan elvrtad.
llandan a Google Chrome-ot nyitogatod, hogy valamely j funkcit tesztelj? Csukd
csak be, helyette rj egy tesztet.
Hogyan tudna ez sszezavarni? Nos, a dolgok gyorsan rzsak lehetnek, amikor utnanzel mit kell
tesztelni.
Kontrollereket kell tesztelnem? s a modellek? Foglalkozzam -e a nzetekkel is? Mi van a
keretrendszer kdjval, az adatbzissal, vagy a web szervizek ltal kapott informcival
? Mi van azzal a millird s egy fajta tesztelsi technikval, amelyet a StackOverflow-n
emlegetnek? A tesztelsi keretrendszerek? PHPUnit? Rspec? Capybara? Codeception?
Mink? A lista nagyon hossz. Hol kell kezdenem?
Nem szeretek fogadni (nos, bizonyos fokig, de leginkbb a felesgemmel vvott Scrabble jtkokra,
amikor orszg vilg eltt zrklhatom ha nyerek), de biztosra veszem, hogy a karriered sorn mr
felvetdtek ezek a gondolatok. A tesztels egyszer. Megrteni mit, s hogyan, egy egszen ms
trtnet. Remnyeim szerint, ez a knyv segteni fog ebben.

Mr eddig is teszteltl
Az igazsg az, hogy mr rgen a tesztels mestere vagy . Ha mr egyszer is lertad, hogy console.log,
vagy elkldtl egy rlapot a web applikcidban, hogy lsd, hogyan mkdik valamilyen j funkci,
akkor mr teszteltl is. Mg klykkorunkban is, mestertesztelk voltunk. Ha megcsavarom ezt a
gombot , az ajt kinylik. Gyzelem!
A gond az, hogy mindezen teszteket kzileg kellett vgezni. Mirt gykdnl olyan dolgokon,
amelyeket a szmtgp el tud vgezni helyetted(mellesleg sokkal gyorsabban)? A knyv clja, hogy
a manulis tesztelstl eljussunk a teljesen automatikusig. Ez lehetv teszi az lland tesztelsi krt,
amelyeknl az applikci fejlesztse kzben egy-egy teszt hajtdik vgre. Meglepen biztonsgoss
teszi ez a fejlesztst.
http://notes.envato.com/team/jeffrey-wins-a-bet/

Els fejezet: Tesztelj mindent

Amikor egy fejleszt felfedezi a test-vezrelt fejleszts tulajdonsgait, olyan rzse tmad, mintha egy j vilg nylna meg szmra kevesebb stresszel, s bizonytalansggal.
- DHH

6 nyer tulajdonsga a TDD-nek


A tesztels csals dolog. Kezdetben azt hiszed, csak arra val, hogy meggyzdj, a kdod mkdik.
Ez nem egszen igaz. A valsgban tbb elnye is van a TDD ciklusnak.

1. Biztonsg
Ha hibzol, vagy egy ltez funkcit teszel tnkre, a test robot azonnal jelenti. Kpzeld el, hogy lersz
valamit, mented, majd abban a pillanatban zenetet kapsz arrl, hogy minden mkdik-e. Nem lenne
nyugodalmasabb az lmod? Emlkszel arra a rondn rt osztlyra, amelyet fltl megvltoztatni,
mert tl sok kls kd fggtt tle? Ha tesztekkel dolgozol, akkor nem kell tartani az ilyesmitl.

2. Rszvtel
Ha nylt forrskd szoftveren szeretnl dolgozni, valsznleg a kzssgi fejleszts vvmnyait is
fel szeretnd hasznlni a GitHubon . Egy id utn, msok is rszt szeretnnek venni, hogy javtsk a
hibkat, vagy j funkcionalitst adjanak hozz. Ha a projekted nem tartalmaz teszteket, s valaki pull
requestet kld, hogyan ellenrizhetnd, ellenrizhetnk, hogy nem trtnik semmi baj? A vlasz?
Nem - kivve, ha minden felhasznlsi forgatknyvet magad prblsz ki. Kinek van erre ideje
minden esetben?
A jl tesztelt projekt olyan, mint a kivlan mkd motor. Ha dolgozni szeretnl egy projekten,
csak nhny lpst kell tenned:
1.
2.
3.
4.
5.

A repo klnozsa
Teszt rsa, amely hibt generl (testThrowsExceptionIfUserNameDoesNotExist)
Vltoztasd meg a kdot, hogy a hiba eltnjn
Futtasd a tesztet, ha a kimenet zlden villog akkor (siker)
Git commit, s pull request klds

Van egy csom continuous integration szerviz, mint a Travis, amely automatikusan futtatja a
teszteket ha pull requestet kap . Ha a teszt nem sikerl, akkor a vltozs nem kerl elfogadsra.
https://travis-ci.org/

Els fejezet: Tesztelj mindent

travis-ci.org

3. Felnttkorba lps
Ha egy kicsit eltrnk a tmtl, viszont tovbbra is a PHP kzssgrl beszlnk, a vlemnyem
az, hogy a WordPress olyan, mint egy ktl kard. Egyfell lehetv tette mindenkinek a bloggolst.
Ez egy letagadhatatlan, tisztelend tny. Knny r sablonokat kszteni a profiknak. Kszts
egy index.php fjlt, dobj be egy hurkot, amely elhvja a legjabb publikcikat, majd trdj a
megjelentssel. Mi lenne egyszerbb ennl?
Ez tulajdonkppen igaz. Ez mellett ltrehozott egy PHP fejleszti grdt, amely csak a Wordpressben
hajland rszt venni. Ennek a kvetkezmnye az lett, hogy modern mintk s technikk , mint a
teszt-vezrelt fejleszts, MVC, verzi kontroll, nagyjbl ismeretlenek szmukra. Ez a kellemetlen
igazsg kt mellkes esemnynek lett az alapja:
1. PHP kzssg a legtbb vitriolt a PHP 4 , s a WordPress kd miatt kapja.
2. A vlts a WordPresstl egy full-stack frameworkig, mint a Laravel, nagyon nehz lehet. Az
j mintk, s eszkzk hasznlatnak megtanulsa nem knny.
A WordPress felels ezrt? Igen is, meg nem is. Annyi azonban bizonyos: nem nagyon trtk
magukat a mestersg fejlesztsn. A tesztels 95%ban ignorlva van (ez persze csak egy kitallt
szm) az elrhet WordPress bvtmnyekben.

Els fejezet: Tesztelj mindent

Vgl is mindenkinek fel kell nnie. Visszagondolhatunk a rgi kdolok, s kzben nem gondolkodok
praktikkra. Ne tervezz, gondolkozz, ne tesztelj; bele a kzepbe, hadd szljon, kzben pedig
llandan tltsd jra az oldalt, htha valami sikerl.
Mi jobbak vagyunk ennl. Mi fejlesztk vagyunk. Ne nzzenek pisztolyhsnek.
Egy rdekes vltozs trtnik, amikor gondolkodsz is mieltt kdolsz : a minsg azonnal javul. Ki
gondolta volna? Gyorsan rjssz, hogy a tesztels nem csak arra j, hogy megbizonyosodj, hogy
mkdik-e a kd. Amikor tesztelnk, hasznlunk egy osztlyt, vagy API-t mg mieltt megrtk
volna. Ez felszabadt, s nveli az olvashatsgot Mi lenne a legjobban olvashat mdszer, hogy
adatot kapjunk egy web szerviztl? rd ezt le, nzd, ahogyan a teszt megbukik, majd tedd rendbe.
gy mkdik!

4. A tesztelhetsg minsgi architektrt biztost


Amit megtanulhatsz a knyvet olvasva, hogy feltedd a krdst , Hogyan tesztelhetnm ezt? mieltt
egy sort is lernl. Ez a krds lesz a biztonsgi ernyd, amely megvd majd a mltbeli rossz
tapasztalatoktl. Egyetlen metdus nem fog egy csom funkcionalitst vgezni, mert n lusta voltam
rendesen megrni. Ez megnehezti a tesztelst. A tesztels javt a struktrn is.

5. Dokumentci
Hatalmas bnusz tesztrsnl, hogy dokumentcit biztost. Szeretnd tudni, hogy valamely osztly
mit is tesz? Nzd t a teszteket, ha rendesen neveztk el ket (ami azt jelenti, hogy lerjk a SUT-ot,
vagy tesztels alatt ll rendszert), semmi perc alatt rteni fogsz mindent!

6. Szrakoztat
Valljuk be : kockk vagyunk. Mely kocka nem szereti a j jtkot? Mellkhats a teszt-vezrelt
fejlesztsnek, hogy a munkt jtkk alaktja. Hogyan sznezem t a vrs kdot zldre? Menj vgig
minden lpsen, ameddig eljutsz a clig. Elszr butn hangzik, de grem: szrakoztat lesz. Magad
is meglthatod.

Mit kell tesztelnem?


Az alapvet trvny - amelyet sokszor meg fogok ismtelni tesztelj mindent ami tnkremehet.
Lehetsges, hogy a definilt tvonalak kzl egy tnkremehet, 404-es oldalt generlva? Igen? Akkor
rj egy olyan tesztet, amely szmol ezzel a lehetsggel. Esetleg egy sajt osztly, amely adatokat kr
le egy tblbl, majd ezeket egy fjlba rja ? Tesztelned kell azt is? Igen. Esetleg egy segdprogram,

Els fejezet: Tesztelj mindent

amely a legjabb csiripeket ssa el, s egy sidebarban jelenti meg ?Ha az egyetlen alternatva, hogy
megnyisd a Google Chrome-ot, s megnzd, akkor a vlasz IGEN.
A kellemetlen dolog, legalbbis az elejn, hogy a tesztelj mindent mantra tl sok munkt jelent.
Amgy is nehz megtanulni a tesztels mvszett, ezrt lassabban is lehet haladni. Kezd elszr
a modellekkel. Ha megy, akkor prblkozz a tbbi rsszel. Nyugdjasan. Megvan annak is mirtje,
mirt tanulunk meg elszr az ujjainkon szmolni.

Figyelmeztets:
Ez a tipp csak flig igaz. Mindennek tesztelse gynyr cl, de ltezik olyan kifejezs mint a
tl-tesztels (ezzel nem mindenki rt egyet). Egy nvekv rsze a kzssgnek gy tartja, hogy
korltozni kell a teszteket azokra a rszletekre, ahol legszksgesebb. Teht, ha ritkn hibzol,
accessorok s mutatorok rsnl, ne knldj a tesztelskkel. A teszteknek kell tgedet szolglniuk,
nem pedig fordtva.
A te feladatod, hogy megtanuld meghzni a hatrt . Meg kell tallni azt a pontot, amikor a
befektetett munka mr nem trl meg?
http://en.wikipedia.org/wiki/Diminishing_returns

6 A tesztelhetetlen kd jelei
A tesztels kicsit olyan, mint utazni egy olyan orszgban, ahol senki sem beszli a nyelvedet.
Ahogyan felfedezed a vidket, mintkat veszel majd szre. Rvid idn bell pedig folykonyan
kommuniklsz. Nem atomfizika, amelyrl beszlgetnk itt, mindenki megtanulhatja, aki akarja.
Csak nyomsts idt ignyel (Olvasd ezt a mondatot Morgan Freeman hangjn).
Ahogyan jobb s jobb leszel, knnyebben szreveszed a macers rszeket. sztnsen szre fogod
venni a hibs mintkat.
A legknnyebb t dolog, amikre oda kell figyelni:

1. New Opertorok
A tesztels alaptrvnye, hogy mindent izollva kell megfigyelni. Ezt az elkvetkez fejezetekben
mg mlyebben is megtrgyaljuk, de rviden az aktulis osztlyt kell tesztelni, semmi mst. Ne
kapcsoldj az adatbzishoz, ne teszteld, hogy a Filesystem osztly adatokat feccl valami web
szerviztl. Azoknak is kijr a sajt tesztjk, ne keverjk ket.
Mihelyt telerakod new opertorokkal az oszlyaidat, azonnal megszeged ezt a trvnyt. Emlkeztetlek: az osztly izollt tesztelse rviden azt jelenti, hogy ms objektumokat nem hozunk ltre a
kdrszletben.

Els fejezet: Tesztelj mindent

10

Hibs minta:
1
2
3
4

public function fetch($url)


{
// We can't test this!
$file = new Filesystem;

return $this->data = $file->get($url);

6
7

Ez egy olyan eset, amikor a PHP nem olyan flexibilis, amennyire szeretnnk. Mg Ruby-ban
jranyithatjuk az osztlyt (ismeretes mint monkey-patching) s fellrhatjuk a metdusokat (amely
klnsen hasznos a tesztelsnl), PHP, sajnos nem engedi meg - legalbbis klnleges bvtmnyek
fordtsa nlkl. Ezrt, hasznlnunk kell egy technikt, amelyet dependency injectionnek hvnak.
gy jobb:
1

protected $file;

2
3
4
5
6

public function __construct(Filesystem $file)


{
$this->file = $file;
}

7
8
9
10
11

public function fetch($url)


{
return $this->data = $this->file->get($url);
}

Ezzel a vltoztatssal , egy Filesystem osztlyt utnzunk, tesztelhetv tve a kdot. Ne zavartasd
magad, ha az albbi kdot nem rted. Nemsokra megtanulod majd a bels mkdst is! Egyenlre
olvasd t.
1
2
3
4

public function testFetchesData()


{
$file = Mockery::mock('Filesystem');
$file->shouldReceive('get')->once()->andReturn('foo');

$someClass = new SomeClass($file);


$data = $someClass->fetch('http://example.com');

6
7
8

$this->assertEquals('foo', $data);

9
10

Els fejezet: Tesztelj mindent

11

Az egyetlen eset, amikor egy osztlybl objektumot hozunk ltre egy msik oszlyban, ha az
objektum egy value-object, vagyis egy kontner getterekkel, s setterekkel, s semmilyen igazi
munkt nem vgez.
Tipp: Nem kell levadszni az sszes osztlyt , amely a new kulcsszavat tartalmazza.

2. Ellenrzsmnis konstruktorok
A konstruktor egyetlen dolga, hogy a fggsgeket meghatrozza. Ezt gy kell elkpzelni, mintha
az oszly azt krn Hozzjuthatnk a Filesystem osztlyhoz?
Ha ettl tbb trtnik, gondolkodj a vltoztatson.
Hibs minta:
1
2
3
4

public function __construct(Filesystem $file, Cache $cache)


{
$this->file = $file;
$this->cache = $cache;

$data = $this->file->get('http://example.com');
$this->write($data);

6
7
8

Javtva:
1
2
3
4
5

public function __construct(Filesystem $file, Cache $cache)


{
$this->file = $file;
$this->cache = $cache;
}

A tesztelsnl a kvetkez hrom dolgot tesszk :


1. Rendeznk
2. Vgrehajtunk
3. rvnyestnk
Ha egy osztly konstruktora tele van sajt metdusokkal, minden egyes tesztedben szmtanod kell
rjuk.
Tipp: Csak egyszeren : a konstruktorokban csak a fggsgeket hatrozzuk meg.

Els fejezet: Tesztelj mindent

12

3. s
Elreltni, hogy milyen feladatokkal bzzuk meg az osztlyunkat nehz lehet elsre. Hallottuk eleget
az Egyetlen Feladat Trvnyt, de nehz ezt a gyakorlatban megvalstani.

4 md, hogy szrevegyk a tl sok mindennel foglalkoz


osztlyokat
1. Egyszeren csak sorold fel, mit kell egy osztlynak tennie. Ha tl sokszor mondod azt, hogy
s, valsznleg jra kell rni.
2. Tanuld meg azonnal analizlni a metdus sszes sort. J esetben a metdus csak prat
tartalmaz (j lenne, ha egyet). Ha tl sok sor van, akkor valsznleg nincs minden rendben.
3. Ha nem tudsz j nevet tallni az osztlyodnak, lehet, hogy a logika sntt.
4. Ha minden ms bukik, mutasd meg valaki msnak. Ha azonnal nem rtik meg mire j az
osztly (*Ez itt a jelszt hasheli *), vltoztasd meg.
Nhny plda kezdetnek:
A FileLogger osztly adatok naplzsval foglalkozik.
A TwitterStream osztly csiripeket tlt le a Twitter API-val , ha felhasznlnevet adunk meg
neki.
A Validator osztly adatokat ellenriz elre meghatrozott szablyok szerint .
A SQLBuilder SQL lekrdezst kszt valamilyen adathalmazbl.
A UserAuthenticator osztly ellenrzi a felhasznl belptetst.
Figyeld meg a fenti lersban egyetlen s sem tnik fel. gy sokkal knnyebb tesztelni, mert nem kell
tbb objektummal trdni.
Tipp: Egy osztly-egy feladat. Ez az Egyetlen Feladat Trvnye.

4. Tl sok tvonal? Polimorfizmust neki!


A polimorfizmus megrtshez szksg van egy aha pillanatra. Ha egyszer megrted, sosem feleded
el.
Definci: A polimorfizmus kifejezs egy komplex osztly felosztst jelenti sok hasonlra,
amelyek kzs interfszt hasznlnak, de sajt funkcival rendelkeznek.
https://tutsplus.com/2012/04/the-aha-moment/

Els fejezet: Tesztelj mindent

13

Ha r akarunk jnni, vajon egy osztlynak jl jnne a polimorfizmus, akkor keresni kell a switch
lltsokat (vagy a tl sok felttelt). Kpzelj el egy bankszmla osztlyt, amelynek ki kell szmolnia
az vi kamatot a szmlatpustl fggen. Itt egy egyszerstett plda:
1
2
3
4
5
6

function addYearlyInterest($balance)
{
switch ($this->accountType) {
case 'checking':
$rate = $this->getCheckingInterestRate();
break;

case 'savings':
$rate = $this->getSavingsInterestRate();
break;

8
9
10
11

// other types of accounts here

12

13
14

return $balance + ($balance * $rate);

15
16

Hasonl esetben rtelmesebb megolds lenne ha a hasonl logikt kisebb osztlyok hasznlnk fel.
Definilj egy interfszt, hogy biztosan legyen egy getRate metdusod. Az interfszeket sokszor
szerzdsnek rjk le. Minden implementci a szerzdsnek megfelelen mkdik.
1
2
3

interface BankInterestInterface {
public function getRate();
}

Create a checking implementation of the interface.


1
2
3
4
5
6

class CheckingInterest implements BankInterestInterface {


public function getRate()
{
return .01;
}
}

Create a savings implementation of the interface.

Els fejezet: Tesztelj mindent


1
2
3
4
5
6

14

class SavingsInterest implements BankInterestInterface {


public function getRate()
{
return .03;
}
}

Az eredeti metdus gy sokkal rthetbb. Az $interest vltoz tpusra elre utalunk . Ezzel
lehetetlenn vlik a getRate metdus hvsa, ha eredetileg nem definiltuk. Ezrt rtunk egy
interfszt. Minden implementcija az interfsznek tartalmaz egy getRate metdust.
1
2
3

function addYearlyInterest($balance, BankInterestInterface $interest)


{
$rate = $interest->getRate();

return $balance + ($balance * $rate);

5
6

7
8
9
10

$bank = new BankAccount;


$bank->addYearlyInterest(100, new CheckingInterest); // 101
$bank->addYearlyInterest(100, new SavingsInterest); // 103

Mg jobb az, hogy gy knnyebb tesztelni, hiszen a funkci csak egyetlen ton haladhat. Ne
idegeskedj a szintaxis miatt . Nemsokra azt is tvesszk.
1
2
3
4

public function testAddYearlyInterest()


{
$interest = Mockery::mock('BankInterestInterface');
$interest->shouldReceive('getRate')->once()->andReturn(.03);

$bank = new BankAccount;


$newBalance = $bank->addYearlyInterest(100, $interest);

6
7
8

$this->assertEquals(103, $newBalance);

9
10

Tipp: A polimorfizmussal nagyobb osztlyokat kisebbekre lehet felosztani, amelyeket


gyakran alosztlyoknak neveznek. Emlkeztetlek: minl kisebb az osztly , annnl knyebb
tesztelni.

Els fejezet: Tesztelj mindent

15

5. Tl sok fggsg
Az *Ellenrzsmnis konstruktor * tippben , beszltnk arrl, hogy a fggsgeket a konstruktoron
keresztl kell meghatrozni. Ha olyasmit tapasztalsz, hogy egy osztly tl sokat kr, valsznleg
nincs minden rendben vele.
Mindig jragondolom egy osztly felptst, ha tbb mint ngy [fggsget tartalmaz]. - Taylor Otwell
Alapvet trvnyszersg az objektum-orientlt programozsban, hogy sszefggs van az osztly,
vagy metdus paramterei szmnak, illetve flexibilitsa kztt ( tesztelhetsg! ). Minden esetben,
amikor megszabadulsz egy paramtertl, vagy fggsgtl, javtsz a kdon.
Ha az osztlyod tl sok fggsget tartalmaz, rd jra.

6. Tl sok hiba
Egyszer hallottam Ben Orensteintl azt, hogy a hibk imdjk a trsasgot. Ez eddig a legigazabb
llts, amit eddig hallottam. Ha tl sokkal tallkozol egyetlen osztlyon bell, akkor ez egy
seglykilts alosztlyok s jrars utn. Gondoljunk csak bele: a hiba ltrejttnek egyik alapvet
oka az, hogy els alkalommal sem rtetted a kd ltal nyjtott megoldst; tl sszetett volt ! Tudod
mit? sszetett kd sokszor egyenl a tesztelhetetlen kddal. Ez aztn egy csom hibhoz vezet, s,
mint tudjuk, a baj nem jr egyedl.
Definci: Coupling -csatols- sz azt jelli, hogy a rendszerben kt komponens mennyire
fgg egymstl. Ha az egyik hinya hatssal van a msikra, akkor tightly coupled coderl
-ersen csatolt- beszlnk.

Ahogyan Ben mondta, ha hiba volt a hetedik sorban, akkor j esly van r, hogy gond lesz a
tizenegyedikben is. Vsd ezt a fejedbe.
Tipp: Ha hasonl hibkkal tallkozols, gondolkodj el arrl, hogyan lehetne kisebb (tesztelhet) osztlyokba pakolni a kdot. A kd nem csak tesztelhetbb lesz, de knnyebben lehet
majd olvasni.

A baj nem jr egyedl. Kr mr az elst is keresglni.


https://twitter.com/taylorotwell/status/334789979920285697

Els fejezet: Tesztelj mindent

16

Teszt zsargon
Annyira nem vagyok elszlva magamtl, hogy ebbl a knyvbl fogsz mindent megtanulni a
tesztelsrl (Legalbb is remnykedem). Ha hasonltunk, akkor ks jjel is a webet fogod bngszni
infk utn.
E kzben mindenfle zavar kifejezssel tallkozhatsz. Ettl mr csak az a rosszabb, hogy a
terminolgia minden nyelvben ms! Anym! Ebben a knyben az egyszersg szellemben
mindent a lehet legegyszerbben prblok magyarzni. Nzd t a kvetkez defincikat, de
most nem muszj megjegyezni ket. Az igazsg az, hogy nem szeretem a sok zsargont. Ha a sz
elsre nem jelent semmit, akkor meg kell vltoztatni. A fejlesztknek is lehet valamit tanulni az
asztrofizikusoktl.
A legrthetbb tudomny a nyelv szempontjbl, szerintem, az asztrofizika. What do
you call spots on the sun? Hogyan hvod a foltokat a Napon? Napfoltoknak. Azon
rszeit az rnek, ahova belezuhansz, s sosem jssz ki? Fekete lyukaknak. Nagy vrs
csillagokat? Vrs risnak. Adok egy feladatot kollegimnak. mond egy szt, ha
pedig megrtettem, azt mondom, , ez azt jelenti, hogy da-da-da-de-da? - Neil
Degrasse Tyson

Egysgtesztels
Gondolj az egysgtesztelsre, mintha egy finom fsvel mennl t minden osztlyon, s metduson,
hogy megbizonyosodj, minden megfelelen mkdik. Az egysgtesztelst izolciban kell vgezni,
hogy a hibakeress a lehet legegyszerbb legyen. 80% tesztjeidnek ilyen lesz.
Ha ez segt, ha az egysgtesztelsre gondolsz, mondogasd egy objektum, s csak egy objektum. Ha a
teszt nem sikerl, azonnal tudni fogod hol a hiba.

Modell Tesztels
Bizonyos Ruby on Rails kzssgi tagok modell tesztelsre gondolnak (mg akkor is ha a tesztek
adatbzisforgalommal jrnak) egysgtesztelskor. Ez egy kicsit csals lehet. Az egysgteszt izolltan
mkdik a kls fggsgektl. Ha ezt az alapvet szablyt nem tartjuk be , akkor mr nem
egysgtesztet hajtunk vgre. Ez ekkor mr integrcis teszt (errl nemsokra tbbet).
Ebben a knyvben, ha a modelleket teszteljk, ehhez a trvnyszersghez tartjuk magunkat .
Kpzeld el, hogy egy metdus a modelledben email kldsre val. Ha a megfelel mintt kveted,
akkor van egy csak az emailek kldsvel foglalkoz osztlyod (Egyetlen Felelssg Trvnye).
Ebben az esetben viszont egy gonddal szembeslnk: hogyan tesztelhetjk ezt a metdust, ha egy
kls Mailer osztlyt hv? Ekkor utnzsokat hasznlunk, amelyekrl mg sokat hallasz ebben
a knyvben. Egy hamis Mailer osztlyt hozunk ltre, s azt vrjuk, hogy a megfelel metdust
hvjk. gy, mg ha a Mailer komponens ebben a pillanatban nem mkdik (sajt tesztjei lesznek),
megbizonyosodhatunk arrl, hogy a modell gy mkdik, ahogyan elkpzeltk.

Els fejezet: Tesztelj mindent

17

Integrci Tesztels
Ha az egysgteszt bizonytotta, hogy a komponens mkdik izolciban, az integrcis teszt ppen
az ellenkezje. Ezek a tesztek sok rszt prbljk ki az applikcinak, s alapveten nem hasznlnak
utnzatokat. Ilyenkor kszts egy erre a clra kijellt adatbzist.
Pldul egy aut. Mondjuk a motor s a tank kln-kln mkdik (tmentek az egysgteszten), de
tudnak-e egytt dolgozni? Az integrci tesztels erre val.

Funkcionlis (Kontroller) Tesztels


Hogy hvjuk a kontrollerek tesztelst? Bizonyos keretrendszerekben ezt funkcionlis teszteknek
nevezzk (vgl is azok), de mi -dobpergs - kontroller tesztelsnek hvjuk!
Tradicionlisan a funkci tesztels arra j, hogy te, s a trsaid megbizonyosodjatok arrl, hogy a
kd azt teszi, amit elvrnak tle. Az egysgtesztels mindig egy egysgn az osztlynak mkdik,
a funkcionlis tbb rszt hasznlhatja az applikcinak. Ezek a tesztek leggyakrabban kvlrl
jnnek, ezrt is hvjk Rendszer Teszteknek. Egy fontos trvny, hogy a funkcionlis tesztels nem
ignyel szervert.

Elfogadsi teszt
Mr megtanultuk, hogy a funkcionlis tesztek arra jk, hogy a fejleszti grda elvrsai szerint
prbljuk ki a programot. Ennek ellenre, elfordulhat, hogy a teszt sikeres, viszont a kliens nincs
megelgedve az eredmnnyel. Ilyenkor van szerepe az elfogadsi tesztnek. Mskppen, ez a kd
megfelel -e a kliens elvrsainak? A program tmehet mindenfle egysg-, funkcionlis, integrcis
teszten , de megbukik az elfogadsin, mert a kliens rjtt, hogy nem minden gy van, ahogyan
elvrta.
Tipp: A funkcionlis tesztek a fejlesztk elvrsait igazoljk, az elfogadsiak pedig a
klienst.

Gondolj a Tuts+ Premiumra, egy edukcis szolgltatsra, amelyen dolgozom. Nemrgiben ,


hozzadtunk egy funkcit, amely lehetv teszi knyvjelzk ltrehozst, amelyekkel elmenthetik a
tanfolyamokat, s knyveket, amelyeket ksbb szeretnnek elolvasni . Mieltt a fejlesztk egyetlen
sor kdot lernnak, meg kell rtenik, hogy mit is vrnak el tlk a tartalmakrt felels csapat tagjai
hiszen k krtk a funkcit. Ez egy elfogadsi tesztet ignyel.

http://tutsplus.com

Els fejezet: Tesztelj mindent


1
2
3

18

Meg szeretnm jellni azt amit tanulni akarok


Bejelentkezett felhasznl vagyok
Knyvjelzt akarok ltrehozni

Ha ez az elfogadsi teszt tmegy, akkor az egsz funkci teljessgben elfogadott, megfelel a kliens
(ebben az esetben a tartalmakrt felels csapat) elvrsainak.

A knyvjelz funkci a Tuts+ Premiumon elfogadsi teszteket ignyelt.

A knyv vgn megtanulod, hogyan kell elfogadsi teszteket rni a Codeception keretrendszerrel.
Ezzel emberi nyelven definilhatjuk, hogyan kell mkdnie az applikcinak.

A tesztels kltsges?
Elterjedt nzet az, hogy a tesztek ugyan jl jnnek, de amikor igazi munkrl van sz, a kliens
pnztrcja szabja meg a hatrt.E szerint nincs az a kliens, aki megduplzn a fizetett sszeget a
nagyobb biztonsgrt.
Van ennek alapja? Nem. Sok tanulmny szl arrl, hogy a teszt-vezrelt fejleszts megrvidti az
ellltsi ciklust .

Els fejezet: Tesztelj mindent

19

Nyugi
Be kell vallanom, hogy ezek a szavak, s technikk sokig idegenek voltak szmomra is. Nem
vrom el, hogy mindent rtsetek, s emlkezzetek rjuk. Nyugi; mg el sem jutottunk a Bevezets a
PHPUnitba fejezetig! Egyenlre meg kell jegyezni, hogy ameddig egy applikcit fejlesztesz sokfle
tesztelsi mdszert fogsz hasznlni.
A kellemetlen igazsg az, hogy a fejleszti kzssg csak nem tud megegyezni a terminolgin.
Ltni fogsz kifejezseket, mint rendszer teszt, krsi specifikcik, medium tesztek, s mg sok ms.
Legtbbszr, tfedsek vannak a fentebb emltett kifejezsek kztt. Ne zavarjon ez most tged; a
legfontosabb, hogy elkezdj tesztelni. Ki fogod alaktani a sajt stlusodat.
Ahogyan mondjk, mindegy hogyan tesztelsz ameddig tesztelsz.
Nem csak a terminolgival van gy . Mostansg a legtbb fejleszt elfogadja, hogy nagyon fontos
teszteket rni, viszont, ahogyan rjk ket, mr nagyon klnbzik. Bizonyos szemlyek, mint Bob
Martin (Uncle Bob), TDD filozfia szigor betartst ajnlja : egyetlen sor produkcis kdot se rj,
ameddig nem rtl tesztet r.
Lehetetlenn vlt egy szoftverfejleszt szmra, hogy profinak nevezze magt, ha nem
vgez teszt-vezrelt fejlesztst. - Bob Martin
Nmely, szintn prominens programozk, mint DHH (Ruby on Rails ltrehozja), nyugodtan
bevallja, hogy k a teszteket a produkcis kd utn rjk- gy 80 szzalkban.
Ne trd magad, hogy elzetesen tesztelj minden modellt, kontrollert, s nzetet (az n
egyenlegem 20% elzetes, 80% uttesztels). - David Heinemeier Hansson
A te munkd az, hogy a lehet legtbb helyrl szerezz informcit, majd alaktsd ki azt a stlust, amit
te (vagy a fejleszti csapat) kedvel. Ez a knyv nem Szentrs, sokkal inkbb sajtos adaptcija a
tesztelsnek, amelyet magadv tehetsz.

http://www.youtube.com/watch?feature=player_detailpage&v=KtHQGs3zFAM#t=77s
http://37signals.com/svn/posts/3159-testing-like-the-tsa

You might also like