Minőségmenedzsment és Informatika
Test-Driven Development Varga Balázs
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
Vízesés Iteratív
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
Nem minden esetben írható teszt
pl.: GUI fejlesztés
Nagy projekt -> sok teszt -> „lassan tesztel”
megoldás: workshop, egyéni tanulás, párprogramozás
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
Agilis szoftverfejlesztők egyesülete
www.testdriven.com www.agilealliance.hu
Az Extreme Programming programozástechnikai elvei (Juhász Sándor)
www.inf.unideb.hu/~fattila/hallgatoknak/dokumentumok/J uhaszS.pdf
30