Mi az a tesztvezérelt fejlesztés?

Használd a tesztvezérelt fejlesztés módszertanát és a megadott teszthalmazt a feladatok megoldásához


A tesztvezérelt fejlesztés (amit néha teszttel kezdő fejlesztésnek vagy tesztvezérelt tervezésnek is neveznek) az a gyakorlat, hogy először az egységteszteket írod meg, mielőtt egyetlen sor implementációs kódot írnál.

Az Exercism-ön a tesztek jelentik a követelményeket!

Minden gyakorlófeladat, amelyen dolgozol (azok, amelyek nem tanítanak új fogalmat), tartalmaz egy útmutatót, amely általános megfogalmazásban leírja, mit kell tenned. Szándékosan nem térnek ki ezek az útmutatók a programozási nyelvre jellemző implementációs részletekre, mert az Exercism mind a 70+ nyelvi kurzusa ugyanezeket használja. Egyes nyelvi kurzusok kiegészítik ezeket a rád vonatkozó konkrétabb részletekkel, de nem mindegyik.

Amikor elkezdesz dolgozni egy gyakorlófeladaton, olvasd el figyelmesen az útmutatót. Áttekintést ad arról, hogyan láss neki a megoldás elkészítésének. A teljes és pontos követelmények megértéséhez viszont el kell olvasnod a teszteket:

  • Egy meghatározott fajtájú adatszerkezetnek kell lennie az eredménynek?
  • Valamilyen sorrendbe kell rendezni az eredményt?
  • Hogyan kell kezelned a kivételeket? És így tovább.

Akkor oldottad meg a feladatot, ha az összes megadott teszt lefut és sikeres. Más szóval a megoldásod nem csupán az útmutató egy „helyesnek tűnő” értelmezése, hanem egy olyan program, amely teljesíti a megadott teszteket. A tesztek testesítik meg a feladat teljes követelményeit.

Hogyan alkalmazza az Exercism a TDD-t?

Elvégeztük helyetted az egységteszt-készlet megírásának munkáját. A célod, hogy olyan megoldást írj, amely éppen annyi kódot tartalmaz, hogy az összes egységteszt sikeres legyen.

Tartsd észben: a TDD-megközelítés segít eljutni a megoldásig, de nem kell megállnod ott. Ha a követelményeken túl is szeretnéd bővíteni a megoldásodat, azt is nyugodtan megteheted. Ha úgy döntesz, hogy mentorral dolgozol együtt (és arra biztatunk, hogy tedd ezt meg, amint sikerülnek a tesztek), ő segíthet refaktorálni és finomítani a kezdeti implementációdat, sőt új egységteszteket is javasolhat.

Munka az online szerkesztőben

Amikor az Exercism weboldalának kódszerkesztőjében dolgozol, el tudod olvasni a teszteket, de szerkeszteni nem tudod őket. Minden teszt lefut minden alkalommal, amikor futtatod őket, függetlenül a tesztfájlban jelzett „skip” mechanizmusoktól.

Amikor több teszt is sikertelen, a weboldal kezdetben csak az első hiba eredményét jeleníti meg. A többi hibára is kattinthatsz, hogy kibontsd őket! Néha előfordul, hogy az első eredmény nem a legtanulságosabb.

Ne csüggedj el, ha sok teszt sikertelen. Koncentrálj arra, hogy egyenként sikeressé tedd őket.

Munka a saját gépeden

Sok kurzus „kihagyott” teszteket használ a tesztfájljaiban. Kezdetben csak az első teszt „aktív”, a többi „inaktív” (hogy ez pontosan hogyan valósul meg, kurzusként változik). Amikor a saját környezetedben futtatod a tesztkészletet, csak az első teszt fut le. Ezt azért csináljuk, hogy erre a munkafolyamatra ösztönözzünk:

  1. Mielőtt bármilyen új kódot hozzáadnál, futtasd a tesztkészletet: egy sikertelen tesztet kell látnod.
  2. Adj hozzá éppen annyi kódot, hogy a teszt sikeres legyen.
  3. Futtasd a tesztkészletet.
  4. Ha a teszt továbbra is sikertelen, ismételd meg a 2. lépést.
  5. Amint a teszt sikeres lesz, refaktoráld a kódodat tetszés szerint, ügyelve arra, hogy az összes aktív teszt továbbra is sikeres maradjon. A refaktorálás jelentheti például:
    • a duplikált kód eltávolítását,
    • a hosszú függvények felbontását kisebbekre,
    • megjegyzések hozzáadását, és így tovább.
  6. Aktiváld a következő tesztet, és ismételd meg az 1. lépéstől.

Ismételd ezeket a lépéseket, amíg az összes tesztet aktiválod. Amint minden teszt sikeres, gratulálunk, megoldottad a feladatot!

Az, hogy pontosan hogyan aktiválod a teszteket, kurzustól függ. Egyes kurzusoknál ez azt jelentheti, hogy kikommentelezsz vagy eltávolítasz egy annotációt. Más kurzusoknál egy attribútum átállítását true-ról false-ra. Szánd rá az időt, hogy elolvasd a kurzushoz tartozó dokumentációt; az elmagyarázza ezeket a részleteket.

Azoknál a kurzusoknál, amelyek nem hagyják ki a teszteket, ez a munkafolyamat egyszerűen annyit jelenthet, hogy kikommentelezed a teszteket, majd egyenként újra aktiválod őket.

Miért érdemes tesztvezérelt fejlesztést használni?

Bár elsőre úgy tűnhet, hogy ezzel „szekér elé fogod a lovat”, több jó ok is szól amellett, hogy a megvalósító kód megírása előtt írd meg az egységteszteket.

  1. Tervezés. Arra kényszerít, hogy először a programod interfészére gondolj (arra, hogyan teszi elérhetővé a működését a külvilág számára), ahelyett hogy rögtön belevágnál abba, hogyan valósítod meg a kódot. Egy jól megtervezett (és tesztelhető!) interfész gyakran fontosabb, mint egy hatékony implementáció.

  2. Fegyelem. A tesztírásra sokan teherként vagy utólagos toldalékként tekintenek; ha először írod meg a teszteket, az garantálja, hogy a végére elegendő egységteszt születik a kódod működésének nagy részének vagy egészének lefedésére (ahelyett, hogy esetleg soha nem kerülne rá sor).

  3. Kevesebb munka. Ha szigorú ciklusban dolgozol, azaz írsz egy tesztet, megírod a kódot, amely teljesíti azt a tesztet, majd jön a következő teszt, a kódod szervesen növekszik. Ez gyakran (bár nem mindig) kevesebb felesleges munkához vezet; végül minden szükséges kódot megírsz, és egy feleslegeset sem.

További olvasmányok