Minőségmenedzsment és Informatika Test-Driven Development Varga Balázs <varga27@gmail.com> G5S8 2008.10.27
Szoftverfejlesztés jellemzői Megrendelői igények Tervezés Implementálás Tesztelés Dokumentálás Karbantartás, támogatás 2
Szoftverfejlesztés 3
Szemléletváltás Sikeresebb fejlesztés szükséges Rossz megközelítés Újabb módszertan megalkotás Következtetés, értékelés Precízebb módszertan A szoftverfejlesztés nem teljesen mérnöki folyamat A módszertanok gúzsba kötik a projektet A követelmények folyamatosan módosulnak 4
Igény a változásra.....hiszen a szoftverfejlesztés NEM gyártás Változások gyors és rugalmas adaptálása Megszabadulni a klasszikus módszertanok hibáitól Cél Minél gyorsabban Minél költséghatékonyabban Az elvárt igényt minél jobban kielégítő végeredmény 5
Agilis fejlesztés Agilitás fürgeség --> gyorsan alkalmazkodó motiváltság káosz és rend közötti egyensúly Kiáltvány az agilis szoftverfejlesztésért személyes kommunkáció <--> módszertanok működő szoftver <--> átfogó dokumentáció együttműködés <--> szerződésben foglaltak változásokra reagálás <--> tervek elfogult követése 6
Összehasonlítás a klasszikus módszertanokkal Agilis Iteratív Vízesés Adaptív (alkalmazkodó) Prediktív (előre megjósolt) Átfedés a módszerek között Iteratív használata Agilis Vízesés -szerű 7
extreme Programming Agilis szoftverfejlesztés Szakít a szoftver gyártás szemlélettel Építő elemei önszabályzó csapatmunka egyedi szakértelem együttműködés hatékony kommunikáció 8
extreme Programming Főbb jellemzői Dolgozz együtt az ügyféllel Tervezz, de ne túl előre! Rövid megbeszélések Egyszerű megoldások Strukturált fejlesztés, hisz a kód mindenkié Pár-programozás ELŐBB ÍRJ TESZTET 9
Test-Driven Development (TDD) TDD = TFD + Refacotring TFD = Test-First Development Egyéb integráció egység tesztelő keretrendszer (pl.: JUnit, NUnit, xunit) ant build (pl.: Apach Ant) Rövid leírás először teszt, azután implementálás, majd kód csiszolgatás 10
Tévhitek, félreértelmezések Tesztelés csak a tesztelőké NEM IGAZ Nem (csak) kipróbálásra szolgál, hanem a fejlesztésre Tesztesetek használata NEM feltétlen ekvivalens TDD-vel 11
Szemlélet Tesztek, tesztesetek, mint specifikáció Üres lap víziói Amíg nincs implementálva semmi, nincs elfogultság Objektív kód rálátás 12
Test-First Development 1) Teszteset írása egy funkcióhoz 2) Szintaktikai hiba feloldása 3) A tesztnek hibásan KELL fordulnia 4) Teszteset kielégítése 5) Ugrás az elejére...vége ha már nincs több teszteset 13
TFD előnyei BUG-ok számának csökkentése Kis lépésben halad A tesztek jó dokumentációk A tesztek korlátozzák az osztályt egyszerűbb kód design; csak ami kell Javítják a kódminőségét az előre írt tesztek Fejlesztés sebessége felgyorsul (globálisan) Csökkentik a félelemérzetet Szórakoztató 14
TFD hátrányai Tesztelés alapismeret hiánya megoldás: workshop, egyéni tanulás, párprogramozás Nem minden esetben írható teszt pl.: GUI fejlesztés Nagy projekt -> sok teszt -> lassan tesztel megoldás: alrendszerek tesztelése Nincs és nem lehet vagy nehézkes tesztet hozzáadni régi kód és/vagy ismeretlen érinthetetlen fekete doboz 15
Nincsen kész szoftver... Új funkciók, követelmények Adaptív viselkedés (agilitás alapelve!) Program mérete növekszik --> kevésbé átlátható Az architektúra erről nem gondoskodik Új funkciók implementálása előtt régi kód átalakítása szükséges KOCKÁZATOS MŰVELETEK!!! De van rá megoldás... 16
Refactoring Jelentése ~Átszervezés, ~átalakítás Objektum-orientált fejlesztésre, speciálisan Feladata gyorsan biztonságosan fegyelmezett módon...átláthatóvá formálni 17
Refactoring definció Szoftver belső struktúráján végrehajtott olyan módosítás, amellyel könnyebben érthetővé illetve módosíthatóvá teszi anélkül, hogy a kívülről megfigyelhető viselkedésen módosítana. 18
Gyakorlati használata Meghatározni, hol kell változtatni! elég nehéz egzakt módon mi a jó és rossz design? Segítség MARTIN FOWLER - Refactoring: Improving the Design of Existing Code (Addison Wesley, 1999) Rossz kód design-ra jellemzők összefoglalása Megoldások, refactoring algoritmusok megmutatása 19
Code smells Flower kódszagok -nak nevezi a rossz design jeleit Duplicate code Large Class Lazzy Class Large method Feature Envy... 20
Refactoring algoritmusok Extract Class Extract Method Pull up field Encapsulate Field www.refactoring.com Nagyobb IDE eszközök integrálják, automatizálják ezeket! 21
Refactoring menete Egység tesztek nélkül LEHETETLEN Test-First elven történik az átalakítás Ha valamihez nincs elég teszteset --> ki kell bővíteni Ha csak EGY teszteset elbukik, vissza kell görgetni Verzió követő rendszerek használata ajánlott 22
Refactoring Előnyök átlátható, érthető kód kis lépesek --> könnyű észrevenni a hibákat Hátrány csak lokális optimum (ld.: hegymászó algoritmus) hozott anyagból dolgozik = strukturálatlan kódból nem képes tökéletesen áttekinthető kódot varázsolni Megjegyzés Architektúrával együtt és NEM helyett használandó! 23
Test-Driven Development TDD = TFD + Refactoring TFD feladata, hogy a zöld legyen a kód Refactoring feladata, hogy strukturált legyen Egymásra épülnek Ha csak TFD volna --> csak a tesztesetek kielégítése volna a cél Refactoring, mint egy fék Így a TDD összességében tesztelt egyszerű design 24
Test-Driven Development 25
Teszt A teszt is része a programnak, vagyis strukturáltnak egyszerűnek kell lennie Technikák ObjectMother tervezési minta pl.: spec gyártófüggvények Mock ha több objektumtól függ az egység valódi objektum utánzása --> erőforrás spórolás pl.: DB kapcsolat 26
Érdekesség Concordion (www.concordion.org) nyílt forrású teszt keretrendszer Java-hoz ajánlott TDD-hez Lényege a teszt esetek megírása, a saját csomaggal HTML-ben adja a végeredményt Mely oldal tartalmazza a szóbeli leírását is a funkciónak Egyfajta élő dokumentáció 27
Statisztika 28
Összefoglalás Egy jó prediktív projekt terv szerint fog haladni, egy jó agilis projekt pedig valami jobbat és mást alkot, mint amit az eredeti terv előre meglátott. /Martin Fowler/ Test-Driven Development átlátható kód egyszerű, de mégis funkcionális védve van a hibáktól 29
Köszönöm a figyelmet! :-) Források TestDriven.com www.testdriven.com Agilis szoftverfejlesztők egyesülete www.agilealliance.hu Az Extreme Programming programozástechnikai elvei (Juhász Sándor) www.inf.unideb.hu/~fattila/hallgatoknak/dokumentumok/j uhaszs.pdf 30