420 likes | 684 Views
Testaus. J ohdanto: Mitä testaus on (ja mitä se ei ole) Testauksen ongelmia Testaustasot, V-malli Testitapausten valinta Testauksen kattavuus Työkalut Suunnittelu, seuranta ja dokumentointi Oliokeskeisyys ja testaus Kansanviisauksia T. Testaus. ohjelma. ohjelmakoodi. syöteavaruus.
E N D
Testaus • Johdanto: Mitä testaus on (ja mitä se ei ole) • Testauksen ongelmia • Testaustasot, V-malli • Testitapausten valinta • Testauksen kattavuus • Työkalut • Suunnittelu, seuranta ja dokumentointi • Oliokeskeisyys ja testaus • Kansanviisauksia T
Testaus ohjelma ohjelmakoodi syöteavaruus tulosavaruus X Y sisäinen tila • Syöteavaruuden koko ja mahdollisten tilojen määrä on niin valtava, ettei edes pienen ohjelman kattava testaus ei ole käytännössä mahdollista. • Reaaliaikajärjestelmän tapauksessa tilanne on kertaluokkaa ongelmallisempi. • Testaamalla voi siis osoittaa, että ohjelmassa on virheitä, ei sen virheettömyyttä. Johtopäätös?
Testaus • Testaus on systemaattista virheiden etsimistä -- ei sattumanvaraista ohjelman kokeilua. • Testauksen tarkoitus on osoittaa että ohjelmassa on virheitä. • Mitä enemmän virheitä löytyy, sitä onnistuneempi testi on. • Virhe on ristiriita spesifikaation ja toteutuksen välillä. • Virheiden jäljitys eli debuggaus ei ole testausta. • Tehtäviä... • Testaussuunnitelman laatiminen. • Ensimmäinen versio jo määrittelyvaiheessa. • Testauksen tavoitteet kussakin testissä. • Testikohtaisesti testitapausten suunnittelu. • Testausympäristöjen luonti. • Testauksen suoritus. • Tulosten tarkastelu.
Error, fault, failure • Virhe (error, kansanomaisesti bugi): ihmisen tekemä möhläys, esimerkiksi ohjelmointivirhe tai virhe dokumentissa. • Kun virheellinen ohjelmankohta suoritetaan, se saattaa aiheuttaa vian (fault). Järjestelmä on nyt tilassa, joka ei ole sen määrittelyn mukainen. • Vika puolestaan voi aiheuttaa häiriön (failure), joka on vian ilmeneminen järjestelmän ulkoisessa käyttäytymisessä.
Testauksen ongelmia • Asenne: testauksella yritetään osoittaa ohjelman toimivuus, ei toimimattomuus. • Testauksen aliarvostus: "ne jotka eivät muuta osaa, testaavat". • Milloin testaus voidaan lopettaa: kun rahat/aika loppuu? • Onko kaikki testattu? • Mihin tehdyt korjaukset vaikuttavat? • Testien toistaminen korjausten jälkeen (regressiotestauksen työmäärä). • Testin toistettavuus (ajastukset ja muut hallitsemattomat ilmiöt), esimerkkejä: • osoittimien käyttö (yllättävän usein) • reaaliaikajärjestelmä, • hajautettu järjestelmä ja • graafinen käyttöliittymä.
...testauksen ongelmia • Moduulitestauksessa testausympäristö. • Testaustyökalujen vaikutus järjestelmän toimintaan. • Järjestelmä on maantieteellisesti laaja (hajautettu). • Poikkeamien havaitseminen on vaikeaa (esimerkiksi niiden pienuuden takia) • Ei tiedetä, mikä oikean tuloksen pitäisi olla. • Tilanteet, jota ei voida testitilanteessa järjestää (ohjelmistoissa on lähes aina tällaisia osia). • Tulosten toteaminen oikeaksi, kun järjestelmän toimintaa ei voida seurata ulkopuolelta.
Moduulitestaus • Moduulitestaus (module testing, unit testing) varmistaa, että yksittäiset moduulit toimivat määrittelynsä mukaisesti. • Moduulin toteuttamien palveluiden kutsumiseen ja tulosten tarkasteluun tarvitaan testiajureita (test driver) • joudutaan rakentamaan kutsuttavia funktioita varten tynkämoduuleita (test stubs). • Modulin toimivuuden testausta varten tarvitaan usein testipetejä (test bed, test driver) • Ohjelmoija tekee yleensä itse
Integrointitestaus • Integrointitestaus testaa moduulien välisiä liittymiä. • Testaus etenee usein rinnan moduulitestauksen kanssa joko kokoavasti (bottom up) tai jäsentävästi (top down). • Reaaliaikajärjestelmän ohjelma koostuu tavallisesti useista tehtävistä (task, multitasking) => myös tynkäprosessien käyttö on usein hyvä idea.
Järjestelmätestaus • Järjestelmätestauksessa varmistetaan, että järjestelmä toimii määrittelynsä mukaisesti (ja käyttöohjeensa). • Testauksen voi suorittaa ulkopuolinen ryhmä. • Virheiden korjaus kallista. • Luotettavuus-, toipumis-, turvallisuus- ja kuormitustestit (vasteajat, volyymit). • Yhteensopivuus muiden järjestelmien kanssa.
Muita testauksen muotoja • kenttätestaus • hyväksymistestaus • alfatestaus • betatestaus • regressiotestaus • release testing • käytettävyystestaus • suorituskykytestaus • ...
Testitapausten valinta • Lasilaatikkotestaus (glass/white box,structural testing) • Harmaalaatikkotestaus (gray box) • Käytetään hyväksi tietoa ohjelman toteutuksesta • Mustalaatikkotestaus (black box, functional testing) • Ekvivalenssiositus: jaetaan syötteet (ja tulosteet) ekvivalenssiluokkiin, mikä tahansa arvo luokassa edustaa koko luokkaa. Valitaan joka luokasta yksi arvo. • Raja-arvoanalyysi: Valitaan ekvivalenssiluokista rajatapaukset. • Voidaan soveltaa sekä syöteavaruuteen että tulosavaruuteen. • Virheenarvaus (tarkastuslista tavallisimmista virheistä).
Testauksen riittävyys kattavuusmitoilla: lausekattavuus • Lausekattavuus: 100% => jokainen lause suoritetaan vähintään kerran. • Heikkoudet • Ei ota huomioon haarautumisia kontrollirakenteissa. Int palkka if ehto {..... Palkka=123....} return Palkka
Testauksen riittävyys kattavuusmitoilla: päätöskattavuus • Päätöskattavuus (decision coverage): jokainen ehtolauseke saa vähintään kerran molemmat arvonsa (T/F), ts. ehdollisen rakenteen molemmat haarat suoritetaan. • Heikkous: • ehtojen kaikkia osia, saatikka sitten kombinaatioita ei testata If (palkka>1000) or (ylitoita and paivitaYlityot()>1000) {...} else {...} Testiaineistot: palkka=1234 (ehtolauseke tosi) ja palkka=0, ylitoita=epätosi (ehtolauseke epätosi) (orf = &&, andf = ||)
Testauksen riittävyys kattavuusmitoilla: ehtokattavuus • Ehtokattavuus (condition coverage): jokainen ehtolausekkeen osa (or/and-yhdistämä) saa vähintään kerran molemmat arvonsa (T/F). • Ei impilikoi välttämättä päätöskattavuutta: • Ns. päätös/ehtokattavuus korjaa yo. ongelman. If (palkka>1000) and (ylitoita) {...} else {...} Testiaineistot: palkka=1234 ja ylitoita=epätosi (ehtolauseke epätosi) ja palkka=0, ylitoita=tosi (ehtolauseke epätosi) (huom: and on tässä “normaali” and-operaatio, ei c-tyylinen oikoevaluointi)
Testauksen riittävyys kattavuusmitoilla: moniehtokattavuus • Moniehtokattavuus (multiple condition coverage): jokainen päätös evaluoidaan vähintään kerran kaikilla mahdollisilla ehtojen totuusarvojen yhdistelmillä. • Päätös/moniehtokattavuus vaatii lisäksi päätöskattavuuden. If (palkka>1000) orf (ylitoita andf paivitaYlityot()>1000) {...} else {...}
Muita kattavuusmittoja • Polkukattavuus: kaikki suorituspolut (lukukumäärä, silmukoiden käsittely). Montako polkua? • Funktiokattavuus: onko rajapinnan kaikkia funktioita testattu. • Kutsukattavuus: onko kaikki funktiokutsut suoritettu. • Silmukkakattavuus: silmukat suoritettu 0, 1 ja monta kertaa. • Tilakattavuus: kaikki tilat&tilasiirtymät • Poikkeuskattavuus... i=0 while i<20 loop if ehto1 then if ehto2 then L1 else L2; else if ehto3 then L3 else L4; end while
Kattavuusmittojen rajoituksia • “Kattavasti testattu” EI ole kattavasti testattu. • Puuttuvaa koodia ei voi testata. • Käytännössä kaikkia suorituspolkuja (polkukattavuus?) ei saa testattua, testataanpa päätöskattavasti: • Kattavuus ei ota huomioon olion tilaa. If status=1 then ... else if status = 2 then ... else... laskePalkka(...) int palkka ... if ylityötunnit >40 {... palkka=....} if ylityötunnit <40 {... palkka=...} return palkka
Kattavuusmitat käytännössä • Kannattaa mitata: tarkoituksena on löytää puutteita testiaineistossa, ei niinkään todistaa testauksen perusteellisuutta. • Prosenttilukujen tulkinnassa kannattaa olla varovainen • suuri kattavuus ei välttämättä tarkoita hyvää testausta • mitat eivät välttämättä ole keskenään vertailukelpoisia • 100% kattavuus käytännössä usein mahdottomuus • Yleensä tavoitteena esimerkiksi 85% kattavuus (lause- tai päätöskattavuus)
Muita tapoja • Mutkikkuusmitat: Voidaan arvioida mm. koodin laatua (esimerkiksi alihankinnat), ohjelman "rispaantumista" ylläpidossa ja testauksen vaativuutta. • Halsteadin mitta: lähinnä historiallista merkitystä • McCaben syklomaattinen numero • G on ohjelman kontrolliverkko ja c päätösten määrä • Ohjelman syklomaattinen numero v(G) = c+1 • Virheiden kylväminen • Ohjelmassa X virhettä (X tuntematon). • Kylvetään N virhettä. • Testauksessa löytyy X' oikeaa virhettä ja N' kylvettyä virhettä. • Oletetaan, että X'/X = N'/N. • Siis ohjelmassa on yhteensä X = X'N/N' virhettä, joista vielä X-X' kpl on löytämättä.
Testaustyökalut Testikattavuusanalysaattorit • Purify, Bounds Checker: osoitinongelmat, muistivuodot • Profilointiohjelmat • Vertailuohjelmat • Testipetigeneraattorit, testiskriptit • Emulaattorit, simulaattorit • Nauhoitustyökalut, kuormageneraattorit • Testauksen automatisointi?
Testauksen suunnittelu • Projektisuunnitelma: mitä dokumentteja tuotetaan,kuka tuottaa ja milloin • Sopimus ja/tai sen liitteet: Hyväksymiskoesuunnitelma joka kuvaahyväksymiskriteerit, joita asiakas testaa hyväksymistestissä. • Testauksesta saattaa olla hyvä tuottaa erillinen yleissuunnitelma: kuka vastaa ja mistä (mm. testiympäristöjen pystyttäminen jne.). • Järjestelmätestaussuunnitelma: määrittelydokumentissa tai erillisenä dokumenttina. • Integrointitestaussuunnitelma: suunnitteludokumentissa tai erillisenä dokumenttina. • Moduulitestaus: • Kunkin moduulin määrittelyyn liittyy testiympäristön määrittely ja testitapausten määrittely. • Voi olla yleisohje, ei välttämättä erillistä suunnitelmaa
Seuranta • Testeistä syntyy testiraportteja. • Asiakasreklamaatiot dokumentoitava. • Laatujärjestelmän kehittämiseksi virheet on analysoitava ja tilastoitava • virheiden löytymis- , syntymis- ja korjausajankohdat, • testauksen kattavuusmitat, • virheiden luokittelu (mild, moderate, annoying, disturbing, serious, very seriuos, extreme, intolerable, catastrophic, infectious) • Yksi keino on pitää testipäiväkirjaa.
Oliokeskeisyyden vaikutus testaukseen • Ei eroja järjestelmätestaustasolla (?). • Alemmilla testaustasoilla lisäongelmia aiheuttavat periytyminen ja dynaaminen sitominen. • Kun jotain on peritty, onko se testattava uudelleen? • Vastaus näyttäisi (ikävä kyllä) olevan myönteinen. • Vain hyvin yksinkertaisten funktioiden tapauksessa voi olla varma, että kantaluokalle tehty testaus riittää. • Jos perityssä funktiossa käytetään dynaamista sitomista, ei voida olla varmoja funktion toimivuudesta uudessa ympäristössä. • Kattavuus? • Kaikki dynaamista sitomista sisältävät pitää testata “päätöskattavasti” (kutsukohtahan on tavallaan ehdollinen haarautuminen olion tyypin perusteella). • Oliomenetelmille tyypillinen iteratiivisuus monimutkaistaa testauksen hallintaa.
Kansanviisauksia • Testauksen suorittaa joku muu kuin tekijä. • Teoksessa [Kit 1995] on esitetty otsakkeen ´The Six Essentials of Software Testing´alla seuraavat perusperiaatteet. • The quality of the test process determines the success of the test effort. • Prevent defect migration by using early life-cycle testing techniques. • The time for software testing tools is now. • A real person must take responsibility for improving the testing process. • Testing is a professional discipline requiring trained, skilled people. • Cultivate a positive team attitude of creative destruction.
... kansanviisauksia • Älä poista testauspiirteitä ohjelmasta. • Suorita "apinatestejä”, ota pistoke irti seinästä. • Tee/testaa muutokset ja lisäykset riittävän pieninä annoksina. • Virheet kasaantuvat: jos jostain on löytynyt useita virheitä, lähistöllä on niitä vielä lisää. • Dynaamisen muistin määrän kehityksestä kannattaa pitää kirjaa (roskaantuminen, satunnaiset kuormitushuiput). • Tarkasta vielä kerran laskennan virhetilanteet: nollalla jako, yli/alivuodot sekä liukulukujen pyöristys. • Tee myös testipetit kunnolla, suurin osa ajasta kuluu muuten virheiden hakuun testipeteistä. • Jos poikkeustilanteita käsittelevää koodia on vähän, kaikkia poikkeustilanteita ei ole vielä otettu huomioon.
... kansanviisauksia • A good test can never save a bad program. • The cost of a tool is more than the cost of a tool. • Tuotekehitysprojektissa järjestelmätestauksen loppuvaihe kestää pitempään, kuin osaat kuvitella edes pahimmissa painajaisunissasi. • Kokeile, mutta älä luule, että se on testausta, suunnitelmallisuus on valttia. • Test now or pay later; the later you find it, the more you pay.
Reaaliaikajärjestelmien testauksen kansanviisaudet • Motto: sulautetun ohjelmiston testaus alkaa siitä, mihin tavallisen ohjelmiston testaus loppuu. • Testattavuus on otettava jo suunniteltaessa huomioon ja ohjelmoitava järjestelmään mukaan. Tuotantoversiossakin voi olla testauspiirteitä, jotka saa tarvittaessa kytkettyä toimintaan. • Ensin sarjallisesti mahdollisimman perusteellisesti. • Mahdollisimman pitkään kehityslaitteistossa ja sitten simulaattoreita ja emulaattoreita hyväksikäyttäen. • Kriittiset osat on katselmoitava huolellisesti ja mahdollisesti todistettava oikeiksi (tai edes perusteltava vakuuttavasti, miksi kuviteltu riski ei pääse toteutumaan). • Seuraa CPU:n käyttöastetta varsinkin muutosten jälkeen. Seurannan voi toteuttaa joko kellokeskeytyskäsittelijässä tai matalimman prioriteetin taustaprosessina. • Kerää tilastoa poikkeustapauksista: menetetyt kellokeskeytykset ja oheislaitteiden ohjauksessa sekä tiedon siirrossa tapahtuneet virheet. • Seinäkelloa voi tarpeen mukaan nopeuttaa tai hidastaa. Nopeuttamalla kelloa saadaan esimerkiksi koko vuosi nopeasti testattua.
Tehtävä • Ohjelma lukee kolme konaislukua, jotka kuvaavat kolmion sivujen pituuksia. Ohjelma tutkii luvut ja ilmoittaa, onko kolmio tasasivuinen, tasakylkinen vai ovatko kaikki sivut eri mittaisia. • Yksinkertaisuuden vuoksi epäkelpoja syötteitä ei tarvitse ottaa huomioon. • Millä syötteillä testaisit ohjelmaa?
Ohjelmakoodi with int_io, text_io; use int_io, text_io; procedure kolmio is sivu :array (1..3) of integer; procedure vaihda(i,j:integer) is h: integer; begin if sivu(i) > sivu(j) then h:=sivu(j); sivu(j):=sivu(i); sivu(i):= h; end if; end vaihda; begin loop for i in 1..3 loop put_line("anna sivu "&integer'image(i)); get(sivu(i)); end loop; vaihda(2,3);-- pienin menee ensimmaiseksi, mutta suurin ei viim. vaihda(1,2); -- vaihda(2,3); --- unohtunut pois 10,1,1 kelpaa kolmioksi if sivu(3) > (sivu(1) + sivu(2)) then put_line("ei kolmio"); elsif (sivu(1) + sivu(2) + sivu(3))/3 = sivu(3) then -- elsif sivu(1) = sivu(2) and sivu(2)= sivu(3) then put_line("tasasivuinen"); elsif (sivu(1) = sivu(2)) or (sivu(2) = sivu(3)) then put_line("tasakylkinen"); else put_line("sivut kaikki eri pituisia"); end if; end loop; end KOLMIO;
Testitapaukset testitapaus mitä testataan oletettu tulos testin tulos ? ? ? ?
Tutkimuksia • Myers: • "Highly experienced professional programmers score, on the average, only 7.8 out of a possible14". • Binderin testitapaukset Java-versiolle: 65 (periytyminen ja dynaaminen sitominen monimutkaistavat testaamista). • Viimeisiä tutkimuksia( Tichy, Hatton, Humphrey, Shepherd and Cartwright) • C++: 25% enemmän virheitä kuin C ja Pascal • Periytyminen aiheuttaa 6 kertaa enemmän virhietä • Java säikeet ja periytyminen: melkein mahdotonta kirjoittaa oikein. Ja vielä pahempaa testata