80 likes | 184 Views
Tilapohjainen mustalaatikkotestaus (1/8). Usein aliohjelman kutsun tulos ei riipu pelkästään eksplisiittisistä syötteistä vaan myös moduulin tai olion tilasta (state) . Tila määräytyy yleensä moduulin tms. aiemmasta historiasta. Testitapaukseksi tarvitaan peräkkäisten kutsujen sarja.
E N D
Tilapohjainen mustalaatikkotestaus (1/8) Usein aliohjelman kutsun tulos ei riipu pelkästään eksplisiittisistä syötteistä vaan myös moduulin tai olion tilasta (state). • Tila määräytyy yleensä moduulin tms. aiemmasta historiasta. • Testitapaukseksi tarvitaan peräkkäisten kutsujen sarja. Äärimmäisen yksinkertainen esimerkki: interface Simppeli { void aseta (int arvo); int lue (); } • Metodin lue pitää palauttaa se luku, joka on ollut viimeksi metodin aseta kutsun parametrinä. • Metodin lue pitää aiheuttaa poikkeus, jos metodia aseta ei ole vielä kutsuttu. • Miten testataan luokkaa L, joka toteuttaa tämän liittymän? • Voidaan olettaa, että käyttäytyminen on kaikille kokonaisluvuille samanlainen.
Tilapohjainen mustalaatikkotestaus (2/8) Ensimmäinen testitapaus: Simppeli olio = new L; int tulos = olio.lue (); Tämän pitää aiheuttaa poikkeus. Toinen testitapaus: final int nayte1 = ...; Simppeli olio = new L; olio.aseta (nayte1); int tulos = olio.lue (); Tämän jälkeen pitää tietysti olla tulos == nayte1 . Mahdollinen kolmas testitapaus toisen jatkona: tulos = olio.lue (); Pitää saada sama tulos. • Metodi lue ei saa muuttaa olion tilaa. • Esim. yhden elementin pino ei kelpaa.
Tilapohjainen mustalaatikkotestaus (3/8) Mahdollinen neljäs testitapaus, samoin toisen jatkona: final int nayte2 = ...; olio.aseta (nayte2); tulos = olio.lue (); • Tarkistetaan, että aseta vaikuttaa muulloinkin kuin ensimmäisellä kerralla. • Viidentenä tapauksena voitaisiin testata tätä ilman ensimmäistä lue-metodin kutsua. ''Tilalla'' on erilaisia merkityksiä. • Moduulin tms. kaikkien muuttujien arvojen yhdelmä. • Jokin abstraktio tästä – ekvivalenssiluokka. • Määritellään usein tilainvariantin avulla. • Muuttujista muodostettu looginen lauseke (predikaatti). • Kiinnostava on sellainen erottelu, että moduulin käyttäytyminen on eri tiloissa erilaista. • Esim. kiinteänkokoisen pinon tilat: tyhjä (alkioita == 0), vajaa (alkioita > 0 && alkioita < max), täysi(alkioita == max).
Tilapohjainen mustalaatikkotestaus (4/8) Tilapohjaista käyttäytymistä kuvataan yleensä tilakaavioilla. • Useita muunnelmia. • Voidaan esittää myös taulukkomuodossa. Moduulin tai olion tilakaaviossa on ainakin neljänlaisia elementtejä: • Tila • Tapahtuma (event): ulkoinen syöte tai heräte, esim. metodin kutsu • Siirtymä (transition): tapahtuman aiheuttama siirtyminen tilasta toiseen (tai samaan tilaan) • Toiminto (action): siirtymään liittyvä muu toiminto (esim. toiselle oliolle lähetetty tapahtuma). Kaavio kertoo, mitkä tapahtumat ovat sallittuja missäkin tilassa sekä minkä siirtymän ja toiminnon kukin niistä aiheuttaa. • Siirtymän täytyy määräytyä yksikäsitteisesti (deterministisesti). • Esim. UML:n tilakaavioissa kuhunkin siirtymään voidaan lisäksi liittää ehto. • Tällöin voi olla vaihtoehtoisia siirtymiä, jos ehdot ovat toisensa poissulkevia.
Tietyssä tilassa kelpaamattoman tapahtuman käsittelyn mahdollisuuksia: • Jätetään kokonaan huomiotta. • Aiheuttaa poikkeuksen tai muun erikoistoiminnon. • Pannaan jonoon ja käsitellään myöhemmin, jos olio tulee sellaiseen tilaan, jossa tapahtuma on sallittu. • UML jättää valinnan avoimeksi. Pinoesimerkki: Tilapohjainen mustalaatikkotestaus (5/8) pop / EmptyStackException Empty pop [n==1] / return top(x) push(x) push(x) [n<max-1] pop [n>1] / return top(x) Loaded push(x) [n==max-1] pop / return top(x) push(x) / FullStackException Full
Tilapohjainen mustalaatikkotestaus (6/8) • Kaavion ehdot perustuvat pelkästään pinon atribuutteihin. • Käyttäytymiseen vaikuttava olion tila on siis esitetty osittain kaavion tiloina, osittain siirtymien ehtoina. • Tiloja voisi olla max+1, jolloin ehtoja ei tarvittaisi. • Toinen ääripää: vain yksi kaavion tila ja enemmän ehtoja. • Ei kovin hyödyllinen. Testitapaukset? • Toinen ääripää: yritetään ottaa alkio tyhjästä pinosta. • Toinen ääripää: täytetään pino (max panoa) ja yritetään panna siihen vielä yksi alkio. • Pano- ja ottosarjoja, joiden ei pitäisi aiheuttaa poikkeusta. • Kaikissa tapauksissa ei ehkä tutkita, onko saatu alkio oikea. pop [n==0] / EmptyStackException pop [n>0] / return top(x) push(x) [n<max] push(x) [n>=max] / FullStackException
Tilapohjainen mustalaatikkotestaus (7/8) Tilakaavioihin liittyviä yksinkertaisia testauksen kattavuuskriteerejä: • Paloittainen kattavuus: kaikki tilat, kaikki tapahtumat, kaikki toiminnot. • Liian heikkoja (Binder). • Kaikki eksplisiittiset siirtymät (ts. kussakin tilassa sallitut tapahtumat). • Paloittainen kattavuus seuraa tästä automaattisesti. • Kaikki siirtymät (ts. kaikki tapahtumat kaikissa tiloissa). • Suositellaan vähimmäisvaatimukseksi (Binder). Polkukattavuuskriteerejä: • Kaikki N-siirtymäiset: jokainen mahdollinen N siirtymän sekvenssi käydään läpi ainakin kerran. • Kaikki silmukat: jokainen mahdollinen silmukka (jostakin tilasta takaisin samaan tilaan toistamatta mitään siirtymää) käydään läpi ainakin kerran. • Nämä ovat vahvempia vaatimuksia kuin kaikki siirtymät, mikäli kaavio on vahvasti yhtenäinen (jokaisesta tilasta on polku jokaiseen).
Tilapohjainen mustalaatikkotestaus (8/8) Raja-arvotestaus • Jos tilat on määritelty tilainvarianttien avulla, niihin voi soveltaa samoja periaatteita kuin syötteen ekvivalenssiluokkiin. • Puhtaassa mustalaatikkotestauksessa voi olla vaikeaa tai mahdotonta saada aikaan tilainvarianttien raja-arvoja. Sellaisia luokkia, joiden käyttäytyminen riippuu tilasta (historiasta), sanotaan modaalisiksi, muita luokkia ei-modaalisiksi. • Testattavuuden kannalta olisi hyvä, että ohjelmistossa olisi mahdollisimman vähän modaalisia luokkia. • Varmuuden vuoksi ei-modaalistakin luokkaa voidaan testata myös samanlaisilla metodinkutsusarjoilla kuin modaalista. • Voi olla perusteita epäillä tietynlaisia toimintoketjuja virhealttiiksi.