Luokkatestauksen piirteitä: metodit. 4. Luokkatestaus (B, 10) Luokkatestauksen piirteitä: yliluokat. Luokan valmistelu. Alfa-Omega syklin vaiheet

Samankaltaiset tiedostot
Luokkatestauksen piirteitä: metodit. 4. Luokkatestaus (B, 10) Luokkatestauksen piirteitä: yliluokat. Luokan valmistelu. Alfa-Omega syklin vaiheet

Harjoitustyön testaus. Juha Taina

Dynaaminen analyysi III

Dynaaminen analyysi III Luento 5 Antti-Pekka Tuovinen

Kombinaatiotestauksen tekniikat. 5. Kombinaatiotestaus (P&Y: 11) Luokittelutestauksen algoritmi. Luokittelutestaus. Pankkiautomaattiin kirjautuminen

Testaus käsite. Sekalaista testausasiaa. Testauksen käsitteestä. Kattavuusmitat. Jos ajatellaan, että testaus = V&V, voidaan erottaa:

5. Kombinaatiotestaus (P&Y: 11)

Ohjelmistotuotanto, s2001 2/27/2003

Ohjelmistotuotanto, s

Ohjelmiston testaus ja laatu. Testausmenetelmiä

12. Javan toistorakenteet 12.1

Testausdokumentti. Kivireki. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

12. Javan toistorakenteet 12.1

Verifioinnin ja validoinnin ero. 7. Verifiointi ja validointi. Verifiointi- ja validointitekniikat. Verifiointi- ja validointitekniikat II

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

11. Javan toistorakenteet 11.1

Testaussuunnitelma PULSU. Syksy 2008 Ohjelmistotuotantoprojekti. HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

58160 Ohjelmoinnin harjoitustyö

Johdatus graafiteoriaan

Lähdekoodin suorituksen malli. 2. Äärelliset mallit (P&Y: 5) Ohjausvuokaaviot. Atomiset ehdot OVK:ssa. Atomiset ehdot

2. Äärelliset mallit (P&Y: 5)

Ehto- ja toistolauseet

UML -mallinnus TILAKAAVIO

Ohjelmistotuotantoprojekti

11. Javan valintarakenteet 11.1

Algoritmit 1. Luento 13 Ma Timo Männikkö

Convergence of messaging

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Ohjelmistojen mallintaminen. Luento 11, 7.12.

13. Loogiset operaatiot 13.1

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

9. Periytyminen Javassa 9.1

ITKP102 Ohjelmointi 1 (6 op)

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Vapaus. Määritelmä. Vektorijono ( v 1, v 2,..., v k ) on vapaa eli lineaarisesti riippumaton, jos seuraava ehto pätee:

Ehto- ja toistolauseet

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ohjelmistojen testaus

Sisältö. 22. Taulukot. Yleistä. Yleistä

Testaussuunnitelma Labra

Algoritmit 1. Luento 3 Ti Timo Männikkö

1. Mitä tehdään ensiksi?

Algoritmit 1. Luento 1 Ti Timo Männikkö

13. Loogiset operaatiot 13.1

Hohde Consulting 2004

Olkoon seuraavaksi G 2 sellainen tasan n solmua sisältävä suunnattu verkko,

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen.

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

16. Ohjelmoinnin tekniikkaa 16.1

Vapaus. Määritelmä. jos c 1 v 1 + c 2 v c k v k = 0 joillakin c 1,..., c k R, niin c 1 = 0, c 2 = 0,..., c k = 0.

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

11. Javan valintarakenteet 11.1

Algoritmit 1. Luento 13 Ti Timo Männikkö

Testausraportti. Oppimistavoitteiden hallintajärjestelmä harri

Algoritmit 2. Luento 13 Ti Timo Männikkö

Javan perusteita. Janne Käki

Konsensusongelma hajautetuissa järjestelmissä. Niko Välimäki Hajautetut algoritmit -seminaari

Ohjelmoinnin peruskurssi Y1

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 7. joulukuuta 2009

Onnistunut Vaatimuspohjainen Testaus

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Sisällys. 15. Lohkot. Lohkot. Lohkot

Testaussuunnitelma. Koskelo. Helsinki Ohjelmistotuotantoprojekti. HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Johdatus graafiteoriaan

SEPA diary. Dokumentti: SEPA_diary_PK_HS.doc Päiväys: Projekti: AgileElephant Versio: V0.3

7 Vapaus. 7.1 Vapauden määritelmä

Luento 5. Timo Savola. 28. huhtikuuta 2006

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

(Laajojen) Oliojärjestelmien testaus

Algoritmit 2. Luento 11 Ti Timo Männikkö

Ohjelmistotuotanto, verifiointi ja validointi Syksy Verifioinnin ja validoinnin ero. 7. Verifiointi ja validointi

Johdatus verkkoteoriaan luento Netspace

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

16. Ohjelmoinnin tekniikkaa 16.1

Rinnakkaistietokoneet luento S

Olio-ohjelmointi Syntaksikokoelma

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

Algoritmit 2. Luento 7 Ti Timo Männikkö

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Algoritmit 1. Luento 10 Ke Timo Männikkö

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Rinnakkaistietokoneet luento S

1. Johdanto (P&Y:1-4) Ohjelmistojen testaus. Verifiointi ja validointi. Verifiointi ja validointi 2. Ohjelmistojen testaus - luentokalvot

Ohjausrakenteet. Valinta:

Muistutus aikatauluista

Algoritmit 1. Demot Timo Männikkö

Sisältö. 2. Taulukot. Yleistä. Yleistä

Kannan vektorit siis virittävät aliavaruuden, ja lisäksi kanta on vapaa. Lauseesta 7.6 saadaan seuraava hyvin käyttökelpoinen tulos:

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Java kahdessa tunnissa. Jyry Suvilehto

Sisällys. 16. Lohkot. Lohkot. Lohkot

811120P Diskreetit rakenteet

CoMa - Testausdokumentti

Königsbergin sillat. Königsberg 1700-luvulla. Leonhard Euler ( )

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Transkriptio:

4. Luokkatestaus (B, 10) Luokkatestaus on matalimman tason testausta. Siinä testataan yksittäisiä luokkia tai ryppäitä (clusters). Ryväs on joukko vahvasti toisiinsa sitoutuneita luokkia. Pieniä ryppäitä voidaan testauksessa pitää yksittäisinä luokkina. Isot ryppäät kootaan integrointitestauksessa. Jatkossa luokkatestaus tarkoittaa sekä luokkien että pienten ryppäiden testausta. 1 Luokkatestauksen piirteitä: metodit Luokka testataan lähettämällä luokan metodeille yksi kerrallaan viestejä (kutsumalla niitä). Luokka testataan metodiensa kautta. Pelkkä yksittäisten metodien kutsuminen ei riitä, jos (ja kun) luokan metodeilla on keskinäisiä riippuvuuksia. Jokaisella luokan ilmentymällä, oliolla, on tila, joka määrää olion käytöksen. Tila on kaikkien sille tehtyjen metodikutsujen summa. Vaihtelemalla metodien kutsujärjestystä voidaan päätyä eri tiloihin. 2 Luokkatestauksen piirteitä: yliluokat Luokan valmistelu Luokka on kokoelma sille määriteltyjä ja sen yliluokilta perimiä metodeita ja attribuutteja. Aliluokan metodit voivat muuttaa perittyjen yliluokan metodeiden toimintaa muuttamalla olioiden tiloja. Pelkkä aliluokan metodien käyttö testauksessa ei välttämättä riitä. Ongelma voidaan ratkaista litistämällä luokka: otetaan testattavaksi luokaksi yhdistelmä aliluokasta ja sen perimistä kaikista yliluokista. Tämä voi tulla hyvin kalliiksi, jos perintähierarkia on syvä. 3 Ennen luokan testaamista sen täytyy olla valmis testattavaksi: Luokka on kirjoitettu valmiiksi: metodit on integroitu luokkaan. Luokassa ei ole testausta estäviä isoja virheitä. Luokka voidaan valmistella kahdella tavalla: Yksinkertaiset luokat voidaan valmistella kokoamalla vain metodit yhteen. Tätä sanotaan Small Pop kokoamiseksi. Monimutkaiset ja ehkä isoja virheitä sisältävät luokat valmistellaan Alfa-Omega syklillä. 4 Alfa-Omega -sykli Jokaisella oliolle voidaan määritellä kaksi virtuaalitilaa: alfa ja omega. Alfa kuvaa olion tilaa juuri ennen sen luontia. Omega kuvaa olion tilaa heti sen tuhoamisen jälkeen. Alfa-Omega syklissä oliolle suoritetaan eräänlainen savutesti suorittamalla jokainen sen metodi ainakin kerran. Jos sykli menee läpi, olion katsotaan olevan testauskelpoisessa kunnossa. 5 Alfa-Omega syklin vaiheet Testiajuri lähettää viestejä listan mukaisille metodeille seuraavassa järjestyksessä: 1. Konstruktorit: olion luonti. 2. Kapseloinnin get-metodit: lukijametodit. 3. Totuusarvoja palauttavat metodit. 4. Kapseloinnin set-metodit: kirjoittajametodit. 5. Iteraattorit: läpikäyvät metodit. 6. Destruktorit: olion tuhoaminen. Tyypin metodien suoritusjärjestys on private -> protected -> public. 6 *+$#),

Vastuu- ja toteutuspohjainen testaus Luokkatestaus on ennen kaikkea vastuupohjaista (responsibility-based). Luokka tarjoaa joukon palveluita eli on vastuussa siitä, että palvelut toimivat oikein. Palveluiden toiminnan ja poikkeustilanteiden hallinnan varmistus on luokkatestauksen ydin. Vastuupohjaisen testauksen tukena käytetään toteutuspohjaista (implementationbased) testausta. Siinä testitapaukset johdetaan testattavan luokan toteutuksesta. 7 Mustalaatikko- ja lasilaatikkotestaus Vastuupohjainen ja toteutuspohjainen testaus ovat Binderin termejä. Yleisemmin puhutaan kuitenkin mustalaatikko- ja lasilaatikkotestauksesta. Mustalaatikkotestauksessa testataan testattavan komponentin toiminnallisuutta. Lasilaatikkotestauksessa testataan testattavan komponentin rakennetta. Menetelmät eivät ole sidottuja luokkatestaukseen, vaan niitä voidaan käyttää kaikessa testauksessa. Vastuu- ja toteutuspohjaisen testauksen testitapaukset Vastuu- ja toteutuspohjaiselle testaukselle ei tarvita erillisiä testitapauksia. Ensin suoritetaan vastuupohjaiset testit. Kun kaikki vastuupohjaiset testit on suoritettu, samoista testeistä lasketaan halutut toteutuspohjaisen testauksen kattavuudet (coverages). Jos halutut kattavuuskriteerit (coverage criteria) eivät toteudu, vastuupohjaisia testejä täydennetään sopivasti. Samalla usein löydetään puuttuneita vastuupohjaisia testejä. 9 Kattavuus ja kattavuuskriteeri Kattavuus on mittari, joka perustuu ohjelmasta tai sen osasta tehtyyn malliin. Kattavuus kertoo, miten suuren osan testitapaukset ovat testanneet mallista. Kattavuuskriteeri tarkoittaa ehtoja, mitkä testauksen on täytettävä, jotta se täyttää sitä vastaavalle kattavuudelle asetetut vaatimukset. Kattavuuskriteeri määrittelee siis, milloin kyseisen kattavuuden mukainen testaus on ollut riittävää. 10 Kattavuusesimerkki Kattavuus laajemmin Luokan metodikattavuus m voidaan määritellä esimerkiksi seuraavasti: m = M T M, missä M on luokan metodien määrä ja M T on testitapauksissa käytyjen luokan metodien määrä. Olkoon meillä luokka C, jossa on 25 metodia. Käytetään luokan C testauksen kattavuuskriteerinä 100% metodikattavuutta. Jos meillä on testipaketti T, joka käy läpi 15 metodia, niin testipaketti T:n suorituksesta saatu metodikattavuus on m = 1525 = 0,60, eli T antaa 60% metodikattavuuden. Testipaketti T ei täytä valittua kattavuuskriteeriä. 11 Kattavuus ei ole pelkästään toteutuspohjaisen testauksen tai edes luokkatestauksen mittari: Voimme määritellä esimerkiksi seuraavia kattavuuksia: Käyttötapauskattavuus: testeissä läpikäytyjen käyttötapausten suhde kaikkiin käyttötapauksiin. Toiminnallisten vaatimusten kattavuus: Testattujen toiminnallisten vaatimusten lukumäärän suhde kaikkiin toiminnallisiin vaatimuksiin. Tarkastuskattavuus: Tarkastuksissa läpikäytyjen dokumenttien sivumäärän suhde kaikkien tuotettujen dokumenttien sivumäärään. 12 *+$#) -

C @ P C 2 2 C C C Koodikattavuus Toteutuspohjaiset kattavuudet ovat koodikattavuuksia (code coverage). Koodikattavuudessa testitapausten suorittamia ohjelman osia verrataan ohjelman lähdekoodista tehtyyn malliin. Yleisimmät koodikattavuudet ovat metoditasolla. Niissä lähdekoodista tehty malli on metodista tehty vuokaavio (control flow graph tai flow graph). Vuokaavio Vuokaavio rakennetaan seuraavasti: Kaaviolla on alkusolmu, joka vastaa metodiin tuloa (metodin otsikkoa). Alkusolmuun ei tule särmiä. Kaaviolla on joukko loppusolmuja, jotka vastaavat metodista poistumisia (return-lauseita). Loppusolmusta ei lähde särmiä. Jokaisesta metodin lauseesta tulee solmu. Jokaisesta mahdollisesta siirtymästä lauseesta toiseen tulee särmä vastaavien lauseiden solmujen välille. Ohjelmointikielen korkean tason rakenteet vaativat vuokaavioon useita solmuja ja särmiä. 13 14 Vuokaavio II Halutessa ehtojen atomiset lausekkeet erotellaan omiksi solmuiksi. Särmät lausekesolmujen välillä kuvaavat ehtojen suoritusjärjestystä. Jos kaaviossa on joukko peräkkäisiä solmuja, joissa ei ole haaraumia, nämä voidaan koota yhteen segmentiksi (segment). Jos kaaviossa on monta loppusolmua, näistä kannattaa liittää särmät virtuaaliseen metodin loppusolmuun L. Joskus korkean tason rakenteiden lopumista kuvataan virtuaalisella rakenteen loppusolmulla E. Vuokaaviorakenteita 10(230 4 576 :9 10;2<0 = > 4? )6 :9 10 @:Ä 10B= > 4? )6 :9 2 15 16 Vuokaaviorakenteita II JK= 4 L M > 6 :9 5 A<D 6 1E 0 F 0 :GH9 I0 M HJ M:E:N E 0 M HJ M&FON F 0:P 1E @ 5 <Q? LN @10 R;S F E ]&^ W&Y(_U` RUT V&WUX Y;Z&[\ ]&^ W!Y;_K` F :G 17 Ei-atomisten ehtojen hajottaminen Ei-atomiset ehtorakenteet saadaan hajotettua atomisiksi seuraavilla säännöillä: 4 5<6 IE"aOabF<9 10;2<0 IE F 4 576 1Ë c c&f<9 10;2<0 1E F 2 1 *+$#).

l Vuokaavioesimerkki Vuokaavioesimerkki II Olkoon meillä seuraava metodi: Kommenteissa olevat numerot ovat vastaavan vuokaavion solmujen numerot public int displaylastmsg(int ntoprint) { 1 np = 0; 2 if ((msgcounter > 0) && (ntoprint > 0)) { 3 for (int j = lastmsg;((j!= 0) && (np < ntoprint));--j) { 4;5; System.out.println(messageBuffer[j]); 6 ++np; 7 } if (np < ntoprint) { 9 for (int j = SIZE; (( j!= 0) && (np < ntoprint)); --j) { 10; 11; 14 System.out.println(messageBuffer[j]); 12 ++np; 13 } } } return np; 15 19 Metodia vastaava vuokaavio on: S T d e f g h mon pkqsr!t:n uvq:w;x y!tz;zq&r!t:n uvq:w;xk{ S f i Skj S&S SBT S d S e 20 Vuokaavioesimerkki III Entry-exit -polut Kaaviossa peräkkäisiä solmuja ilman haaraumia voidaan yhdistää segmenteiksi: (1,2), (6,7,), (12,13,14). Atomisia lausekkeita ei ole eroteltu omiksi solmuiksi. Jos erottelu tehdään, solmut 3, 5 ja 11 jakautuvat kahdeksi solmuksi. Esimerkissä ei tarvita rakenteiden virtuaalisia loppusolmuja. Ne eivät selkeyttäisi kaaviota. Koska esimerkissä on vain yksi loppu, siinä ei tarvita virtuaalista metodin loppusolmua. 21 Vuokaavion polku (path) on reitti jostakin solmusta i johonkin solmuun j. Vuokaavion entry-exit polku (entry-exit path) on polku alkusolmusta loppusolmuun. Jokainen entry-exit polku kuvaa yhden tavan käydä metodi läpi. Kun jokin metodin testitapaus suoritetaan, se kulkee metodin läpi. Näin jokainen testitapaus käy läpi jonkin testatun metodin entry-exit poluista. 22 Polkukattavuus Entry-exit polut ovat pohjana useimmille metoditason kattavuuskriteereille. Kriteeri määritellään osajoukkona kaikista mahdollisista entry-exit poluista. Laajin kattavuus on polkukattavuus (path coverage). Siinä kattavuuskriteerinä ovat kaikki mahdolliset entry-exit polut. Kaikkien polkujen lukumäärä voi olla ääretön tai ainakin hyvin iso luku. Tämän johdosta polkukattavuutta ei käytetä testauksessa. 23 Lausekattavuus Lausekattavuus (statement coverage) on yksinkertaisin vuokaavioihin perustuva kattavuus. Se lasketaan kaavalla c = N T N, missä c = lausekattavuus. N T = testauksessa käytyjen vuokaavion solmujen määrä. N = vuokaavion kaikkien solmujen määrä. Lausekattavuuden kattavuuskriteeri määrittelee, kuinka suuressa osassa metodin koodia tulee vähintään käydä testauksessa. 24 *+$#)

Lausekattavuus II Lausekattavuuden heikkouksia Täydelle 100% lausekattavuudelle riittää parhaimmillaan yksi entry-exit polku, jos se käy läpi kaikki vuokaavion solmut. Edellisessä vuokaavioesimerkissä tällainen polku olisi 1,2,3,4,5,6,7,,5,9,10,11,12,13,14,11,15. Aina ei selvitä yhdellä polulla, mutta yleensä lausekattavuus ei vaadi kovin montaa polkua. Lausekattavuus on selkeä ja helposti ymmärrettävä kattavuus, mutta sen kattavuuskriteeri on yleensä liian löysä. 25 Sellaisissa if-lauseissa, missä ei ole else-haaraa, riittää täydessä lausekattavuudessa testata ehto yhdellä true-arvolla. Sellaisissa switch-lauseissa, missä ei ole defaulthaaraa, ei tarvitse testata tilannetta, missä mikään case-haaroista ei toteudu. Riittää, että while- ja for-silmukat käydään läpi täsmälleen kerran. Täysi lausekattavuus ei vaadi sellaista testiä, missä silmukkaan ei mennä lainkaan. Moniehtolauseissa täysi lausekattavuus voidaan saavuttaa testaamalla vain yksi ehtokombinaatio. 26 Haaraumakattavuus Haaraumakattavuus II Lausekattavuutta kehittyneempi kattavuus on haaraumakattavuus (branch coverage). Se lasketaan seuraavasti: c = E T E, missä c = haaraumakattavuus. E T = testauksessa käytyjen vuokaavion särmien määrä. E = vuokaavion kaikkien särmien määrä. Haaraumakattavuuden kattavuuskriteeri määrittelee, kuinka suuressa osassa metodin vuokaavion särmiä täytyy käydä testauksessa. 27 Täydellinen haaraumakattavuus vaatii, että jokainen vuokaavion haarautumaa täytyy seurata ainakin kerran. Edellisessä vuokaavioesimerkissä tähän päästään kolmella entry-exit polulla: 1,2,3,15. 1,2,3,4,5,6,7,,5,9,15. 1,2,3,4,5,6,7,,9,10,11,12,13,14,11,15. Haaraumakattavuus on hyvä ja aika yksinkertainen kattavuus, jonka kattavuuskriteeri on usein riittävän tiukka. 2 Haaraumakattavuuden heikous Haaraumakattavuuskriteerille riittää, että joillain testitapauksilla saadaan käytyä läpi kaikki haaraumat. Jos haaraumaan, kuten if-lauseeseen, liittyy monta ehtoa, niin haaraumakattavuuskriteeri vaatii vain kaksi ehtojen kombinaatiota: yhden tosi-haaralle ja yhden epätosi-haaralle. Esim. if (a!= 0 b!= 0) vaatii kaksi testitapausta: a=0 ja a!= 0. Haaraumakattavuuskriteeri ei vaadi, että b:n arvot testataan erikseen. Moniehtokattavuus Moniehtokattavuus ottaa huomioon, että ehto voi toteutua monella eri tosiepätosikombinaatiolla. Se määritellään seuraavasti: c = AE T AE, missä c = moniehtokattavuus. AE T = testauksessa käytyjen atomisten ehtojen (atomic predicates) tosi- ja epätosivaihtoehtojen summa. AE = metodin kaikkien atomisten ehtojen tosi- ja epätosivaihtoehtojen summa (eli 2*atomisten ehtojen summa). 29 30 *+$#)

Moniehtokattavuus II Moniehtokattavuuden kriteeri määrittelee, miten monta atomista tosi- ja epätosikombinaatiota täytyy saavuttaa testauksella. Esim. edellä meillä oli if (a!= 0 b!= 0). Lauseelle saadaan 100% moniehtokattavuus neljällä tapauksella: a = 0, b = 0. a!= 0, b = 0. a = 0, b!= 0. a!=0, b!= 0. Moniehtokattavuus III Täydellinen moniehtokattavuus takaa, että vuokaavion kaikki solmut, särmät ja ehdot on käyty läpi testauksessa. Moniehtokattavuus on tehokas työkalu, mutta se vaatii paljon. Jos meillä on n atomista tosiepätosiehtoa, niin tarvitaan 2 n testiä saavuttamaan 100% moniehtokattavuus. Aina ei päästä 100% moniehtokattavuuteen. Esim. if (a<0 && a > 10) vaatii tapauksen, missä a<0 ja a>10, mikä on mahdottomuus. 31 32 Peruspolkukattavuus Peruspolkukattavuus (basis-path coverage) perustuu entry-exit polkuihin: c = IP T IP, missä c = peruspolkukattavuus. IP T = testauksessa läpikäytyjen riippumattomien polkujen (independent paths) määrä IP = metodin kaikkien riippumattomien polkujen määrä. Riippumaton polku on sellainen entry-exit polku, jota ei saada lineaarisena kombinaationa muista riippumattomista poluista. 33 Riippumattomat polut Riippumattomat polut saadaan vuokaaviosta seuraavalla algoritmilla. 1. Merkitään kaikki solmut ja särmät käymättömiksi. 2. Etsitään lyhin entry-exit polku, jossa on ainakin yksi merkitsemätön solmu tai särmä. Lisätään polku riippumattomien polkujen joukkoon ja merkitään sen solmut ja särmät käydyiksi. 3. Jatketaan etsintää, kunnes vuokaavion kaikki solmut ja särmät on merkitty käydyiksi. Riippumattomien polkujen määrä: C = e n + 2, missä C = syklomaattinen monimuotoisuus (cyclomatic complexity) e = vuokaavion särmien määrä n = vuokaavion solmujen määrä Kaava vaatii, että vuokaaviossa on vain yksi loppusolmu. 34 Vuokaavioesimerkin riippumattomat polut Aiemmasta vuokaavioesimerkistä saadaan algoritmilla seuraavat riippumattomat polut: 1,2,3,15 1,2,3,4,5,9,15 1,2,3,4,5,9,10,11,15 1,2,3,4,5,6,7,,5,9,15 1,2,3,4,5,9,10,11,12,13,14,11,15 Kaikille poluille ei välttämättä saada tehtyä testiaineistoa. Tällöin polku täytyy testata osana jotain toista polkua. 35 Peruspolkutestaus ja vuokaaviot Kattavaan peruspolkutestaukseen vaaditaan, että vuokaavion ehdot hajotetaan atomisiksi ehdoiksi. Hajottamalla riippumattomien polkujen määrä vuokaaviossa lisääntyy. Samalla täydelliseen riippumattomien polkujen kattavuuteen liittyy vaatimus, että jokainen mahdollinen atomisten ehtojen kombinaatio tullaan testaamaan ainakin kerran. 36 *+$#) }

Peruspolkutestauksen idea Peruspolkutestauksen idea on vähentää testattavien polkujen määrää litistämällä silmukat nollaksi ja yhdeksi kierrokseksi. Idea toimii, jos peruspoluista johdetaan testitapaukset. Sen sijaan ongelmia syntyy, jos suoritetuista testitapauksista päätellään käydyt riippumattomat polut. Jokainen testi suorittaa jonkin entry-exit polun, mutta se ei todennäköisesti ole mikään todetuista riippumattomista poluista. 37 Peruspolkutestaus ja testitapaukset Usein käytetty ratkaisu suoritettujen polkujen ja riippumattomien polkujen väliseen yhteyteen on sopia, että testitapauksen suorituksen sisältämä pisin riippumaton polku on katettu testitapauksella. Joka tapauksessa yksi testitapaus ei voi kattaa enempää kuin yhden riippumattoman polun. Näin ollen täydellisen peruspolkutestauksen testipaketissa on oltava vähintään yhtä monta testitapausta kuin vuokaaviossa on riippumattomia polkuja. 3 Silmukkakattavuus Yksinkertaiset silmukat Jos silmukalla on kiinteä määrä iteraatioita, sille riittää yksi silmukan läpi kulkeva testi. Jos silmukalla ei ole kiinteää määrää iteraatioita, sille tarvitaan ainakin kaksi testiä: 0 iteraatiokerrosta, silmukassa ei käydä lainkaan 1 iteraatiokierros, silmukka litistetään Lisäksi suositellaan seuraavia testejä: minimi iteraatiokierrosta, minimi voi olla 0 minimi+1 iteraatiokierrosta maksimi iteraatiokierrosta, jos maksimi tiedetään Silmukkakattavuus (covering iteration) perustuu silmukan suorittaviin entry-exit -polkuihin. Polut riippuvat silmukan tyypistä. Silmukoita on neljää tyyppiä: Yksinkertaiset silmukat: silmukalla on yksi sisääntulo- ja yksi poistumispiste. Sisäkkäiset silmukat: monta yksinkertaista silmukkaa sisäkkäin. Peräkkäiset silmukat: monta silmukkaa samalla entry-exit -polulla. Spagettisilmukat: silmukalla on useita sisääntulojatai poistumispisteitä. 39 40 Yksinkertaiset silmukat II Sisäkkäiset silmukat Täydelliseen yksinkertaisten silmukoiden testaukseen tarvitaan lisäksi seuraavat testit: minimi-1 kierrosta, jos mahdollista maksimi-1 kierrosta, jos maksimi tunnetaan maksimi+1 kierrosta tyypillinen kierrosmäärä iteroitavasta koodista johdettava määrä iteraatioita iteroitavassa koodissa voi olla iteraation raja-arvoja (boundaries) tai sisäisiä erikoistapauksia (interior points), joissa silmukan toiminta vaihtuu. Tällöin silmukka pitää testata myös poikkeusarvojen ympärillä olevien kierrosten lukumäärä. 41 Täydellinen sisäkkäisten silmukoiden testaus vaatisi vähintään 2 n testiä, missä n on sisäkkäisten silmukoiden määrä. Sisäkkäiset silmukat testataankin näin: 1. Testataan sisäkkäisin silmukka ensin yksinkertaisena silmukkana. Asetetaan muille silmukoille minimiarvot. 2. Kiinnitetään testatulle silmukalle sopiva arvo. 3. Testataan seuraavaksi sisäkkäisin silmukka. 4. Toistetaan vaiheita 2-3, kunnes uloin silmukka on testattu. 42 *+$#) ~

Peräkkäiset silmukat Jos peräkkäiset silmukat ovat toisistaan riippumattomia, ne testataan erikseen yksinkertaisina silmukoina. Jos peräkkäisillä silmukoilla on jokin riippuvuussuhde, ne testataan yhdessä samalla tavalla kuin sisäkkäiset silmukat. Riippuvuussuuhde tarkoittaa, että jälkimmäisen silmukan iteraatiokierrosten määrä riippuu edellisen kierroksen iteraatioista. Peräkkäisistä silmukoista testaatan ylin ensin. Muut silmukat Spagettisilmukoita ei ole mahdollista testata järkevästi. Ne voidaan aina suunnitella ja toteuttaa muilla silmukkatyypeillä, testauksen sijaan ne pitää suunnitella ja koodata uudestaan. Kiinteät silmukat ovat erikoistapauksia yksinkertaisista silmukoista. Niissä iteraatioiden määrä on vakio (minimi ja maksimi ovat sama luku). Nämä testataan yhdellä silmukan läpi kulkevalla testillä. 43 44 Tietovuokattavuus Tietovuokattavuus (data flow coverage) perustuu huomioon, että entry-exit -polussa on jonoja muuttujiin kohdistuvia toimintoja. Jos jossain tällaisessa jonossa on virhe, mutta jonon sisältävää polkua ei suoriteta minkään testitapauksen osana, niin testauksessa ei luultavasti löydetä virhettä. Tietovuotestauksessa (data flow testing) pyritään tunnistamaan ja testaamaan tällaisia muuttujiin kohdistuvia toimintoja. 45 Muuttujan toiminnot Jokaiselle muuttujalle voidaan määritellä kolmenlaisia toimintoja: Muuttuja voidaan määritellä (define). Tällöin muuttuja luodaan tai muuttujan arvo vaihtuu. Näitä sanotaan D-toiminnoiksi. Muuttujaa voidaan käyttää (use). Tällöin muuttujan arvo luetaan. Näitä sanotaan U- toiminnoiksi. Muuttuja voidaan tuhota (kill). Tällöin muuttujalle varattu tila vapautetaan muistista. Muuttuja ei ole enää käytettävissä. Näitä sanotaan K-toiminnoiksi. 46 Muuttujan toimintoparit All-uses -tietovuokattavuus Ottamalla jonkun muuttujan suhteen toimintopareja, saadaan muuttujaan kohdistuvia kaksitoimintoisia jonoja. Toimintojen välissä ei ole muita samaan muuttujaan kohdistuvia toimintoja. -D: muuttuja luodaan (- tarkoittaa, että toimintoa ei ole) DU: muuttuja luodaan ja sitä käytetään K-: muuttuja tuhotaan KD: muuttuja tuhotaan ja luodaan heti uudestaan UD: muuttujaa käytetään ja sitten tuhotaan jne. 47 Kun edelliset toimintaparit yleistetään kuvaamaan parin sisältävää entry-exit - polkua, saadaan tietovuokattavuuskriteerejä: all-uses -kattavuus: Jokaista DU-paria kohti testaan ainakin yksi parin sisältävä entry-exit - polku. Jos tietystä määritelmästä D menee monta eri polkua tiettyyn käyttöön U, näistä riittää valita yksi. Tämä on osoittautunut riittävän vahvaksi kattavuuskriteeriksi. all-du-paths -kattavuus: Jokaista DU-paria kohti testataan kaikki parin sisältävät entry-exit -polut. 4 *+$#)