(Laajojen) Oliojärjestelmien testaus Erkki Pöyhönen, Arto Stenberg erkki.poyhonen@nokia.com, arto.stenberg@nokia.com Nokia Research Center, SW Technology Laboratory 1 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt Sisältö Oliot: ongelma ja valtava etu testaukselle Tieto on valtaa riskien hallinnassa Miten oliot testataan ideaalimaailmassa? Ensimmäiset testit ovat tärkeimmät Olio-ohjelmisto luokkaa ylemmällä tasolla Oliot vaikuttavat enemmän alhaalla TDD: test first -lähestymistapa XP:n paras lahja ohjelmistotuotannolle on "Test-Driven Development" 2 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt
Ohjelmointinäkymä "bowl of spaghetti" vs. oliot Prehistoric: Spaghetti Code Middle Ages: Structured Programming Modern Times: Object Orientation Always like this! This never happens! Legend Code Data 3 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt Oliot: ongelma ja valtava etu testaukselle Nyt tehdään isompaa ja monimutkaisempaa, mutta laatu ei välttämättä ole parantunut (Les Hatton) 4 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt
Oliot ovat ongelma testaukselle Olioiden testaaminen on erilaista verrattuna lausekielisen ohjelman testaamiseen, koska olioissa on enemmän voimaa: Oliomenetelmissä ja -kielissä saman asian voi tehdä hyvin monella eri tavalla If there are two or more ways to do something, and one of those ways can result in a catastrophic results, then someone will do it. Edward A. Murphy, Jr. Olioihin liittyviä riskejä: Dynaaminen sidonta ja perintä antavat suunnittelijalle ilmaisuvoimaa, mutta virheiden tekeminen on myös helpompaa, kun rakenteet monimutkaistuvat Kokonaisuudet ovat pienempiä Rajapintoja on huomattavasti enemmän Kutsurajapinnan virheitä tulee paljon enemmän Olion tila on piilotettu rajapinnan sisään tilan seuranta testauksessa tulee hankalaksi Paljon uutta opeteltavaa alkuvaiheen virheitä 5 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt Oliot ovat etu testaukselle Luokat metodit ovat useimmiten pieniä kontrollirakenteiden virheet ovat vähemmän todennäköisiä Suunnittelijan tekemä yksikkötestaus on huomattavasti helpompi toteuttaa kuin perinteisissä lausekielissä Selkeä ja usein hyvin valvottu rajapinta Metodeissa pienet koodimäärät Oliomenetelmät ohjaavat laatimaan itsenäisiä kokonaisuuksia Koodin ja datan läheisyys selkeyttää riippuvuuksia Selkeämpi erotus rakenteisen ja toiminnallisen testauksen välillä Yksittäiset oliot ja olioklusterit kuuluvat suunnittelijalle Komponentit, sovellukset ja osajärjestelmät kuuluvat testaajalle 6 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt
Miten oliot testataan ideaalimaailmassa? Mihin kannattaa satsata? Domain-analyysi, mallit ja use caset: Kattava ja yhtenäinen (staattinen vs. dynaaminen mallinnus) ymmärrys sovellusalueesta Tärkein validoitava alue satsaa eniten! Arkkitehtuuri: Arkkitehtuurin tuki järjestelmän kriittisille ei-toiminnallisille piirteille Yhtenäinen alusta sovelluksille yhtenäisyys sovellusten välillä Design-mallit: UML-mallien oikeellisuus ja eheys arkkitehtuuri ja domain-mallit Koodikatselmukset: Yleisten ohjelmointivirheiden haravointi; vähän kerrallaan Luokkatason testaus (suunnittelija): Luotettavuuden perusta, tärkein testausvaihe Luokkaklusteri-/osajärjestelmätestaus (useita luokkia): Toiminnalliset testit interaktioille (rajapinnoille) Järjestelmätestaus: Testaus käyttäjän näkökulmasta Laatuattribuutit: toiminnalliset ja ei-toiminnalliset (suorituskyky, skaalautuvuus, siirrettävyys, ylläpidettävyys, ) 7 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt Tunnista oliosi 8 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt Monessa tapauksessa olio edellyttää varsin formaalia käsittelyä Testauksen kohde tilasiirtymät, protokolla Kattavuus perustuu tiloihin Toiminnallinen määrittely voi olla tilapohjainen: Tietyssä tilassa voi vastaanottaa vain tietynlaisia sanomia ja siirtyä vain tiettyihin tiloihin Yleinen käyttökohde ylätason sovelluslogiikassa Paljon riippuvuuksia sanomien järjestyksen suhteen "järkevä viestintä" on vai murto-osa kaikesta rajapinnan sallimasta viestinnästä Suunnittelussa keskeistä tilamallinnus
Tunnista oliosi Toisia oliota ei sitten saa millään hengiltä Olio koettaa löytää merkitystä kaikesta rajapinnan sallimasta kommunikaatiosta Uudelleenkäytettävät komponentit, luokkakirjastot, Usein yksinkertaisempi sisäisen tilan määritelmä yksinkertaisempi semantiikka Hyvä virheenhallinta Paljon testattavaa virhekäsittelyssä Poikkeukset Hyvä suunnittelu näkyy luotettavuutena 9 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt "Luokkatestien generaattori" Luo olio Vähintään yksi testi joka konstruktorille Alusta olio perustilaan (tai johonkin muuhun soveliaaseen tilaan) Käy läpi kaikki tilasiirtymät Tee sama jokaisella olion attribuutille Kutsu testattavaa metodia Käytetään testaustekniikoita (kuten ekvivalenssiluokkia ja rajaarvoanalyysiä) Tarkistetaan kutsutun olion attribuuttien tila ja sivuvaikutukset jokaisesta kutsusta Tehdään sama jokaisille parametrille Tehdään sama kaikille (testattaville) metodeille Tuhoa olio Testaa destruktori ja tarkista, että kaikki olion varaamat resurssit on vapautettu Tarkista kattavuus ja lisää uusi testejä tarvittaessa 10 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt
Luokkatestien skaalaaminen erilaisille riskitasoille LUOKKAAN LIITTYVÄ RISKI Suuri Keskikokoinen Pieni 100% metodikattavuus - EP-tekniikka (VP + IP) - BVA-tekniikka (VB + IB) 'Kaikki' perintäsuhteet testataan Poikkeukset testataan Myöhäinen sidonta testataan - kaikki kombinaatiot Muistinhallinta testataan - konstruktorit - destruktorit Järjestelmälliset koodikatselmukset Koodin staattinen analyysi Oliomallit katselmoidaan 100% metodikattavuus - EP-tekniikka (VP + IP) - BVA-tekniikka (VB) 'Tärkeät' perintäsuhteet testataan Poikkeukset testataan Myöhäinen sidonta testataan - yksittäisiä testejä Muistinhallinta testataan - konstruktorit - destruktorit Koodikatselmukset valikoiden Koodin staattinen analyysi Oliomallit katselmoidaan 100% metodikattavuus - EP-tekniikka (VP) - BVA-tekniikka (VB) 'Keskeiset' perintäsuhteet testataan Poikkeuksia ei testata Myöhäinen sidonta testataan perinnän ohessa Muistinhallinta testataan - pääkonstruktori - destruktorit Koodikatselmukset valikoiden Koodin staattinen analyysi Oliomallit katselmoidaan epäformaalisti EP = Equivalence partition BVA = Boundary value analysis 11 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt Muita testauksen perusteellisuuden säätökeinoja Koodikattavuus Perinteiset kattavuusmitat eivät ole olioperustaisia ne eivät kerro koko totuutta oliotestauksen perusteellisuudesta: perintä ja myöhäinen sidonta (inheritance & polymorphism) Yleiset kattavuusmitat kertovat testauksen perusteellisuuden metoditason testaamisesta Koodikattavuuden lisäksi voi seurata myös Metodien kutsuminen Määriteltyjen poikkeusten tuottaminen Olioiden luonti eri tavoilla (dynaamisesti, viite, staattinen) Kompleksisuus ja koko (complexity & volume) Mitattavissa suoraan sekä koodista että oliomalleista Tuettuja mittoja löytyy sekä olioperustaisia ja olioista riippumattomia Perinteiset kompleksisuusmitat kertovat metodin kompleksisuuden Oliomitat ottavat kantaa kutsu- ja perintärakenteisiin sekä olion rajapinnan ominaisuuksiin Mittareista voidaan arvioida ohjelmointiriskiä 12 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt
Olio-ohjelmisto luokkaa ylemmällä tasolla: Luokka ja osajärjestelmä/järjestelmä Testaustoimet kehitysryhmässä jaetaan karkeasti kahteen luokkaan Luokka- ja luokkaryhmien rakenteinen testaus: toiminnallisuus ja logiikka Osajärjestelmätestaus käyttötapausten (use case) mukaan: interaktiot, toiminnallisuus ja rajapintojen käyttö Priorisointi Riskitaso asetetaan jokaiselle osajärjestelmälle Suunnittelijat ja projekti/tuotepäällikkö mukaan Luokkatestaus: riskitason mukaan Osajärjestelmätasolla: käyttötapauksen tiheyden ja riskin mukaan Osajärjestelmän testaus Fokus: komponentti-interaktio, toiminnallisuus ja rajapintojen käyttö Käyttötapauksen toteutus olioiden viestinvälityksenä Katetaan kaikki käyttötapaukset ja niiden yhdistelmät Käyttökelpoinen malli (pattern): "Extended use case" Testataan komponenttien yhteistyö Normaali- ja poikkeustilanteet 13 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt TDD: test first -esimerkki 14 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt
TDD: test first -esimerkki TDD = Test Driven Development, yksi extreme Programming käytännöistä. Kirjoita ensin lista kaikista mahdollisista testitapauksista, jotka tulevat mieleesi: Kaikki metodit yms. Koodaa testitapaus, käännä ja aja. Testi ei mene läpi, koska toiminnallisuutta ei ole toteutettu. Testi speksaa toiminnallisuutta ja rajapintaa. Testi menee läpi, kun olet koodannut tarpeellisen määrän toiminnallisuutta. Puhdista koodi ja aja testi uudestaan läpi. Syklin pitäisi olla nopea: alle 10 minuuttia. Pidempikestoinen sykli kertoo liian isoista palasista. 15 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt TDD: test first -esimerkki Plussat: Testit ovat speksejä ja ajettavissa erikseen. Testaus tulee tehdyksi, eikä siitä lipsuta aikataulupaineiden takia. Perustoiminnallisuus on testattu, seuraavat testausvaiheet nopeutuvat. Voidaan siirtää voimavaroja virheiden etsimisestä niiden ennaltaehkäisyyn (arkkitehtuuri + analyysi + suunnittelu) Riippuvuuksien määrä pysyy mahdollisimman pienenä: luokat pyritään testaamaan erikseen Testikattavuus on ainakin lähellä 100% lausekattavuutta. Antaa itseluottamusta, vähentää stressiä ja pelkoa. Idea ei ole XP-sidonnainen. Miinukset: Testien laatu on riippuvainen suunnittelijan henkilökohtaisesta osaamisesta ja motivaatiosta. Testit kattavat yleensä vain perustoiminnallisuuden. Monimutkainen ympäristö voi aiheuttaa ongelmia (tietokanta, CORBA, sovelluskehykset). Testauskoodin määrä ylittää tuotteeseen menevän koodin määrän. 16 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt
TDD: test first -esimerkki Testikoodi testit.cpp TEST(Lasku, kokonaissumma) CHECK (0=Luekokosumma()); Tuotekoodi Lasku.h #include Lasku.h int Luekokosumma() return -1; #include Lasku.h int Luekokosumma() return 0; TEST(Lasku, osta_yksi) CHECK (200=Luekokosumma()); #include Lasku.h int Luekokosumma() return kokonaisumma; 17 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt 18 NOKIA Laajojen oliojärjestelmien testaus / 2002-12-16 / Epö & ASt Lisää tietoa löytyy Kokonaiskuva ja hyviä testauspatterneja löytyy Robert Binderin kirjasta "Testing Object-Oriented Systems: Models, Patterns, and Tools" (Addison-Wesley 2000, ISBN 0-201-80938-9) Esimerkkejä: http://www.rbsc.com/pages/testdesignpatterns.html Ymmärrettävä, mutta ohueksi jäävä johdanto oliotestaukseen: David A. Sykes, John D. McGregor: "Practical Guide to Testing Object-Oriented Software" (Addison-Wesley 2001, ISBN 0-201-32564-0) "Test-Driven Development" on varsin selkeästi esillä mm. Dave Thomas, Andy Hunt: "Learning to Love Unit Testing" (Software Testing & Quality Engineering, 2002 Jan/Feb) http://www.stqemagazine.com/featured.asp?id=20 ja http://www.stqemagazine.com/webinfo_detail.asp?id=270 Peter Coad: "the coad letter", http://www.thecoadletter.com/ Bill Wake: "XPlorations", http://xp123.com/xplor/ Ja tietenkin http://www.xprogramming.org/ ja http://www.extremeprogramming.org/ Avaintyökalut löytyvät osoitteesta http://www.junit.org ja laajemmin http://www.xprogramming.com/software.htm