Ohjelmistojen testaus Mika Katara, Matti Vuori ja Antti Jääskeläinen Tampereen teknillinen yliopisto, Tietotekniikan laitos 17.8.2015 Ohjelmistotekniikka Ohjelmistojen testaus, 2015 1(504) Sisällysluettelo 1/10 Alkusanat 12 1. Kurssin tavoitteet 13 1.1 Kurssin lähestymistapa testaukseen 16 1.2 Mitä tällä kurssilla ei kateta? 17 1.3 Testaus-aiheisia verkkosivuja 18 2. Johdanto 19 2.1 Mitä testaus on? Erilaisia näkökulmia 20 2.2 Aina jokin vertailukohta: Vaatimukset 24 2.3 Virheiden lähteitä 31 2.4 Missä aktiviteetissa virheet syntyvät? 34 2.5 Testityypin käsite 35 2.6 Liiketoiminnan tukeminen 36 2.7 Perinteinen testausprosessi 40 2.8 Kaikkea ei voida testata 41 Ohjelmistotekniikka Sisällysluettelo 2/10 2.9 Testauksen koulukuntia 44 2.10 Testauksen kansanperinnettä 50 2.11 Testaus on vaativaa työtä 53 2.12 Testaus on tiimityötä 54 2.13 Mitä testaukselta voi vaatia? 55 2.14 Keskeisiä termejä 56 3. Testitapauksiin pohjautuva testaus 62 3.1 Testitapaus pähkinänkuoressa 63 3.2 Testitapauksen rakenne ja sisältö 71 3.3 Muita huomioita testitapauksista 74 4. Testaus osana ohjelmistoprosessia 75 4.1 Testaustasot – testauksen V-malli 79 4.2 Yksikkötestaus 84 4.3 Test-Driven Development Ohjelmistotekniikka 104 Sisällysluettelo 3/10 4.4 Testitapausten suunnittelutekniikoita 108 4.5 Ekvivalenssiositus-menetelmä 109 4.6 Raja-arvoanalyysi 114 4.7 Kombinaatioiden testauksesta 119 4.8 Fuzz-testaus 126 4.9 Matalan tason integrointitestaus 129 4.10 Jatkuva toimitus (Continuous Delivery) 144 4.11 Järjestelmätestaus 147 4.12 Järjestelmäintegrointitestaus 156 4.14 Testaus ketterässä kehittämisessä 170 4.15 Hyväksymistestaus 179 4.16 Ketterä hyväksymistestaus: ATDD 187 4.17 Alfa- ja Beta-testit 190 4.18 Tarvitaanko kaikkia testaustasoja ja vaiheita? 191 Ohjelmistotekniikka Sisällysluettelo 4/10 4.19 Milloin siirtyä tasolta toiseen? 5. Tutkiva testaus 195 203 5.1 Tutkiva testaus pähkinänkuoressa 204 5.2 Tutkiva testaus: Esimerkkejä 209 5.3 Tutkiva testaus perustuu strategioihin ja tietoon 211 5.4 Session lähtökohdat 215 5.5 Suorituksen dokumentointi? 219 5.6 Tutkiva testaus arjessa 221 5.7 Uusien toimintojen nopea testisuunnittelu 223 5.8 Ennakkovarautuminen 224 5.9 Ketterä testaus ei-ketterässä projektissa 225 6. Riskianalyysi ja testien priorisointi 237 6.1 Käytön ymmärtäminen lähtökohtana 239 6.2 Riskianalyysin kulku 240 Ohjelmistotekniikka Sisällysluettelo 5/10 7. Testauksen dokumentoinnista 253 7.1 Testauksen korkean tason suunnitteludokumentit 254 7.2 Testauksen suunnittelun prosessi 255 7.3 IEEE 829 antaa osviittaa suunnitelmiin 260 7.4 Matala taso: testitapausten dokumentointi 263 7.5 Pienissä projekteissa kevyesti 264 7.6 Testausraportit 265 7.7 Hyvä testausraportti 266 7.8 IEEE 829-2008 – Ketterässä toiminnassa riittää vähäisempi dokumentaatio 271 8. Testauksen seuranta 272 8.1 Testauksenhallintaohjelmisto pähkinänkuoressa 273 8.2 Virhetilanteen seuranta 274 8.3 Testausraportti 275 9. Lisää testauksen menetelmistä ja tekniikoista Ohjelmistotekniikka 276 Sisällysluettelo 6/10 9.1 Hyödynnetäänkö ohjelman koodia vai ei? 280 9.2 Kuka testaa? 284 9.5 Mitä ohjelman osaa testataan? 287 9.8 Minkä tyyppisiä ongelmia etsitään? 290 9.11 Mitä ohjelmalla pitää tehdä? 293 9.12 Asennustestaus 294 9.13 Suorituskyky- ja kuormitustestaus 295 9.14 Luotettavuustestaus 302 9.15 Regressiotestaus 303 9.16 Savutestaus 306 9.17 Mistä tiedetään onnistuiko testiajo vai ei? 308 9.18 Heuristinen johdonmukaisuus 309 10. Virheraportoinnista 10.1 Virheraportti jakaa tietoa Ohjelmistotekniikka 311 312 Sisällysluettelo 7/10 10.2 Voiko virheen toistaa? 321 10.3 Hyvän virheraportin resepti 322 10.4 Vikatietokannat 327 11. Ohjelmistojen mittaaminen 329 11.1 Mittarit 330 11.2 Ei-toiminnallinen testaus 344 11.3 Sitä saa mitä mittaa! – Kuinka mittareita huijataan 345 11.4 Järjestelmätason kattavuusmitat 346 11.5 Koodin kattavuusmitat 348 11.6 Mutkikkuusmitat 359 11.8 Virheiden kylväminen 361 12. Automaatio ja työkalut 364 12.1 Testiautomaatio kokonaisuutena 366 12.2 Mitä on testiautomaatio 367 Ohjelmistotekniikka Sisällysluettelo 8/10 Eri tapoja kohteen ohjaamiseen (yksinkertaistettuna) 368 12.3 Testiautomaation lupauksia 369 12.4 Testiautomaation yleiset ongelmat 370 12.5 Automaation rajoitukset 371 12.6 Ohjelman testattavuus 374 12.7 Testiautomaatio – erilaista ohjelmistosuunnittelua 379 12.8 Automaation lähestymistavat 383 12.9 Automatisoinnin suunnittelu 393 12.10 Tunnettuja työkaluja 397 12.11 Automatisointiprojekti 398 12.12 Työkalun valinta 400 12.13 Mallipohjainen testaus 405 13. Tietoturvan testaaminen 13.1 Mitä kaikkea kuuluu tietoturvallisuuteen? Ohjelmistotekniikka 426 428 Sisällysluettelo 9/10 13.2 Tietoturvan testaaminen tärkeää 430 13.3 Tietoturvatestauksen kohteet 432 13.4 Tietoturvatestauksen luonne 433 13.5 Lähtökohtana riskianalyysi 434 13.6 Paljon ohjeita 435 13.7 OWASP – Nettisivustojen tietoturva 436 13.8 OWASP – Mobiiliturvallisuus 439 13.9 PC-sovellusten uhista 440 14. Staattisen testauksen tekniikat 458 14.1 Tarkastus 459 14.2 Katselmointi 468 14.3 Läpikäynti 471 14.4 Lähdekoodin staattinen analyysi 473 15. Testauksen parantaminen Ohjelmistotekniikka 478 Sisällysluettelo 10/10 15.1 Jatkuva parantaminen 480 15.2 Parantamisprojekti 481 15.3 Testaustoiminnan avainalueet –esimerkkinä TPI 487 15.4 Parantaminen vastaamaan standardien vaatimuksia 494 15.5 Testaajien sertifiointi – ISTQB 496 16. Kurssin loppukaneetti 498 Kirjallisuutta 502 Ohjelmistotekniikka Alkusanat Nämä luentokalvot ovat syntyneet vuosien 2003 – 2015 aikana, jolloin Ohjelmistojen testaus -kurssi on järjestetty TTY:llä uudistetussa muodossaan. Lähteinä on alun perin käytetty tämän kalvosarjan lopussa listattuja kirjoja, Maaret Pyhäjärven ja Erkki Pöyhösen koulutusmateriaaleja sekä Helsingin yliopiston vastaavan kurssin luentomateriaalia. Muihin lähteisiin viitataan kalvoissa tarpeen mukaan. Kalvosarjaa on uudistettu joka vuosi sen pitämiseksi ajan tasalla ottaen huomioon DI:n lähitulevaisuuden osaamistarpeet. OTE Merkki osassa kalvoja kertoo, että jokin asia on käsitelty Ohjelmoinnin tekniikat -kurssilla ja käydään läpi joko tiiviimmin tai täydentäen. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 12(504) 1. Kurssin tavoitteet 1/3 • Kurssin tavoitteena on oppia perusasiat ohjelmistojen testaamisesta ja luoda hyvä pohja lisätietojen hankkimiselle – Edistyneempiä aiheita käydään läpi tarpeen mukaan • Luentojen avulla pyritään luomaan laajaa kuvaa testauksesta, johon kuuluu paljon muutakin kuin vain testien suunnittelua ja niiden ajamista • Harjoitustyössä tarkoitus on oppia käytännön tekemisen kautta – Opiskelijat pitäneet sitä yleensä antoisana • Kurssin näkökulma pyrkii myös olemaan siinä mielessä avara, että eri sidosryhmien tarpeisiin kiinnitetään huomiota unohtamatta esim. yritysjohtoa ja tuotteen loppukäyttäjää Ohjelmistotekniikka Ohjelmistojen testaus, 2015 13(504) Kurssin tavoitteet 2/3 • Vaikka valmis DI ei itse tekisikään testausta, tulee asia vastaan kaikenlaisissa ohjelmistokehitykseen liittyvissä työtehtävissä, sekä myyjän että ostajan roolissa, ja kaikilla organisaation tasoilla • Jossain tapauksissa DI voi olla ainoa henkilö koko organisaatiossa, jolla on jotain tietämystä asiasta • Testausosaamista tarvitaan nykyään monenlaisissa liiketoimintaprosesseissa • Hyvässä organisaatiossa löytyy osaajia, jotka osaavat oman alueensa työtehtävät hyvin, mutta ymmärtävät myös mitä muualla tapahtuu – Yksikkötestausta tekevät yleensä enemmän teknisesti orientoituneet ihmiset ja järjestelmätestausta taas enemmän loppukäyttäjiä lähellä olevat henkilöt – Liiketoiminnan suunnittelussa voi tehdä monenlaista testausta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 14(504) Kurssin tavoitteet 3/3 • Emme kuitenkaan ole ammattikoulussa. – Emme opettele uusimpia ja muodikkaimpia välineitä, vaan pyrimme oppimaan yleisiä periaatteita. – DI:n pitää pystyä soveltamaan osaamistaan erilaisissa tilanteissa ja luomaan tarvittaessa organisaatiolleen parhaiten sopivia tapoja testata. • Eri tehtävissä on hyvin erilainen näkökulma testaukseen. Elämä organisaatioissa on yhteistyötä. Siksi niitä näkökulmia pitää ymmärtää. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 15(504) 1.1 Kurssin lähestymistapa testaukseen • Lähestymme testausta objektiivisesti ja korostamme erilaisia menetelmiä, työkaluja sekä vaatimuksia, jotka sanelevat sen, mitä vasten ohjelmaa testataan. • Tarkastelemme testausta osana ohjelmistotuotantoprosessia, joka määrittelee sen, missä vaiheessa mitäkin testataan – Yksinkertaisuuden vuoksi on joitakin todellisuuden rikkaita yksityiskohtia on häivytetty, jotta näkisimme metsän puilta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 16(504) 1.2 Mitä tällä kurssilla ei kateta? • Testauksen maailma on hyvin laaja ja läheskään kaikki ei mahdu yhteen kurssiin • Tiettyjen sovellusalueiden erityispiirteet – Sulautetut, turvallisuuskriittiset, SOA, yms. • • • • Testauksen hallinnointi laajoissa ja hajautetuissa projekteissa Organisointi, roolit ja tiimien toiminta Yksittäiset projektitoiminnan mallit ja käytännöt Eräät testityypit kuten käytettävyystestaus, lokalisointi, A/Btestaus yms. • Testityökalujen kirjo Ohjelmistotekniikka Ohjelmistojen testaus, 2015 17(504) 1.3 Testaus-aiheisia verkkosivuja • Testauksesta on paljon asiaa netissä. • Linkkejä: – http://mattivuori.net/extra/www_testing_links.htm – Linkkilistassa on myös viittauksia ilmaisiin testauksen nettilehtiin. • Wikipedia on hyvä lähde, kun haluaa selvittää mitä jokin testauksen erikoistermi tarkoittaa. – Siellä on hyviä esityksiä monista tämän kalvosetin asioista, jotka joudutaan nyt kuittaamaan hyvin lyhyesti. • Ja tietysti ihan vain Google. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 18(504) 2. Johdanto Aloitetaan kurssi määrittelemällä, mitä olemme opiskelemassa. Mitä testaus on ja mitä yleisiä haasteita siihen liittyy. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 19(504) OTE 2.1 Mitä testaus on? Erilaisia näkökulmia • Eräitä näkökulmia siihen, mitä testaus on: – Testaus on prosessi, jossa ohjelmaa suoritetaan tarkoituksena löytää siitä virheitä (Myers) – Testaus on ohjelmiston laadun mittaamista (Hetzel) – Oleellinen osa testausta on siihen liittyvän dokumentaation, työkalujen yms. (testware) käyttäminen ja ylläpito (Craig&Jaskiel) – Testaus on tekninen tutkimus, joka tehdään laatuun liittyvän tiedon paljastamiseksi testauksen kohteena olevasta tuotteesta (Kaner) – Testaus on ohjelmien rikkomista (Whittaker) – Testaus on kokeellista toimintaa, joka tuottaa tietoa laadusta päätöksentekoa varten (useat) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 20(504) Tavoitteena virheiden löytäminen 1/3 • Valitettavasti testaus ei voi osoittaa ohjelmiston virheettömyyttä • Testaus ei myöskään sinällään paranna ohjelmiston laatua, se vain mittaa sitä ja tuottaa tietoa sen laadusta – Tilanteen seuraamiseksi, päätöksentekoa varten • Testaus ei ole ensisijaisesti sen varmistamista, että ohjelma toimii niin kuin sen pitäisi – Toimivuuden varmistaminen ei ole hyvä lähtökohta testitapausten suunnittelulle, sillä ihminen näkee helposti vain sen mitä haluaa nähdä • Parempi lähtökohta on: onnistunut testiajo on sellainen, joka aiheuttaa häiriön ohjelman toiminnassa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 21(504) Tavoitteena virheiden löytäminen 2/3 • Tällaisen testiajon seurauksena voidaan testattavasta kohteesta löytää virhe, jonka poistaminen vasta parantaa laatua • Testaajan oletus: ohjelmassa on aina virheitä, jotka vain odottavat löytymistään • Testataan, jotta voidaan osoittaa, että – Ohjelma tekee, mitä sen ei pitäisi – Ohjelma ei tee, mitä sen pitäisi – Ohjelma toimii tavalla, jota määrittely ei mainitse • Ehkä sen pitäisi mainita? – Ohjelmisto on hankala ymmärtää, vaikeakäyttöinen, hidas tai toimii käyttäjän mielestä väärin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 22(504) OTE Tavoitteena virheiden löytäminen 3/3 • Löydettyjen virheiden korjaus ohjelmassa on ensiaskel laadun parantamisessa. – Se parantaa heti tuotetta. • Voidaan myös selvittää, mistä virheet johtuvat ja vaikuttaa niiden "juurisyihin" – oliko kyse esim. määrittelyn, suunnittelun vai toteutuksen ongelmista? Tehdäänkö niissä jotain huonosti? – Tällä selvittelyllä voidaan parantaa toimintaa ja vähentää virheitä jatkossa. • Jokainen testauksen tuottama tieto virheestä on mahdollisuus oppia. • Löydetty virhe on iloinen asia! Ohjelmistotekniikka Ohjelmistojen testaus, 2015 23(504) 2.2 Aina jokin vertailukohta: Vaatimukset 1/3 • Testauksessa verrataan aina havaintoja, siihen mitä tiedämme systeemiin kohdistuvista odotuksista – Kuvatut vaatimukset, miten sellaiset systeemit toimivat yleensä, mitä tiedämme käyttäjien odottavan, jne… Vaatimus Vertailu Havainnot Mietitty testi Ohjelman suoritus Ohjelmistotekniikka Ohjelmistojen testaus, 2015 24(504) Aina jokin vertailukohta: Vaatimukset 2/3 • Pitää siis selvittää, mitä systeemiltä odotetaan – – – – – – Toiminnallisuus? Millaisia häiriöitä sen pitää sietää? Suorituskyky? Käytettävyys? Tietoturvallisuus? Jne… • Osa vaatimuksia voi olla mietitty tälle tuotteelle, mutta isoa osaa ei – tarvitaan yleistä tietoa tuotteiden ja systeemien toiminnasta ja mitä niiltä odotetaan Ohjelmistotekniikka Ohjelmistojen testaus, 2015 25(504) Aina jokin vertailukohta: Vaatimukset 3/3 • Käyttäjää ymmärrettävä: – – – – – – Millaisia käyttäjät ovat? Mitä he tekevät, mikä on tavoite? Miten he toimivat, millainen ympäristö? Millainen laiteympäristö heillä on? Millaista dataa käytetään? Mikä on tärkeintä onnistua? • Tietoja voi löytyä spekseistä, user storyistä, vastaavista tuotteista, tiimistä, tuoteomistajilta, asiakkailta… mutta testaajan täytyy etsiä sitä tietoa ja tehdä tulkintoja – ja tehdä asia itselleen selväksi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 26(504) Laatumallistandardi ISO 25010 – tarkistuslistaksi 1/3 ISO/IEC 25010:2011. Systems and software engineering – Systems and software Quality Requirements and Evaluation (SQuaRE) – System and software quality models. 34 p. Huom!Vapaa käännös. Standardia ei ole suomennettu. Piirre Toiminnallinen soveltuvuus Suorituskyky Yhteensopivuus Ohjelmistotekniikka Ali-piirteet Toiminnallinen kattavuus Toiminnallinen oikeellisuus Toimintojen oikeanlainen suunnittelu ja toteutus Aikakäyttäytyminen Resurssien käyttö Kapasiteetti Yhteiselo toisten järjestelmien kanssa Yhteentoimivuus Ohjelmistojen testaus, 2015 27(504) Laatumallistandardi – ISO 25010 – tarkistuslistaksi 2/3 Piirre Käytettävyys Ali-piirteet Tarkoitukseen soveltuvuuden tunnistaminen Opittavuus Operoitavuus (helppokäyttöisyys) Suojaus käyttäjän virheiltä Käyttöliittymän esteettisyys Saavutettavuus Luotettavuus Kypsyys Saatavuus Vikasietoisuus Toipumiskyky Tietoturvallisuus Ohjelmistotekniikka Luottamuksellisuus Eheys Kiistämättömyys Tarkastettavuus Ohjelmistojen testaus, 2015 Autentikointi 28(504) Laatumallistandardi – ISO 25010 – tarkistuslistaksi 3/3 Piirre Ylläpidettävyys Siirrettävyys Ali-piirteet Modulaarisuus Uudelleenkäytettävyys Analysoitavuus Muunnettavuus Testattavuus Sovitettavuus Asennettavuus Korvattavuus • Monia piirteitä voidaan selvittää testaamalla. • Monia taas ei. • Jotkut piirteet vaikuttavat siihen, miten hyvin systeemiä kyetään testaamaan. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 29(504) Toiminnallinen vs. ei-toiminnallinen testaus • Vaatimukset jaetaan usein karkeasti toiminnallisiin ja eitoiminnallisiin – Esimerkkejä ei-toiminnallisista vaatimustyypeistä: suorituskyky, tietoturva, käytettävyys jne. • Yleensä testauksessa käytettävät tekniikat riippuvat voimakkaasti siitä, minkä tyyppisiä vaatimuksia on tarkoitus testata • Toiminnallinen testaus on "tavallista" teknistä testausta – eitoiminnallisten asioiden testaamisen lisäämiselle on painetta – Käytettävyystestausta ja tietoturvatestausta tehdään suhteellisen vähän Ohjelmistotekniikka Ohjelmistojen testaus, 2015 30(504) 2.3 Virheiden lähteitä 1/3 1. Väärät käsitykset halutusta toiminnasta • Väärä tiedonlähde (PO asiakkaan sijaan) • Tieto muuttuu matkan varrella • Erilainen konteksti • Vanhaa tietoa • Dokumentit: puuttuvat, väärät, virheelliset, ei-yksikäsitteiset, epäselvät, vanhentuneet 2. Ympäristötekijät • Erilaiset laiteympäristöt • Käyttöjärjestelmä • Käyttäjän oikeudet • Asennustapa • Muut ohjelmisto / "DLL hell" • Päivitykset 3. Muutokset muussa ohjelmistossa • Emo-ohjelman muutos (selain rikkoo pluginit) • Muutoksenhallinta • Muut moduulit Virheiden lähteitä 7. Kääntäjien yms. viat • Lähdekoodi kunnossa, mutta syntyy viallista konekoodia 4. Toteutusvirheet • Epäsopivat algoritmit • Koodausvirheet • Konfigurointivirheet • Resurssien virheet • Toisen tekemät muutokset 5. Huonolaatuiset moduulit • Kolmansien osapuolten moduuleissa piileviä vikoja tai yhteensopimattomuuksia 6. Väärä käännösyksikkö • Versionhallinta • Konfiguraationhallinta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 31(504) Virheiden lähteitä 2/3 2. Ohjelmiston väärinkäyttö • Väärä tarkoitus 3. Käyttäjän tavat toimia • Erilaiset käyttäjät 1. Häiriöt • Nettiyhteys katkeaa • Levytila täyttyy • Tiedostoa ei löydy Varautumattomuus 6. Virhesyötteet • Kirjoitusvirheet • Väärinkäsitykset • Puuttuva data • Virheet tiedostoissa Ohjelmistotekniikka 4. Käyttöympäristö 5. Sabotaasi • Sisäiset hyökkäykset • Ulkoiset hyökkäykset • Murtautuminen • Denial of service Ohjelmistojen testaus, 2015 32(504) Virheiden lähteitä 3/3 • Uudet asiat – – – – Uusi teknologia Uusi toimintaympäristö Uudet kehittäjät Uusi tiimi • Kompleksisuus – Kompleksinen teknologia – Kompleksinen kokonaisuus • Paineet – Aikapaineet – Paineet toteuttaa uutta • Tekijänä ihminen – ihmiset tekevät virheitä! Ohjelmistotekniikka Ohjelmistojen testaus, 2015 33(504) 2.4 Missä aktiviteetissa virheet syntyvät? OTE Kuva: Timo Malm, VTT. Data origin: Capers Jones. Software quality in 2008: A survey of the state of the art. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 34(504) 2.5 Testityypin käsite • Systeemin ominaisuuksiin liittyy läheisesti testityypin käsite. • Se kuvaa tietyn testauksen, jolla selvitetään jonkin ominaisuuden laatua. – Toiminnallisuustestaus testaa toimintojen toimintaa – toimiiko kaikki, kuten pitää. Sitä voidaan tehdä matalalla tasolla yksikkötestauksessa tai korkealla tasolla "järjestelmätestauksen" tasolla vaikkapa käyttöliittymän läpi. – Käytettävyystestaus testaa käytettävyyttä. – Suorituskykytestaus suorituskykyä jne… • Ideana on kohdentaa testauksen fokus johonkin asiaan ja käyttää sitten testaukseen siihen sopivia menetelmiä ja välineitä – ja myös asian osaavia ammattilaisia. • Toiminnallisuustestaus on kaikkein yleisintä ja siksi sitä tarkastellaan jatkossa eniten. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 35(504) 2.6 Liiketoiminnan tukeminen • Testausta ei tehdä umpiossa, vaan sen avulla tuetaan esimerkiksi liiketoiminnan tavoitteita. Esimerkiksi: • Sähköinen kauppa: – Hyvää toimintaa asiakkaiden kanssa netissä: Hyvä käyttäjäkokemus, luotettavuus, tietoturvallisuus, kestää kuormitusta. Systeemiä voidaan uudistaa helposti – luotettava pohja. • Tuotekehitys: – Tuotekehityksen nopeus, uutta arvoa asiakkaalle nopealla syklillä. – Oikeat asiat toteutettu laadukkaasti. – Tuoteriskien hallinta. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 36(504) Tietotarpeita, joissa testaus auttaa 1/2 • Ohjelmiston toteutus – – – – – – Toimiiko ohjelma oikein ja hyvin? Onko siinä ongelmia tai vaaroja? Täyttääkö se projektissa asetetut vaatimukset? Toimiiko se yhteen muiden systeemien kanssa? Mitä käyttäjät pitävät siitä? Mitä pitäisi parantaa? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 37(504) Tietotarpeita, joissa testaus auttaa 2/2 • Tuoteliiketoiminta – – – – – – – – Millaisia ratkaisuja asiakkaat suosivat? Onko järjestelmä riittävän kypsä julkaistavaksi? Mitä ongelmia siinä on? Millaisia riskejä liittyy julkaisuun? Täyttääkö se asiakkaan vaatimukset? Onko se yhtä hyvä kuin kilpailijat? Täyttääkö se standardien vaatimukset? Täyttääkö testaustapa standardien vaatimukset? • Jne… Ohjelmistotekniikka Ohjelmistojen testaus, 2015 38(504) Tekninen velka • Nopeus ja ketteryys edellyttävät sitä, että alusta on hyvässä kunnossa. • Ei saa olla liikaa "teknistä velkaa". • Se ei tarkoita liiallista perfektionismia, vaan esim. sitä, että tuote on mahdollisimman bugiton koko ajan eikä leviä käsiin, kun sitä muutetaan. • Testaaminen ja virheiden nopea korjaus auttavat tässä. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 39(504) 2.7 Perinteinen testausprosessi • (Perinteiseen) testausprosessiin voidaan katsoa kuuluvan ainakin seuraavat työvaiheet: – – – – Testauksen suunnittelu Testitapausten luominen Testitapausten suorittaminen Testiajojen tulosten arvioiminen ja raportointi • Koska aina tulee kiire, tavoitteena on määritellä käytettävä prosessi siten, että sitä ei ruveta kiertämään asetettujen tavoitteiden saavuttamiseksi • Usein testauksen työmäärät aliarvioidaan vielä pahemmin kuin muiden vaiheiden – Ja kun tulee kiire, kumpi joustaa: koodaus vai testaus? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 40(504) OTE 2.8 Kaikkea ei voida testata 1/3 • Käytännönläheinen esimerkki siitä, miksi kaikkea ei voida testata: long add(int i, int j) { … } • Jos int-tyyppi vastaisi 16-bittistä kokonaislukua, ja funktio tuottaisi samoilla syötteillä aina saman tuloksen, on mahdollisia testitapauksia jopa 216 x 216 = 4294967296 kpl • Jos ajatellaan yhden testitapauksen ajamiseen kuluvan viitisen sekuntia, kuluisi kyseisen funktion testaukseen noin 680 vuotta – 680 testaajaa selviytyisi rinnakkaistetusta tehtävästä yhdessä vuodessa mikäli työskentelisivät kellon ympäri Ohjelmistotekniikka Ohjelmistojen testaus, 2015 41(504) Kaikkea ei voida testata 2/3 • Auttaisiko automaatio? Mikäli yhden testin ajoaika saataisiin pudotettua esim. yhteen sadastuhannesosaan, kestäisi koko funktion testaus enää vain pari päivää ilman rinnakkaisuuden hyödyntämistä • Valitettavasti tosielämän testikohteet ovat monimutkaisempi kuin ko. funktio, joten automaatiollakaan ei pitkälle pötkitä – Esim. jokaisen int-tyyppisen parametrin lisääminen kasvattaa funktion testitapausten määrän 65536-kertaiseksi – Realistisen ohjelman testitapausten määrä kasvaa hyvin nopeasti liian suureksi • Mikäli joku väittää testaavansa kaiken, kannattaa kyseenalaistaa tämä väite Ohjelmistotekniikka Ohjelmistojen testaus, 2015 42(504) OTE Kaikkea ei voida testata 3/3 • Jos esimerkiksi 1960-luvulla uuden lentokoneen vaatimuksista 10% koski ohjelmistoa, niin 2000-luvulla luku voi olla 80% • Myös vaatimusten kokonaismäärä kasvaa koko ajan • Lisäksi ohjelmiston mutkikkuus kasvaa vielä nopeammin kuin sen koko • Vaikka historiatietoa testauksen vaatimista työmääristä olisikin käytettävissä, on vaikea arvioida sitä, paljonko ohjelmiston koon kasvaminen niihin vaikuttaa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 43(504) 2.9 Testauksen koulukuntia • Testauksen perusluonteesta on niin erilaisia näkemyksiä, että voidaan puhua "koulukunnista". • Niitä on hyvä ymmärtää ja tunnistaa – muuten ei voi toimia erilaisissa ympäristöissä. • Aiemmin niitä ovat määritelleet mm. Cem Kaner ja Brett Pettichord: – Kaner, Cem. 2006a. Schools of software testing. Available at: http.//kaner.com/?p=15. [Checked 23.3.2012] – Pettichord, Bret. 2007. Schools of Software Testing. Slide set. 33 p. • Seuraavassa on Vuoren käsitys koulukunnista vuonna 2015. • Ne ovat hieman karikatyyrejä ja reaalimaailmassa yhdistyvät toisiinsa. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 44(504) Testauksen koulukuntia 2015 1/5 • Standardointikoulukunta. – Testauksen pitäisi perustua standardeihin, kuten ISO/IEC 29119 tai ISTQB:n kuvaukset. Testaustapojen yhteensopivuus näiden kanssa koetaan ammattimaisuuden osoituksena. – Testaus on samanlaista kaikissa konteksteissa ja käytäntöjen pitäisi olla samanlaiset. • Laadunhallinta ja –varmistuskoulukunta. – Testaus on osa laadunhallintaa ja laadunvarmistusta. – Testaus on verifioinnin ja validoinnin (V&V) keino ja sitä tehdään määritellyissä, toistettavilla tavoilla. – Testaus on huolellisesti määritetty ohjelmistotuotannon prosesseissa. – Testauksenhallinnalla ja mittauksella on iso rooli. – Lähellä standardointikoulukuntaa. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 45(504) Testauksen koulukuntia 2015 2/5 • Automatisointikoulukunta. – Kaikki testaus pitäisi automatisoida, mitään testausta ei pitäisi tehdä käsin. – Bugien luonne on sellainen, että automaatio pystyy löytämään ne. – Testauksella pitäisi olla lähes täydellinen kattavuus. – Testaus on luonteeltaan logistinen prosessi. • Kehittäjäkeskeinen koulukunta. – Kehittäjien tekemä yksikkö- ja integrointitestaus riittää yleensä. – Testaus pitää integroida ohjelmiston tuotantoprosesseihin. – Testiautomaation pitää olla käytännöllistä, nopeaa, yksinkertaista ja helppoa. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 46(504) Testauksen koulukuntia 2015 3/5 • Laadunvarmistuskeskeinen automaatiokoulukunta. – Testaus edellyttää haastavaa testiautomaatiota. – Mikään kompleksisuus ei ole huonoa, jos haasteet ovat kompleksisia. – Testaus edellyttää taakseen hyvää tiedettä, jotta testisysteemit ja tulokset voidaan optimoida. – Hyvä testisysteemin suunnittelu ja analyyttinen lähestymistapa ovat tärkeitä. – Tätä tavataan teollisuudessa kompleksisten järjestelmien testauksesta. • Kontekstilähtöinen koulukunta / tilannetekijälähtöinen koulukunta. – Riippuu tilanteesta, miten testausta pitäisi tehdä. – Kontekstin arviointi on tärkeää. – Ei ole "parhaita käytäntöjä". Ohjelmistotekniikka Ohjelmistojen testaus, 2015 47(504) Testauksen koulukuntia 2015 4/5 • Älykkään testaamisen koulukunta. – Testaus on älykästä toimintaa, joka edellyttää aina ihmiselle ominaisia kykyjä. – Explorointi on oleellista virheiden löytämiselle. – Jokaisessa testattavassa asiassa on aina läsnä enemmän kuin mitä ensisilmäyksellä voi päätellä. – Työkalut auttavat testauksessa, mutta ne eivät "tee" testausta. – On iso ero yksinkertaisella tarkastamisella ja todellisella testaamisella, joka paljastaa uutta informaatiota. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 48(504) Testauksen koulukuntia 2015 5/5 • Rutiinikoulukunta. – Testaus on yksinkertaista työtä, joka ei edellytä erityisiä taitoja. – Suunnilleen jokainen organisaatiossa pystyy testaamaan. – Kurinalaisuus ja tarkkuus ja suunnitelmien seuraaminen ovat tärkeimmät asiat testaajien työssä. • Holistinen koulukunta. – Ei ole yhtä ainoaa tapaa tehdä testausta. – Hyvä testaus soveltaa useita paradigmoja sekoituksena, joka riippuu kontekstista. – Kaikki lähestymistavat täydentävät toisiaan. – Ristiriitaisetkin paradigmat ovat hyväksi testaukselle. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 49(504) 2.10 Testauksen kansanperinnettä 1/3 • Kaikissa ohjelmistokehityksen vaiheissa tehdään virheitä • Mikäli virheitä halutaan välttää, täytyy välttää ihmisiä • Mitä aikaisemmin virheet löydetään, sen parempi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 50(504) Testauksen kansanperinnettä 2/3 • Pahimmassa tapauksessa viat ilmenevät vasta kun järjestelmä on jo toimitettu: – Therac-25-röntgenhoitokone antoi liian suuria säteilyannoksia johtaen kuuden ihmisen kuolemaan – ESA:n Ariane 5 –raketin epäonnistunut laukaisu aiheutti noin seitsemän miljardin dollarin kustannukset – Viallisten Pentium-suorittimien vaihtaminen maksoi Intelille yli 400 miljoonaa dollaria – Kolmasosa USA:n puhelinverkosta on mykistynyt kahdesti (AT&T ja DCS) • Ohjelmistovirheiden vuotuiset kustannukset USA:ssa arviolta n. 0,6% BKT:sta, eli n. $60 miljardia (The Economic Impacts of Inadequate Infrastructure for Software Testing, 2002) – Tilanne tuskin sen parempi Euroopassa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 51(504) Testauksen kansanperinnettä 3/3 • Huolellisesti tehdyssä ohjelmassa on arviolta noin viisi virhettä jokaista tuhatta koodiriviä kohti • Windows XP:ssä oli koodia ilmeisesti n. 45 miljoonaa riviä, jolloin siinä on arviolta ainakin 225 000 virhettä – Vistassa oli n. 60 miljoonaa riviä koodia • Onneksi Windows osaa päivittää itsensä verkosta automaattisesti! • Huom! Microsoftilla on 1:1 suhteessa kehittäjiä ja testaajia • Käsi sydämellä: osaisiko joku tehdä saman homman paremmin kuin Microsoft? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 52(504) 2.11 Testaus on vaativaa työtä • Käytännössä testaajalta vaaditaan enemmän kuin koodaajalta • Tarvitaan kokonaiskäsitystä ongelmakentästä ja testikohteen arkkitehtuurista • Usein tarvitaan salapoliisin taitoja testien tulosten analysointiin • Kuinka testata ohjelmaa, josta ei ole olemassa ainuttakaan dokumenttia tai käyttöohjetta? – Tämä ei ole niin harvinainen tilanne kuin saattaisi olettaa… • Testikoodi on usein organisaation kannalta yhtä arvokasta kuin varsinainen sovelluksen koodi – (Automaattiset) regressiotestit mahdollistavat ohjelmiston ylläpidon ja laajentamisen sekä myös ketterän reagoimisen vaatimusten muuttumiseen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 53(504) 2.12 Testaus on tiimityötä • Liian voimakas rajanveto testaajien ja kehittäjien välillä ei kuitenkaan hyödytä lopulta ketään – Ohjelmistokehitys on tiimityötä sanan varsinaisessa merkityksessä • Vaikka kaikkien testaajien ei tarvitsikaan osata ohjelmoida, on ohjelmointitaidoista yleensä todellista hyötyä – On hyvä tietää millaisiin virheisiin kehittäjät sortuvat – Testiautomaation kehittäminen on softankehitystä – kaikenlaiset pienet skriptit, niiden korjailu • Toisaalta, vähemmän teknisesti orientoituneet testaajat voivat ymmärtää paremmin loppukäyttäjien tarpeita • Tiimeissä on tärkeää olla eri tavoilla ajattelevia ihmisiä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 54(504) 2.13 Mitä testaukselta voi vaatia? • Ei voi vaatia – Kaikkien virheiden löytämistä – Laadun varmistusta – Julkistamisen ajankohdan päättämistä • Voi vaatia – Uuden tiedon tuottamista tuotteesta • Hyödyntää testaajia muuhunkin kuin vain virheiden paljastamiseen – Kokonaiskäsitystä kehitettävästä järjestelmästä ja sen laadusta – Toimivaa kommunikaatiota tuotteen ongelmista • Virheiden olemassaolon ja niiden korjauksen myyminen kehittäjille Ohjelmistotekniikka Ohjelmistojen testaus, 2015 55(504) OTE 2.14 Keskeisiä termejä 1/6 • Virhe (error) on ohjelmassa oleva poikkeama spesifikaatiosta • Vika (fault, defect) voi aiheutua, kun virheellinen kohta suoritetaan tai kun pitäisi suorittaa jotain, mitä ei olekaan toteutettu • Häiriö (failure) on järjestelmän ulkoisessa toiminnassa näkyvä tapahtuma, joka johtuu viasta – Vika ei välttämättä näy järjestelmän toiminnassa ts. kaikki viat eivät johda häiriöön • Bugi (bug) voi tarkoittaa mitä tahansa edellisistä Huom! Näitä termejä käytetään hyvin epäjohdonmukaisesti Ohjelmistotekniikka Ohjelmistojen testaus, 2015 56(504) Keskeisiä termejä 2/6 • Dynaamisessa testauksessa ohjelmaa ajetaan sopivilla syötteillä • Staattisessa testauksessa ei ohjelmaa suoriteta vaan yritetään löytää virheitä tutkimalla esim. sen lähdekoodia tai dokumentaatiota – Dokumentaatio on softaa, joten sitä pitää testata – Joidenkin mielestä tämä ei ole testausta sanan varsinaisessa merkityksessä • Spesifikaatio kertoo, miten jonkin pitäisi tai ei pitäisi toimia – Esim. vaatimusmäärittely kertoo, mitä vaatimuksia ohjelman pitäisi täyttää, luokan dokumentaatio kertoo, miten luokan pitäisi toimia Ohjelmistotekniikka Ohjelmistojen testaus, 2015 57(504) OTE Keskeisiä termejä 3/6 • Testattava asia (test condition) kuvaa sen, mitä ollaan tekemässä • Testitapaus (test case) kuvaa syötteet, joilla testikohde pyritään saattamaan häiriötilaan sekä odotetut tulokset • Testiproseduuri kuvaa ne stepit, joilla testitapaus suoritetaan. Käytännössä kuvataan osana testitapausta. • Testijoukko, testitapausjakso (test suite) on joukko (loogisesti yhteenkuuluvia) testitapauksia • Testiympäristö tarkoittaa sitä laitteisto- ja ohjelmistoympäristöä, jonka kanssa testikohde on tekemisissä, mukaan lukien rajapinnat, tyngät ja ajurit – Testiympäristön määrittelyllä pyritään välttämään ”kyllä se ainakin eilen toimi mun PC:ssä” –tyyppiset ongelmat virheitä metsästettäessä – Tärkeää vastata käyttäjien / tuotantoympäristöä – Useita erilaisia Ohjelmistotekniikka Ohjelmistojen testaus, 2015 58(504) Keskeisiä termejä 4/6 • Testwareen kuuluvat kaikki dokumentit ja tuotteet, jotka luodaan testausta varten kuten esim. testitapaukset ja testisuunnitelmat [Craig&Jaskiel 02] • Validointi pyrkii varmistamaan, että olemme tekemässä oikeaa tuotetta – Onko se oikeasti tarpeita ja odotuksia vastaava • Verifiointi pyrkii varmistamaan, että olemme tekemässä tuotetta oikein – Miten tuote vastaa kirjattuja vaatimuksia – Joidenkin formalistien mielestä vain ns. formaali verifiointi on oikeaa verifiointia, testauksella kun ei voida osoittaa virheettömyyttä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 59(504) Keskeisiä termejä 5/6 • Testausstrategia on sotasuunnitelma, joka määrittelee testauksen laajuuden ja syvyyden, mitä testikohteen riskejä pyritään kattamaan testausprojektin aikana ja mitä ei • Rakkaalla lapsella on monta nimeä: yhdestä ja samasta testausvaiheesta voidaan puhua esim. yksikkö-, moduuli- tai komponenttitestauksena • SUT, system under test – IUT: implementation under test, DUT: device under test, jne. • Ohjelmien termejä ”funktio” ja ”metodi” käytetään tällä kurssilla vaihtelevasti tarkoittamaan samaa asiaa – Mikäli tarkoituksena on korostaa oliotestauksen erityispiirteitä, pyritään käyttämään termiä metodi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 60(504) OTE Keskeisiä termejä 6/6 • Positiivinen testaus yrittää varmistaa sen, että testattava järjestelmä tekee mitä sen pitäisi tehdä suorittamalla ”happy case” -tyyppisiä, usein vaatimuksista johdettuja testitapauksia • Negatiivinen testaus testaa niitä asioita, jotka voitaisiin lukea ”unhappy case” -kategoriaan kuuluviksi; tilanteita, joista vaatimukset eivät yleensä sano mitään (tai vain hyvin ylimalkaisesti), virhetilanteita, yms., joilla yritetään ”rikkoa” testikohde • Kattava ISTQB:n testaussanasto löytyy suomeksi täältä: http://www.fistb.fi/sites/fistb.ttlry.mearra.com/files/istqb_sanasto.pdf Ohjelmistotekniikka Ohjelmistojen testaus, 2015 61(504) 3. Testitapauksiin pohjautuva testaus Dynaaminen testaus on testitapausten miettimistä ja suorittamista ja havaintojen analysointia. Koska testitapaukset sanelevat pitkälti sen, mitä virheitä löydetään, kannattaa niiden laatuun panostaa. Mutta millainen on hyvä testitapaus? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 62(504) 3.1 Testitapaus pähkinänkuoressa OTE • Pieni testi ohjelman käyttäytymiselle – Ajatus asiasta, jota testataan: miten toimii laskimen jakolasku? – Ajatus hyvästä syötteestä: kokeillaan jakolaskua nollalla – Ajatus tuloksesta: virheilmoitus, ei saa kaatua, jotain muuta • Suoritetaan joko mietityllä tavalla tai annetaan testaajan valita, miten suoritus tehdään • Voidaan suunnitella systemaattisesti joukko niitä ennen suoritusta • Tai luoda sellainen "lennossa" • Tai niitä voidaan generoida automaattisesti softan komponenttien tyypin tai softan toimintaa kuvaavan mallin perusteella Ohjelmistotekniikka Ohjelmistojen testaus, 2015 63(504) Esimerkkejä • Syötetään laskimeen tavallinen yhteenlasku ja tarkistetaan, että se antaa oikean tuloksen. • Syötetään tietojärjestelmään päivämäärä, jota ei ole ja katsotaan, hallitseeko se tilanteen. • Jätetään lomakkeella pakollinen kenttä tyhjäksi. • Yritetään lukea ohjelmaan valtavan suuri tiedosto. • Kokeillaan tekstitiedostolle erilaisia merkistöjä ja katsotaan osaako se lukea ja tallentaa ne oikein. • Yritetään avata kuvankäsittelyohjelmaan rikkinäinen tiedosto. • Suljetaan nettiyhteys, kun ohjelma on lukemassa tietoa netistä. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 64(504) Mistä halutaan tietoa? • Ennen testitapausten miettimistä pitää keksiä syy niiden olemassaololle – Syyksi ei riitä se, että pomo käski varmistaa, että järjestelmä toimii oikein • Tunnistetaan ne tilanteet ja asiat, joista pitäisi hankkia laatuun liittyvää tietoa • Näiden miettimisessä vaatimusdokumentista, käyttäjien tarinoista (user story) yms. on paljon hyötyä – Täytyy kuitenkin muistaa myös negatiivisen testauksen näkökulma • Joskus testaajan täytyy tukeutua pelkästään omaan ammattitaitoonsa, jos ei ole käytettävissä mitään ”kättä pidempää” Ohjelmistotekniikka Ohjelmistojen testaus, 2015 65(504) OTE Testitapausten pitää olla haastavia • Hyvien testitapausten keksiminen on yleensä hankalaa • Huonot testitapaukset voivat antaa ohjelmiston laadusta liian ruusuisen kuvan – Se, että ohjelma näyttää toimivan niin kuin sen pitäisi, saattaa johtua vain siitä, että testitapaukset on valittu huonosti • Liiketoiminnan kannalta hyvät testitapaukset voivat olla jopa arvokkaampia kuin itse testikohteen lähdekoodi • Tyypillisesti 20% testitapauksista testaa normaalia toimintaa (positiivinen testaus) ja 80% ”epänormaalia” toimintaa kuten virhetilanteita yms. (negatiivinen testaus) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 66(504) Testitapausten lähteitä 1/2 • Syötteet – Mitä ohjelman pitää osata käsitellä? Millaisia virhesyötteitä sen pitää sietää? – Matalalla tasolla funktioissa ja käyttöliittymän tasolla – Millaista dataa ohjelman pitää osata lukea? Toimiiko se rikkinäisen datan kanssa? – Parametrien yhdistelmät • Tilat – Mikä kaikki pitää olla mahdollista tilassa? Mikä pitää olla estetty? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 67(504) Testitapausten lähteitä 2/2 • Käyttötapaukset – – – – – Asiat, joiden pitää onnistua. Häiriöt, jotka pitää hallita. Käyttäjien normaalisti tekemät asiat Käyttäjien virheet Tahallinen väärinkäyttö Vaarat • Vuorovaikutus muiden komponenttien ja ohjelmien kanssa – Normaali vuorovaikutus – Systeemin häiriöt • Standardien ym. Määrittämät asiat • Jne… ylipäätään kaikenlainen käyttäytyminen systeemin eri tasoilla Ohjelmistotekniikka Ohjelmistojen testaus, 2015 68(504) Kuluvan ajan minimointi 1/2 • Koska testien ajaminen voi kestää huomattavan kauan, pyritään niiden määrää minimoimaan • Minimointia voi tehdä suunnittelemalla testitapauksia, jotka kattavat mahdollisimman monta tutkittavaa tilannetta – Yksi testitapaus voi siis kattaa useamman kuin yhden tilanteen, mutta tämä voi toisaalta hankaloittaa testitulosten analysointia – Esimerkiksi pitkän netti lomakkeen testaus: täytetään kullakin kerralla joukko kenttiä tietyllä tavalla – ja sitten, kun tulee virhe, mietitään, mistä se johtui • Ekvivalenssiositus-menetelmässä mietitään syötteiden alueita, joilla systeemi käyttäytyy samalla tavalla – silloin voi vain yksi testitapaus riittää Ohjelmistotekniikka Ohjelmistojen testaus, 2015 69(504) Kuluvan ajan minimointi 2/2 • Tilanteesta riippuen testiajojen kestosta tulee tai ei tule projektin pullonkaula • Testausta on tehtävä koko ajan, kun ohjelmistoa kehitetään • Panostettava testitapausten laatuun, ei määrään • Nopeutusta voi yrittää saavuttaa myös automatisoimalla ainakin osan testiajoista – Vaikka automatisointiin jouduttaisiin satsaamaan paljon resursseja, kannattaa se yleensä tilanteissa, joissa samoja testitapauksia ajetaan useamman kerran kuten esim. regressiotestauksessa (esitellään myöhemmin) – Automatisointi voi myös vapauttaa aikaa mm. parempien testitapausten suunnitteluun Ohjelmistotekniikka Ohjelmistojen testaus, 2015 70(504) 3.2 Testitapauksen rakenne ja sisältö OTE 1/3 • Testitapaukseen suoritus jakaantuu yleensä neljään vaiheeseen: – Alustus: testikohde valmistetaan testitapauksen suorittamiselle • Allokoidaan resurssit, alustetaan tietokannat yms. – Suorittaminen: suoritetaan yksi testitapaus testikohteella – Tuloksen evaluointi: verrataan järjestelmän ulostuloja testitapauksen odottamiin tuloksiin ja annetaan tuomio – Puhdistus: vapautetaan alustuksessa varatut resurssit Ohjelmistotekniikka Ohjelmistojen testaus, 2015 71(504) Testitapauksen rakenne ja sisältö 2/3 • Testitapauksen sisältö – kaikkia ei kirjata eksplisiittisesti: – Yksilöivä tunniste (koodi – ei käytetä aina: testikoodissa funktion nimi riittää) – Kuvaava nimi / otsikko – tällä tunnistetaan tapaus pitkissä listauksissa ja testiautomaation testikoodissa – Tyyppi – toiminnallisuustesti tai muu; positiivinen, negatiivinen jne… – Tarkoitus, esim. vaatimus tai käyttötapaus, johon testitapaus liittyy – Formaali jäljitys vaatimukseen tms. tarpeen joskus – Esiehdot – Syötteet – Odotetut tulokset – Jälkiehdot Ohjelmistotekniikka Ohjelmistojen testaus, 2015 72(504) Testitapauksen rakenne ja sisältö 3/3 • Esimerkki pankkiautomaatin testitapauksesta: – – – – – – – – Identiteetti: TT0001 Nimi: Saldokyselyn perustapaus Tyyppi: Toiminnallisuustesti Tarkoitus: Testataan saldokysely-toimintoa perustilanteessa, vaatimus VT0203 Esiehdot: Kortti on syötetty automaattiin, tilillä on 100 € rahaa Syötteet: Painetaan saldokyselynäppäintä Odotetut tulokset: Automaatti näyttää ruudulla summan 100 € Jälkiehdot: Automaatti palaa takaisin päävalikkoon 4,5 – 5,5 s kuluttua Ohjelmistotekniikka Ohjelmistojen testaus, 2015 73(504) 3.3 Muita huomioita testitapauksista • Testitapauksia käytetään lähes kaikenlaisessa testauksessa, pois lukien esim. käytettävyystestaus, jossa terminologia on erilaista • Vaikka testitapausta ei kirjoittaisi ylös, sen logiikka on kuitenkin ohjaamassa testaajaa mm. tutkivassa testauksessa • Joskus testitapauksia suunnitellaan suuri määrä ohjelman määrittelyn perusteella, mutta on vaarana, että ne eivät enää ole valideja, kun toteutus alkaa – Ketterässä kehittämisessä testitapaukset suunnitellaan lähellä toteutusta • Joskus testauksessa vaihteleva data on isommassa roolissa kuin varsinaiset määritetyt testitapaukset • Mallipohjaisessa testauksessa [esitellään luennoilla myöhemmin] ei ole välttämättä "testitapauksia", ainoastaan ohjausta ohjelman suoritukselle Ohjelmistotekniikka Ohjelmistojen testaus, 2015 74(504) 4. Testaus osana ohjelmistoprosessia Ohjelmistotuotanto on paljon muutakin kuin testaamista. Mutta miten testaus liitetään ohjelmistoprosessiin? Tässä kohdassa käydään läpi neljä tärkeää testaustasoa: yksikkö-, integrointi-, järjestelmä- ja hyväksymistestaus. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 75(504) Testaus on oleellinen osa tuotantoprosessia • Kuten edellä on jo todettu, testaus on oleellinen osa ohjelmistojen tuottamista • Testausta ei yleensä voi eikä kannata eristää muusta ohjelmistoprosessista • Nyrkkisäännön mukaan 20% koodista sisältää 80% virheistä, eli testauksen suunnitteluun ja resurssien kohdentamiseen kannattaa satsata – Virheiden kasautuminen ei ole satunnaista, vaan yleensä ne piileskelevät uudessa ja muuttuneessa koodissa sekä kaikista monimutkaisemmissa komponenteissa • Jokainen itseään kunnioittava ohjelmistotuotantoprosessi ottaa kantaa siihen, missä vaiheessa ja mitä testataan Ohjelmistotekniikka Ohjelmistojen testaus, 2015 76(504) Testaus pitää aloittaa nopeasti 1/2 • Koska jopa yli puolet ohjelmistoprojektin resursseista voi kulua testaukseen, virheiden paikallistamiseen ja korjaukseen, voidaan prosessia parantamalla saavuttaa suuria säästöjä – Kuten myös parantamalla testauksessa käytettäviä menetelmiä, työkaluja yms. • Motto: mitä aikaisemmin virheet korjataan, sen parempi • Testata kannattaa heti, kun on jotain testattavaa – Testaamalla toiminnon toteutusta heti, kun siitä on jonkinlainen versio – Aloittamalla testaus heti, kun systeemin jotain osaa kyetään suorittamaan – Esim. kirjoittamalla alustava järjestelmätestaussuunnitelma heti, kun järjestelmän vaatimukset ovat kyllin kypsiä • Yksityiskohdat kannattaa kiinnittää vasta sitten, kun ne tiedetään riittävän varmasti, näin vältytään turhalta työltä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 77(504) Testaus pitää aloittaa nopeasti 2/2 • Testaamalla aikaisin saadaan myös parempi käsitys siitä, mihin suuntaan projekti on menossa – Ensiarvoisen tärkeää tietoa projektin johdolle • Toisaalta, jos testitapaukset suunnitellaan aikaisin, kasvaa sen riski, että ne joudutaan suunnittelemaan vielä uudestaan ennen kuin niitä päästään ajamaan – Jos maali liikkuu, joudutaan tähtäämään uudestaan – Suunnittelu kannattaa tehdä oikeaan aikaan ja oikealla tarkkuustasolla – Ketterässä kehittämisessä testaustakin rakennetaan vaiheittain • Vielä parempi olisi tietenkin jättää virheet tekemättä – Parannetaan ohjelmistoprosessia vähentämään virheitä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 78(504) 4.1 Testaustasot – testauksen V-malli Vaatimusmäärittely Hyväksymistestaus Toiminnallinen määrittely Järjestelmätestaus Arkkitehtuurisuunnittelu Integrointitestaus Moduulisuunnittelu Yksikkötestaus Toteutus testauksen suunnittelu tulosten verifiointi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 79(504) Perinteinen, edelleen oleellinen • Perinteiseen, vesiputousmallia noudattavaan ohjelmistoprosessiin testaus liitetään V-mallin mukaisesti • Kuvaa testauksen "tasot", jotka ovat edelleen relevantteja kaikissa kehittämismalleissa • Vahvassa roolissa "reguloidussa" kehittämisessä, turvallisuuskriittisten järjestelmien kehittämistä koskevissa standardeissa • Kuuluu yleissivistykseen ymmärtää • Käytännössä usein liian jäykkä sovellettavaksi kirjaimellisesti, enemmän usein pedagoginen abstraktion Ohjelmistotekniikka Ohjelmistojen testaus, 2015 80(504) V-mallin logiikka 1/2 • V-mallin vasen sivu kuvaa vesiputousmallia, jossa edetään ylhäältä alas ensin vaatimusmäärittelystä toiminnalliseen määrittelyyn ja siitä arkkitehtuurisuunnitteluun ja lopulta moduulisuunnitteluun ja toteutukseen • Jokaisessa vaiheessa laaditaan testaussuunnitelmat vastaaville testausvaiheille (oikea sivu) • Kun testattavissa olevaa toteutusta alkaa olla olemassa, aletaan sitä testata – Edetään V-mallin oikeaa sivua alhaalta ylös toimien em. testaussuunnitelmien mukaan – Testaus verifioi kullakin tasolla, vastaako toteutus määrittelyä/suunnittelua Ohjelmistotekniikka Ohjelmistojen testaus, 2015 81(504) V-mallin logiikka 2/2 • Käytettävät tekniikat vaihtelevat riippuen siitä, missä vaiheessa ollaan menossa – Esim. testaus alemmilla tasoilla on enemmän "konepellin alla" koodin parissa kuin ylemmillä, jossa enemmän tarkastellaan, miten ohjelma käyttäytyy, olipa sen toteutus tehty miten tahansa • Jäljitettävyys eri vaiheiden välillä helpottaa virheiden alkuperän selvittämistä • Kun virhe on paikallistettu, voidaan testausprosessia yrittää parantaa siten, että ko. tyypin virheet havaitaan aikaisemmin • "Verifiointi ja validointi" ovat tyypillistä turvallisuuskriittisten järjestelmien kehittämisen sanastoa. Seuraavalla sivulla esimerkki sen kulttuurin tyypillisestä kaaviosta. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 82(504) Verifiointi ja validointi V-mallin avulla [Pezzè&Young 07 mukaellen] Validointi Verifiointi Todelliset tarpeet Käyttäjien hyväksymistestaus Toimitettu kokonaisuus Katselmointi Järjestelmätestaus Vaatimusmäärittely Järjestelmän integrointi Analysointi / katselmointi Integration Test Suunnitteluspeksit Analysointi / katselmointi Alijärjestelmä Yksikkötestaus Komponentin suunnittelu Komponentin toteutus Katselmointi käyttäjien kanssa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 83(504) 4.2 Yksikkötestaus OTE • Unit testing, module testing – monta nimeä • Testataan jokainen ohjelman yksikkö erikseen – Yksikkö voi olla moduuli, luokka, prosessi tms. • Yksikkötestaus on yleensä osa yksikön toteutusvaihetta – Yksikön koodaaja testaa oman toteutuksensa • Yleensä tieto virheistä jää vain toteuttajalle – Koska virheillä on tapana kasautua, voitaisiin tämän tiedon avulla kohdistaa testausta paremmin – Toisaalta ohjelmoijat voivat osoittaa testaajille järjestelmän vaikeat kohdat muutenkin – Mitä pikemmin yksikön toteutus testataan, sen parempi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 84(504) Osa-alueita • Yksikkötestauksen osa-alueet: – – – – Rajapinnat – tärkeintä kaikenlaisille yksiköille Raja-arvot – logiikka, muuttujat Virhetilanteiden käsittely Tietorakenteet (ajattele vaikka API:a, joka toteuttaa jonkinlaisen puurakenteen) – Suorituspolut ja silmukat – käydäänkö kaikilla poluilla oikein, loppuuko silmukka oikein • Testaus tapahtuu useimmiten lähdekooditasolla – halutaan "varmistaa", että kaikki koodi toimii hyvin • Yleensä suositaan rajapintoja keskeisenä kohteen, koska se on suhteellisen stabiili ja toimii turvaverkkona toteutusta refaktoroidessa. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 85(504) Rajapintojen testaaminen 1/2 • Rajapinta koostuu yleensä funktioista, joiden parametreja ja paluuarvoja käytetään tiedonvälitykseen • Rajapintojen toimivuus on yleensä syytä testata ensimmäiseksi – Ne määrittävät yksikön toiminnan ulospäin – Jos rajapinnat eivät toimi, voi muiden testien suorittaminen olla hankalaa ellei jopa mahdotonta – Kun koodia kehitellään, rajapinta voi pysyä samana, mutta toteutus muuttuu – rajapintatestejä ei tarvitse muuttaa • Näihin liittyviä ongelmia: – – – – Parametrien määrä ja järjestys Parametrien ja paluuarvojen tyypit Muutetaanko sellaisen parametrin arvoa, jonka arvoa ei saisi muuttaa? Onko globaali data määritelty yhtenevästi kaikkialla ohjelmassa? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 86(504) Rajapintojen testaaminen 2/2 • Käytettävästä ohjelmointikielestä riippuen hyvä kääntäjä huomaa suurimman osan em. virheistä – Valitettavasti nykyään niin suositut dynaamiset skriptikielet ovat tässä suhteessa huonossa asemassa • Kääntäjä ei sen sijaan yleensä pysty huomaamaan sitä, tulkitseeko sekä kutsuja että kutsuttava parametrin/paluuarvon samalla tavalla – Esim. toinen luulee arvon tarkoittavan senttejä ja toinen tuumia (tämän kaltaisen virheen takia NASA on menettänyt yhden avaruusluotaimen) “NASA lost a $125 million Mars orbiter because a Lockheed Martin engineering team used English units of measurement while the agency's team used the more conventional metric system for a key spacecraft operation, according to a review finding released Thursday.” – “Metric mishap caused loss of NASA orbiter”, CNN, September 30, 1999 Ohjelmistotekniikka Ohjelmistojen testaus, 2015 87(504) Raja-arvojen testaaminen • Muistilista: – Parametrien ja paluuarvojen raja-arvot – Silmukoiden pyörimiskertojen raja-arvot – Tietorakenteisiin liittyvät raja-arvot • Esim. kasvaako ja pieneneekö dynaaminen tietorakenne oikein silloin kun muistia todella varataan tai vapautetaan • Raja-arvo- analyysiä käsitellään myöhemmin tarkemmin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 88(504) Virhetilanteiden testaaminen 1/2 • • OTE Virhetilanteiden käsittely jää usein vähälle huomiolle ohjelman suunnittelussa Valitettavasti myös virhetilanteiden testaaminen on silloin yleensä lapsipuolen asemassa – Vaikka ohjelma muuten olisikin suunniteltu testausystävälliseksi, virheidenkäsittely ei välttämättä ole sitä • Tuloksena – Ohjelma, joka ei hallitse pieniäkään häiriöitä – Ohjelman antamat virheilmoitukset voivat olla käyttäjän kannalta täysin hyödyttömiä tai jopa harhaanjohtavia • Huonosti tehty virheenkäsittely voi vaarantaa myös tietoturvan Ohjelmistotekniikka Ohjelmistojen testaus, 2015 89(504) Virhetilanteiden testaaminen 2/2 • Virhetilanteiden testauksen muistilista: – Onko virheenkäsittely tehty oikein? • Onko virheestä toipuminen mahdollista? – jos ei, kaadetaanko ohjelma käyttäjäystävällisesti? – Onko virheenkäsittely tehty siten, että käsittelyyn ylipäänsä päästään vai kaatuuko ohjelma jo ennen sitä? – Heitetäänkö oikea poikkeus? – Onko virheilmoitus ymmärrettävä? – Vastaako virheilmoitus tapahtunutta virhettä? – Auttaako virheilmoitus käyttäjää paikallistamaan virheen syyn ja pääsemään eteenpäin? – Ovatko virheilmoitukset yhtenevät kaikissa yksiköissä? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 90(504) Tietorakenteiden testaaminen 1/2 • Yksikön toteuttamat (lokaalit) tietorakenteet ovat virheherkkiä • Myös yksikön käyttämien, jossain muualla toteutettujen tietorakenteiden vaikutukset, tulisi testata yksikön testauksen yhteydessä – – – – – Tyyppivirheet Oletusarvojen alustukset Muuttujien nimien oikeinkirjoitus Tietotyyppejä käytetään yhtenevästi Yli- ja alivuodot, poikkeukset • Hyvä kääntäjä huomaa jälleen ainakin osan näistä virheistä • Tietorakenteisiin kannattaa kiinnittää huomiota myös koodin tarkastuksissa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 91(504) Tietorakenteiden testaaminen 2/2 • Testaus usein rajapintojen testauksen "sivutuotteena": – Funktion testaus jollain syötteellä. Toimiiko se oikein? – Sitten: onko tietorakenteet päivitetty tai purettu kuten pitää. • Aina kun on mahdollista, kannattaa käyttää valmiita, hyvin testattuja tietorakenteita – Kielten ja ympäristöjen vakiokirjastot turvallisimpia – Esim. C++:n Standard Template Library (STL), see http://en.wikipedia.org/wiki/Standard_Template_Library Ohjelmistotekniikka Ohjelmistojen testaus, 2015 92(504) OTE Suorituspolku- ja silmukkatestaus 1/3 • Koodin haarautumiskohdat ovat virheherkkiä – Ehtolauseet, silmukat, hypyt • Testitapauksia kannattaa valita sen mukaan, että mahdollisimman monta kriittistä suorituspolkua yksikön läpi tulee testattua – Valitaan esim. funktion syötteeksi sellaisia arvoja, että silmukoita tulee kierrettyä eri tavoilla • Testattavien suorituspolkujen joukkoon kannattaa valita erityisesti niitä, joissa voisi todennäköisesti syntyä virhetilanne (esim. syötteen arvosta riippuen) • Silmukoita testattaessa kannattaa erottaa toisistaan yksinkertaiset, sisäkkäiset ja peräkkäiset silmukat • Myöhemmin tutustutaan tekniikoihin, joilla yksinkertaisia silmukoita voidaan testata – Esim. testitapaukset keskittyvät silmukkamuuttujan raja-arvoihin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 93(504) Suorituspolku- ja silmukkatestaus 2/3 • Nämä tekniikat yleistyvät myös sisäkkäisiin silmukoihin – Ongelma on tarvittavien testitapausten määrän nopea kasvu sisäkkäisyyden kasvaessa – Sisäkkäisten silmukoiden testaukseen on kehitetty strategioita, joilla pyritään pitämään testitapausten määrä kohtuullisena • Esim. testataan sisäkkäisin silmukka ensin täydellisesti pitäen ulompien silmukoiden silmukkamuuttujat minimiarvoissaan, sitten toiseksi sisäkkäisin jne. • Peräkkäiset silmukat voivat olla joko riippumattomia tai riippuvaisia toisistaan – Riippuvuus syntyy esim. tilanteesta, jossa jälkimmäisen silmukkamuuttujan arvo alustetaan käyttäen ensimmäisen silmukkamuuttujan arvoa (usein myös ongelmia koodissa…) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 94(504) Suorituspolku- ja silmukkatestaus 3/3 • Toisistaan riippuvien silmukoiden testaamiseen voidaan käyttää soveltaen sisäkkäisten silmukoiden testaukseen kehitettyjä heuristiikkoja • Riippumattomien silmukoiden testaus palautuu yksinkertaisten silmukoiden testaamiseen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 95(504) Yksikkötestauksen toteuttaminen 1/4 • Lyhyitä selkeitä testifunktioita ja niissä yksinkertaisia tarkistuksia – Testikehyksen määrittelemät ”älykkäät” assertiot (xUnittyökaluissa paljon erilaisia), jotka tuottavat raportoinnin. Kielten omia assertteja ei pidä käyttää testauksessa – usein ne keskeyttäväkin testiajon, mikä ei ole järkevää. – Assertteja ei laiteta tuotantokoodiin, vaan sitä testaavaan testikoodiin (tuotantokoodissa ne eivät ole testausta, vaan sekaisin menneen ohjelman keskeyttämistä varten) – … alla pseudokoodia TEST_TYPE test_square_root() { double result = my_sqrt(x); ASSERT_TRUE((result * result) == x); // Huom. Pieni bugi testikoodissa (mikä?) – yksinkertaistuksen vuoksi… } Ohjelmistotekniikka Ohjelmistojen testaus, 2015 96(504) Yksikkötestauksen toteuttaminen 2/4 • Koska yksiköt eivät yleensä voi toimia itsenäisesti, vaatii niiden testaaminen apukoodin kirjoittamista, jota käytetään vain testauksessa – Vaikkapa rutiineja, jotka palauttavat mukamas netistä luetun tiedoston sisällön • Testikoodi on koodia siinä missä testattavakin koodi – Se on tehtävä ja dokumentoitava vähintään yhtä huolellisesti – Myös testikoodia on testattava ja ylläpidettävä – Englanninkielinen termi ”scaffolding” eli rakennusteline kuvaa hyvin testikoodin suhdetta testattavaan koodiin • Testikoodi "ympäröi" tuotantokoodia, heijastellen sen rakennetta (AddBalance(amount) <> testAddBalance()) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 97(504) Yksikkötestauksen toteuttaminen 3/4 • Tärkeitä yksikkötestauksen toteuttamiseen liittyviä käsitteitä ovat ajuri ja tynkä (testikehyksen ohella) • Ajuri (driver, test bed) – Ohjelma, joka ottaa syötteenään testitapaukseen liittyvää dataa ja syöttää datan testattavalle yksikölle – Huolehtii yksikön tuottamien tulosten keräämisestä ja niiden välittämisestä edelleen analysoitavaksi – Kannattaa suunnitella siten, että sitä voidaan käyttää usean eri yksikön testaamiseen – Kannattaa suunnitella rinnan testattavan yksikön kanssa – Ongelmat ajurin suunnittelussa voivat paljastaa virheitä testattavan yksikön suunnittelussa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 98(504) Yksikkötestauksen toteuttaminen 4/4 • Tynkä (stub) – Korvaa testattavan yksikön kutsuman toisen yksikön • Jokaista kutsuttavaa yksikköä varten tarvitaan oma tynkänsä – Tyngän tehtävät: • Toteuttaa tarvittavat rajapinnat • Palauttaa kontrollin testattavaan yksikköön • Käsittelee mahdollisimman vähän saamiaan syötteitä • Palauttaa vain simuloidun arvon tai vaikka heittää poikkeuksen – Tulisi suunnitella siten, että se olisi mahdollisimman helppo toteuttaa – Merkitys korostuu erityisesti virhetilanteita testattaessa • Virhetilanteiden generoiminen on työlästä ja niiden systemaattinen etsiminen on erittäin vaikeaa • Tarkoitusta varten suunnitellun tyngän avulla haluttu virhetilanne saadaan aikaan helposti Ohjelmistotekniikka Ohjelmistojen testaus, 2015 99(504) Huomioita olio-ohjelmien yksikkötestauksesta • • Melkein kaikki ohjelmat ovat nykyään olio-ohjelmia. Niiden testaukseen liittyy monia seikkoja, joita on hyvä erityisesti tiedostaa ja ottaa huomioon. Tällaisia ovat: – Olion käyttäytyminen riippuu sen tilasta – Oliot kätkevät dataa ja kätkettyä dataa on paljastettava testauksessa – Yksityisten metodien erityinen testaaminen voi joissakin kielissä olla haastavaa – sen kanssa pitää vain elää – On hyvä miettiä luokkien tulevaa käyttöä ja sitä, miltä osin kanta- ja lapsiluokat kannattaa testata – Ja millaiset testitoteutukset tehdään abstrakteille luokille – Rakentajien ja niiden mahdollisten ongelmien hyvä testaus on erityisen tärkeää (siksikin, että rakentajissa ei aina voi heittää poikkeuksia) • Kurssilla näitä asioita ei ole mahdollista tarkastella perusteellisesti, mutta suosittelemme tähän erilliseen kalvosarjaan tutustumista: – http://www.cs.tut.fi/~testaus/s2015/luennot/Olio-ohjelmien_testauksesta.pdf Ohjelmistotekniikka Ohjelmistojen testaus, 2015 100(504) OTE Top 8 pointit yksikkötestaukseen • Mieti, mikä on metodille kaikkein tärkeintä – Miten sitä käytetään (kuka, missä olosuhteissa), millä parametreilla sitä kutsutaan • Keskity rajapintaan – se on stabiili, mutta toteutus voi muuttua • Testaa kaikkein yleisimmät tapaukset • Tee metodista robusti – Testaa yleisimmät virhe- ja poikkeustilanteet – Testaa kaikki raja-arvot – Testaa parametrien kombinaatiot • Ole luova – niin ovat metodin kutsujatkin • Seuraa testikattavuutta, mutta muista, että se ei usein kerro paljoakaan testauksen todellisesta kattavuudesta • Tee testeistä niin yksinkertaisia kuin mahdollista • Käytä testikehystä, kuten JUnit tai QTest ja noudata sen käytäntöjä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 101(504) xUnit-testauskehykset 1/2 • Yksikkötestauksessa kannattaa käyttää valmiita testauskehyksiä, koska: – Ne perustuvat yleisesti käytettyihin (eli monille tuttuihin) hyviin tapoihin rakentaa testejä. – Sellaisia löytyy valmiina monille kielille ja usein ilmaisina, avoimen lähdekoodin ohjelmina. – "xUnit-perheeseen" kuuluu useita hieman erilaisia kehyksiä eri ohjelmointikielille jne. – Lisätietoja xUnit-ohjelmista: http://en.wikipedia.org/wiki/XUnit – Yksi ensimmäisistä ja suosituimmista on JUnit, testikehys Javaohjelmien yksikkötestaukseen – Myös Qt:n QTest noudattaa näitä periaatteita Ohjelmistotekniikka Ohjelmistojen testaus, 2015 102(504) xUnit-testauskehykset 2/2 • Periaate: – Useita suunnittelumalleja (design patterns) hyödyntämällä tehty testikehys, jossa testejä tai testijoukkoja kuvataan olioilla – Testitapausten strukturointi ja työkalut niiden ajamiseen – Testitapauksilla tietty rakenne – setUp, suoritus, tearDown – Testitapauksia yhdistetään kokoelmiin, suitet, suoritusta varten • Edut: – Valmiita toimintoja testitapausten ajamiseen, tarkistuksiin ja tuloksista raportointiin – Määrämuotoiset testitapaukset helpottavat testien ylläpitoa – Voidaan käyttää myös integrointitestauksen apuna – Moni työkalu tuottaa esim. JUnit-yhteensopivia testejä tai raportteja Junit:n tulosformaatissa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 103(504) 4.3 Test-Driven Development • Perinteinen yksikkötestauksen tapa on ongelmallinen – Yksikkötestejä tehdään satunnaisesti, jos on aikaa – Eli käytännössä niitä ei tehdä lainkaan tai vain joillekin luokille ja metodeille • TDD:n tapa – Yksikkötestaus on rutiinia – Kun uutta metodia suunnitellaan, sille tehdään yksikkötestit jo ennen metodin toteutusta – Testien läpäisy kertoo koodauksen edistymisestä – Tuloksena on tasalaatuinen joukko yksikkötestejä, jotka ovat turvaverkko koodia kehiteltäessä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 104(504) TDD pähkinänkuoressa • Kirjoita testi toiminnallisuudelle perustuen sen rajapintaan ja parametreihin • Aja testi ja tarkista, että se failaa – koska toteutusta ei vielä ole • Koodaa toteutus • Aja testi(t) ja tarkista, että ne menevät läpi • Testit on integroitu kehitysympäristöön ja ajetaan aina käännettäessä • Siisti toteutus (refaktorointi) • Automatisoidut testit ovat nyt turvaverkko toteutuksen muutoksille Ohjelmistotekniikka Ohjelmistojen testaus, 2015 105(504) Vaatimukset TDD:n käytölle • Halukkuus tehdä yksikkötestejä • Kehitysympäristö, jossa yksikkötestien rungon tekeminen metodeille on mahdollisimman helppoa (eli nykyaikainen IDEympäristö, jossa työkalut valmiina tai jonkun xUnitin voi integroida) • Paikalliseen buildaukseen integroitu testien ajo • Nopea kehitysympäristö, jossa testien ajo on välitöntä • Uusi kehitys: "jatkuva kääntäminen" ja jatkuva yksikkötestien suoritus – viiveet vähenevät, palaute välitöntä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 106(504) TDD:n vaikutus laadulle • Plussaa – Pakottaa tekemään yksikkötestejä • Ei välttämättä plussaa – Koetaan kuitenkin enemmän suunnittelu- kuin testausmenetelmäksi (käyttäytymisen määrittely on pääosassa) – testaus kaipaa mindsettiä, jossa ei olla suunnittelemassa – Ei ole näyttöä, että tuottaisi parempaa yksikkötestausta kuin muut yksikkötestauskäytännöt – Liiallinen systematisointi ei välttämättä ole hyvä kokonaisuudelle Ohjelmistotekniikka Ohjelmistojen testaus, 2015 107(504) 4.4 Testitapausten suunnittelutekniikoita • Testitapausten suunnitteluun on kehitetty erityisiä tekniikoita. Niitä hyödynnetään kaikilla testaustasolla, mutta eniten yksikkötestauksessa. • Käydään siksi nyt läpi tärkeimmät tekniikat. • Menetelmät tuovat sopivaa systematiikkaa testisuunnitteluun. • Käytännössä menetelmiä sovelletaan yhdessä ja ne tukevat testitapauksia suunnittelevan henkilön ajattelua. • Ne kuvaavatkin oikeastaan ajattelumalleja. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 108(504) OTE 4.5 Ekvivalenssiositus-menetelmä 1/5 • Minimoidaan tarvittavien testitapausten määrää osittamalla ohjelman syöteavaruus ekvivalenssiluokkiin, joille pätee että – Kun jokin luokan edustaja aiheuttaa häiriön, myös mikä tahansa muu ko. luokan edustaja aiheuttaa saman häiriön – Kun jokin luokan edustaja ei aiheuta häiriötä, ei mikään muukaan ko. luokan edustaja aiheuta häiriötä • Siis: ohjelman voidaan olettaa toimivan samoilla tietyn alueen syötteillä • Koko syötedomainin testaamisen sijasta luotetaan siis siihen, että voidaan valita yksi siitä edustaja Ohjelmistotekniikka Ohjelmistojen testaus, 2015 109(504) Ekvivalenssiositus-menetelmä 2/5 • Ekvivalenssiluokkien tunnistaminen – Valitaan jokin syöteavaruuden ehto, ja jaetaan se kahteen tai useampaan luokkaan – Lähtökohtana jako sallittuihin ja ei-sallittuhin – Esim., jos kentässä pyydetään positiivista kokonaislukua, on yksi iso luokka positiiviset kokonaisluvut ja toinen luokka negatiiviset – Positiivisia voidaan sitten jaotella erikseen useisiin luokkiin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 110(504) Ekvivalenssiositus-menetelmä 3/5 • Muutamia suuntaviivoja ekvivalenssiluokkien valintaan: – Jos syöteavaruuden ehto määrittelee välin laillisia arvoja tyyliin ”kappalemäärä on väliltä 1-999”, synnytetään kolme ekvivalenssiluokkaa: (1 ≤ kpl ≤ 999), (kpl < 1) ja (999 < kpl) – Jos ehto määrittelee arvojen lukumäärän tyyliin ”ajoneuvolla voi olla yhdestä kuuteen omistajaa”, synnytetään yksi luokka vastaamaan laillisia arvoja ja kaksi luokkaa vastaamaan laittomia arvoja ”ei omistajaa” ja ”enemmän kuin kuusi omistajaa” Ohjelmistotekniikka Ohjelmistojen testaus, 2015 111(504) Ekvivalenssiositus-menetelmä 4/5 – Mikäli ehto määrittelee joukon arvoja, joiden käsittelyn voi olettaa olevan erilainen, synnytetään jokaista arvoa kohti oma luokkansa sekä yksi luokka vastaamaan laitonta arvoa • Esim. ”ajoneuvo voi olla joka linja-auto, rekka, henkilöauto tai moottoripyörä” synnyttää neljä laillisia arvoja vastaavaa luokkaa sekä luokan, joka vastaa laittomia arvoja esim. ”perävaunu” tai ”muut ajoneuvot” – Mikäli kyseessä on ehdoton vaatimus tyyliin ”ensimmäisen kirjaimen pitää olla iso kirjain”, luodaan kaksi luokkaa, toinen vastaamaan laillista arvoa ”iso alkukirjain” ja toinen laitonta arvoa ”pieni alkukirjain” – Mikäli on syytä epäillä, että kaikkia ekvivalenssiluokan edustajia ei käsitellä ohjelmassa samalla tavalla, pitää luokka jakaa edelleen niin moneen pienempää luokkaan kuin tarpeellista Ohjelmistotekniikka Ohjelmistojen testaus, 2015 112(504) Ekvivalenssiositus-menetelmä 5/5 • Kun jako luokkiin on tehty, luokkien edustajista luodaan testitapauksia • Laittomien testitapausten pitäisi testata vain yhtä laitonta ekvivalenssiluokkaa kerrallaan • Kun testataan montaa muuttujaa, voidaan luoda kaikkien ekvivalenssiluokkien, sekä laillisten että laittomien, kaikkia kombinaatioita vastaavat testitapaukset – Tuloksena kattavampi testaus, mutta hintana paljon suurempi määrä testitapauksia, joiden ajamiseen voi kulua liikaa aikaa – Testitapausten ohjelmallinen generointi tällöin hyödyllistä (kuvittele kombinaatioiden taulukko, josta testit tehdään) • Ekvivalenssiluokkien käyttökelpoisuus ei rajoitu ainoastaan syötteisiin, vaan tekniikkaa voidaan käyttää myös lähtien tulosten arvoalueista Ohjelmistotekniikka Ohjelmistojen testaus, 2015 113(504) 4.6 Raja-arvoanalyysi 1/3 • Kokemus on osoittanut, että ohjelmoijat tekevät helposti virheitä muuttujien ja parametrien arvoalueiden (esim. ekvivalenssiluokkien) rajoilla – Esim. käytetään operaattorin ≤ sijasta operaattoria < tai silmukkamuuttujan alkuarvo on ”off by one” • Silmukassa saatetaan pyöriä yksi kerta liian vähän • Joukosta parametreja valitaan tyypillisesti kerralla yksi, jonka raja-arvoja testataan, muiden parametrien arvojen ollessa ”normaaleja” (nominal) eli tiukasti arvoalueen (esim. ekvivalenssiluokan) sisällä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 114(504) Raja-arvoanalyysi 2/3 • Valitaan: – Parametrin laillisen arvoalueen minimiä (min) ja maksimia (max) vastaavat tapaukset – Hieman pienempi kuin minimi (min-) ja hieman suurempi kuin maksimi (max+) – Jos parametrilla on useita laillisia arvoalueita (ekvivalenssiluokkia), valitaan tapaukset niiden kaikkien rajoilta • Raja-arvoanalyysi toimii parhaiten silloin, kun tarkasteltavana on joukko parametreja, joilla ei ole keskinäisiä riippuvuussuhteita ja jotka kuvaavat esim. lukumääriä tai fyysisiä suureita kuten lämpötilaa, painetta, nopeutta, painoa jne. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 115(504) OTE Raja-arvoanalyysi 3/3 • Esim. totuusarvoiselle tai loogista arvoa kuvaavalle parametrille ei yleensä voi eikä kannata tehdä rajaarvoanalyysiä • Esimerkki fyysisten suureiden tärkeydestä: – Kesäkuussa 1992 Phoenixin kansainvälinen lentokenttä jouduttiin sulkemaan kun lentäjät eivät voineet tehdä tiettyjä säätötoimenpiteitä; instrumentit hyväksyivät korkeimmaksi mahdolliseksi ilman lämpötilaksi 120 °F lämpötilan ollessa 122 °F (≈ 50 °C) • Myös oletus riippumattomuudesta on tärkeä; mikäli näin ei voida olettaa, voivat tulokset jäädä laihoiksi • Muuttujien arvoalueiden reunojen testaaminen ei yleensä ole järkevää (esim. kokonaislukumuuttujaan mahtuva suurin arvo) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 116(504) Funktion tulosten ja muuttujien arvoalueiden hyödyntäminen • Näitä menetelmiä ei kannata käyttää pelkästään syötelähtöisesti • Virheitä löydetään myös käyttämällä niitä tulosten ja ohjelman käyttämien muuttujien arvoalueiden kanssa • Esimerkiksi: – Jos tiedetään, että tuloksen arvo on väliltä 1..100 niin testataan syötteillä, joiden pitäisi tuottaa tulokset 1 ja 100 – Jos silmukka voi pyöriä ympäri nollasta kymmeneen kertaan, testataan syötteillä, joiden pitäisi saada se pyörimään 0 ja 10 kertaa – Testataan syötteillä joiden pitäisi tuottaa virheilmoituksia Ohjelmistotekniikka Ohjelmistojen testaus, 2015 117(504) Worst case -testaus • Pitäisikö kaikki mahdolliset kombinaatiot raja-arvoista testata? • Kun kaikkien parametrien raja-arvoista (min, min-, nominal, max, max+) arvoista otetaan karteesinen tulo, saadaan n aikaiseksi 5 testitapausta • Raja-arvoanalyysin perusversion tuottamat testitapaukset ovat luonnollisesti tämän osajoukko • Testitapausten suuresta määrästä johtuen worst case testaus kannattaa yleensä vain mikäli vaaditaan korkeaa luotettavuutta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 118(504) 4.7 Kombinaatioiden testauksesta 1/7 • Mikäli halutaan testata kaikki mahdolliset ekvivalenssiluokkien kombinaatiot, kasvaa testitapausten määrä helposti liian suureksi • Toinen vaihtoehto olisi testata siten, että jokainen luokka tulee testattua vain vähintään kerran – Valitettavasti tämä ei ole kovin tehokasta virheiden löytymisen kannalta • Näiden kahden ääripään väliin jää käyttökelpoinen vaihtoehto: sen sijaan, että pyrittäisiin kattamaan kaikki mahdolliset kombinaatiot, katetaankin kaikki luokista muodostuvat parit tai kolmikot Ohjelmistotekniikka Ohjelmistojen testaus, 2015 119(504) Kombinaatioiden testauksesta 2/7 • Esimerkki tarkoituksena testata kuvitteellista WWW-sivustoa erilaisissa ympäristöissä: – – – – Kielet: suomi, englanti, ranska, espanja Selaimet: IE, Firefox, Chrome, Opera Fonttikoot: small, medium, huge Näytön koko: small_laptop, family_desktop, huge • (Detaljit on tässä abstrahoitu, koska ne muuttuvat joka vuosi) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 120(504) Kombinaatioiden testauksesta 3/7 • Jos halutaan kattaa kaikki mahdolliset kombinaatiot, tarvitaan 144 (4 * 4 * 3 * 3) testitapausta – Mikäli esim. tekstin luettavuutta ruudulla arvioimaan tarvitaan ihminen, on tämä aivan liian paljon • Mikäli tyydytään kokeilemaan vain jokaista vaihtoehtoa kerran, tarvitaan vain neljä testitapausta – Vaikka testitapaukset valittaisiinkin hyvin, jää testaus kovin ylimalkaiseksi • Mikäli järjestelmään lisättäisiin uusia parametreja, esim. nettiyhteyden nopeus testitapausten määrä kasvaisi eksponentiaalisesti, jos se haluttaisiin testata eri kombinaatioilla. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 121(504) Kombinaatioiden testauksesta 4/7 • Kultainen keskitie: katetaan kaikki mahdolliset parit (parikattavuus) – Kaikkien kombinaatioiden testauksessa tarvitaan jokaista kombinaatiota kohti oma testitapauksensa – Nyt esim. testitapaus {suomi, IE, small_font, small_laptop} kattaa useamman kuin yhden parin: (suomi, IE), (IE_small_laptop) jne. – Kaikki parit pystytään esimerkkitapauksessa kattamaan 19 testitapauksella, jotka on listattu seuraavalla sivulla – Listau tehty AllPairs-ohjelmalla (http://www.satisfice.com/tools/pairs.zip) • Merkintä ”~” tarkoittaa, että valinnalla ei ole parikattavuuden kannalta väliä • Pienin mahdollinen ratkaisu sisältäisi 16 testitapausta, joten AllPairs pääsee melko lähelle Ohjelmistotekniikka Ohjelmistojen testaus, 2015 122(504) Kombinaatioiden testauksesta 5/7 Ohjelmistotekniikka Ohjelmistojen testaus, 2015 123(504) Kombinaatioiden testauksesta 6/7 • Kattamalla parien sijaan kaikki mahdolliset kolmikot saadaan kattavampi testaus, mutta testitapausten määrä pysyy silti useimmiten kohtuullisena • Koska parien tai kolmikkojen generointi voi olla kovin työlästä, on niiden etsimiseen kehitetty joukko algoritmeja ja työkaluja • Aiheesta kertovan Pairwise Testing -sivuston Tools-sivulla on listattu monia työkalua edellä käytetyn AllPairsin lisäksi. – http://pairwise.org/tools.asp Ohjelmistotekniikka Ohjelmistojen testaus, 2015 124(504) Kombinaatioiden testauksesta 7/7 • Mikäli jokin tärkeä kombinaatio puuttuu 100 % parikattavasta testitapausten joukosta, kannattaa se siihen lisätä, vaikka se ei enää lisäisikään parikattavuutta • Toisaalta, mikäli kombinaatioille on rajoituksia, tyyliin värivaihtoehto ”monochrome” on laillinen vain kun näytön koko on ”PDA”, voidaan ensin tuottaa kaikki parit ja poistaa sitten laittomat vaihtoehdot – Koska poistettu vaihtoehto saattoi edustaa laillisiakin pareja, täytyy mahdollisesti lisätä uusia testitapauksia kattamaan tällaiset parit Ohjelmistotekniikka Ohjelmistojen testaus, 2015 125(504) 4.8 Fuzz-testaus 1/3 • Tehdään käytettyihin tiedostoihin erilaisia virheitä ja katsotaan, miten ohjelma selviää tiedostojen kanssa. – Virheet pitää käsitellä hallitusti, ei saa kaatua. – Virheitä voidaan tehdä eri tyyleillä – satunnaisesti korruptoiden ("dumb fuzzing") tai vaikka generoimalla erilaisia XML-tiedostoja. • Mm. Microsoft tekee tätä (Ks. MS:n kirja The Security Development Lifecycle) • Tunnettu suomalainen ohjelma Radamsa (https://www.ee.oulu.fi/research/ouspg/Radamsa) – Avoin lähdekoodi. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 126(504) Fuzz-testaus 2/3 • MS:n mukaan dumb fuzzing -tapoja ovat mm.: – – – – – Tehdään tiedostosta normaalia lyhyempi. Täytetään koko tiedosto satunnaisella datalla. Täytetään osia tiedostosta tiedosto satunnaisella datalla. Etsitään 0-tavuja ja korvataan ne ei-nollilla. Vaihdetaan numerot negatiivisiksi. Asetetaan numeroita nolliksi. Muutetaan numerot arvoon 2^N +/- 1. – Vaihdetaan peräkkäisiä tavuja keskenään. – Asetetaan tai tyhjennetään numeroiden ylimmät bitit. Tehdään OR/XOR-muunnoksia biteille. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 127(504) Fuzz-testaus 3/3 • Kuvatiedostoille esim.: – Virheellinen värisyvyystieto, otsikkotietojen muunnoksia, leveyden ja korkeuden asetus nollaksi jne… • Verkkoliikenteelle: – Viallisia paketteja. Viallisia HTTP-otsikkotietoja. Jne… – Pakettien muuttaminen lennossa proxyllä. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 128(504) 4.9 Matalan tason integrointitestaus OTE • Integrointitestausta voidaan tehdä usealla tasolla. Tarkastelemme ensin "tavallista" matalan tason integrointitestausta ja myöhemmin järjestelmäintegrointitestausta. • Yksikkötestauksen jälkeen yksiköt integroidaan isommiksi kokonaisuuksiksi. • Integrointitestauksessa testataan yksiköiden rajapintoja ja niiden yhteistoimintaa. • Hyödynnetään mahdollisuuksien mukaan testiautomaatiota. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 129(504) Suurin osa integroinnista tapahtuu joOTE kehittäjän työasemassa • Nykyaikaisessa ohjelmistokehityksessä ohjelmistokehittäjillä on versionhallinnan kautta koko ohjelma käytettävissä. – Siinä tilassa, jossa kaikki muut ovat palauttaneet tuotoksensa yhteiseksi. • Omaa koodia kehitetään kokonaisuuden puitteissa. • Kehittäjän tekemä testaus kohdistuu omaan tuotokseen, mutta samalla tarkistetaan, että koko ohjelma kääntyy ja ainakin käynnistyy. • Itse siis integroidaan oma uusi koodi kokonaisuuteen ja kokeillaan yksikkötesteillä, että se toimii. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 130(504) Miksi tarvitaan erityinen integrointitestaus 1/3 • Kootaan kaikkien luovuttamat, erikseen toimivat koodit ja rakennetaan yhteinen buildi. • Ajamalla yksikkötestit ja muutakin saadaan kuva kokonaisuuden testauksesta ja eri komponenttien kypsyydestä. – Voidaan jakaa se tieto intranetissä, webissä tai vaikka tiimin seinällä "radiaattorissa". • Kehittäjien pitää saada keskittyä omaan työnsä kohteeseen ja suorittaa sille nopeita testejä. • Kokonaisuuden testaamiseen voidaan antaa erityinen panostus ja rakentaa luovasti uusia testejä. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 131(504) Miksi tarvitaan erityinen integrointitestaus 2/3 • Voidaan ajaa monenlaisia testejä – – – – Yksikkötestit uudelleen integrointiympäristössä Voidaan korvata tynkiä ja kirjastoja toisilla. Voidaan ajaa pidempiä testejä, myös käyttöliittymän läpi. Ajetaan sellaisia prosessin vaatimia testejä, jotka ovat pakollisia (savutestit ennen järjestelmätestejä, turvallisuusstandardien edellyttämät testit) – Testit, joilta vaaditaan, että ne tekee joku muu kuin kehittäjä. • Voidaan tehdä muutakin – Voidaan tehdä aikaa vieviä koodin analyysejä (staattinen analyysi, arkkitehtuurin tarkastus, kiellettyjen APIen käytön tarkastus, mutkikkuusmittaukset). Ohjelmistotekniikka Ohjelmistojen testaus, 2015 132(504) Miksi tarvitaan erityinen integrointitestaus 3/3 • Integrointitestauksella mitataan projektin edistymistä ja tuotteen kypsymistä • Testien tuloksena jokin buildi voidaan todeta niin stabiiliksi, että sitä voidaan käyttää laajemmin – Muissa projekteissa, asiakkaan testeissä jne… Ohjelmistotekniikka Ohjelmistojen testaus, 2015 133(504) Integroinnin rytmi • Historiallisesti integrointia on tehty vaikkapa kerran viikossa. Kehittäjät lähettävät tuotoksensa ja joku yrittää laittaa ne yhteen. – Jo ennen internet-aikaa… 1990-luvulla. • Päivittäiseen rytmiin ("nightly build") päästiin 2000-luvun alussa. • 2000-luvun alussa ajateltiin, että miksei integrointia voisi tehdä koko ajan. – – – – Pienissä palasissa se on helpointa. Ongelmat saadaan heti kiinni. Testejä voidaan pyörittää jatkuvasti. Alkoi jatkuvan integroinnin aika – CI. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 134(504) Jatkuva integrointi (CI) 1/2 • Kun kehittäjä saa aikaan pienen palan toimivaa koodia (yksikkötestattuna), se integroidaan "heti" kokonaisuuteen. • Se tapahtuu palvelimella, joka huomaa versionhallintaan tulleen uutta koodia, lataa sen, tekee buildin ja ajaa integrointitestit – ja kaikki muut testit, mitä halutaan. • Jokaisella kehittäjällä on versionhallinnan kautta käytössä kaikki koodit, joten "esi-integrointia" tehdään paljon ja siksi integrointi palvelimella on helppoa. • Hyödyt laadulle: – Pienissä paloissa tehdyt muutokset ovat selkeitä: jos jokin ei toimi, syy on helppo korjata. – Ohjelma on koko ajan suurimmalta osin stabiili ja kunnossa. – Kehittäjät saavat nopeaa palautetta integrointitestauksesta. – Eri osapuolten tekemiset eivät mene epäsynkroniin. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 135(504) Jatkuva integrointi (CI) 2/2 • Hyöty testaukselle: – Jatkuva testaus. Nopea palaute. – Voidaan ajaa kaikenlaisia automatisoituja testejä. – Voidaan seurata koko ajan kokonaisuuden kehittymistä – mitkä komponentit toimivat, missä on vikoja, millainen on testauksen kattavuus. • Huomattavaa: – Koska testauksen on oltava nopeita, pitää olla erilaisia testisettejä. – Hitaammat testit ajetaan kenties vain kerran päivässä tai sitäkin harvemmin. – Tietenkin voi käyttää useaa palvelinta testien ajamiseen. – CI on magiaa: integrointi sinänsä ei kerro laadusta mitään. Myös testien on oltava hyviä. Yksikkötestien toistaminen palvelimella ei riitä. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 136(504) Muita integroinnin ja integrointitestauksen mekanismeja • Seuraavassa käsitellään lyhyesti erilaisia integroinnin mekanismeja. • Niissä on arkisesti ottaen kyse siitä, miten ohjelmistoa kootaan yhteen ja se tapahtuu yleensä "terveen järjen" perusteella ja erilaisia periaatteita soveltaen. • Ketterässä kehittämisessä on aina käytettävä sellaista integrointityyliä, jonka avulla saadaan nopeasti aikaan toimiva ja kokeilukelpoinen ohjelma. • Vaikka ohjelman kehityksen aikana suositaan jatkuvaa integrointia, tulee silti tilanteita, joissa, pitää yhdistää joukko suurempia kokonaisuuksia. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 137(504) Kertarysäysintegrointi • Big bang: ”Alussa ei ollut mitään ja sitten kaikki räjähti” • Idea: Ensin yksikkötestataan kaikki yksiköt erikseen ja sitten integroidaan ne kerralla toimivaksi kokonaisuudeksi – Yleistä pienissä ohjelmissa tai kun kootaan ohjelmaa olemassa olevista komponenteista – Ongelma 1: Yksikkötestausvaiheessa on kaikille yksiköille kirjoitettava tarvittavat ajurit ja tyngät – Ongelma 2: Kun vika ilmenee integroitua järjestelmää testattaessa, on sen aiheuttaneen virheen etsiminen hankalaa isosta joukosta yksiköitä – Ongelma 3: Virheen korjaamisen jälkeen täytyy monia testejä ajaa uudelleen, sen varmistamiseksi, ettei korjaus ole rikkonut mitään muuta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 138(504) Jäsentävä inkrementaalinen integrointi • Top-down • Myös strategia ohjelman kehittämiseen • Tämä on hyvin tyypillinen tapa: Ajatellaan ohjelmistoa, jonka rakenteen määrittää jokin "framework". Ensin tehdään perusrunko ("kontrolliyksikkö") ja aletaan sitten kokoamaan siihen palasia. – Alkuun puuttuu paljon. Esimerkiksi tulostustoiminto tai haku korvataan pitkään tyhjällä rutiinilla. • Edut testaukselle – – – – Käytettävissä on koko ajan ajettava ohjelma Saadaan käyttäjän näkökulma Voidaan simuloida käyttäjätarinoita ja käyttötapauksia Kyetään arvioimaan kokonaisuutta – tehdäänkö oikeaa ohjelmaa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 139(504) Kokoava inkrementaalinen integrointi 1/2 • Bottom-up • Aloitetaan yksikkötestaus alimman tason yksiköistä, joille kirjoitetaan testauksessa tarvittavat ajurit • Seuraavassa vaiheessa korvataan nämä ajurit vastaavilla yksiköillä, kun ne valmistuvat • Testataan seuraavaksi nämä yksiköt – Kirjoitetaan jälleen tarvittavat ajurit – Alimman tason yksiköt poistavat tynkien tarpeen • Korostaa matalan tason toiminnallisuutta • Järjestelmän prototyyppi ei ole käytettävissä ennen kuin vasta aivan integrointitestauksen lopussa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 140(504) Kokoava inkrementaalinen integrointi 2/2 • Suuri etu: tynkiä ei tarvita – Tynkien tekeminen on yleensä työläämpää kuin ajurien • Lisää etuja: – Kokoavassa integroinnissa voidaan klustereiden testausta jakaa helposti useammalle tiimille – Matalan tason yksiköiden suunnittelussa ja toteutuksessa tehdyt virheet voidaan löytää nopeasti • Esim. niissä piilevät suorituskykyongelmat voidaan havaita tehokkaasti • Iso haitta: Kokonaisuus ei toimi pitkään aikaan… Ohjelmistotekniikka Ohjelmistojen testaus, 2015 141(504) Integrointijärjestyksestä • Testausjärjestys voi riippua siitä, missä järjestyksessä yksiköitä integroidaan toisiinsa – Mitä kyetään testaamaan! • Kannattaa integroida ensin ne yksiköt, joihin liittyy suurin riski tai jotka muuten vaan sattuvat olemaan kriittisellä polulla – Mitä suurempi riski, sen aikaisemmassa vaiheessa pitää testata – Kriittinen polku saattaa liittyä esim. ominaisuuteen, joka halutaan saada toimimaan mahdollisimman nopeasti tai tekniikkaan, jonka käyttökelpoisuus halutaan selvittää mahdollisimman nopeasti • Uusien asioiden testaus kannattaa tehdä (myös) erillisenä proof of concept-testauksena – kokeillaan projektin koodikannasta erillään, toimiiko vaikka uusi tietokantaparadigma. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 142(504) Integrointitestauksen nyrkkisääntöjä • Tarvittavan apukoodin määrä tulisi minimoida • Kerralla kannattaa integroida vain pieni määrä kerrallaan – Tiedetään, mistä ongelmat johtuvat… – Siksi jatkuva integrointi on hieno asia • Integrointi on eri asia kuin integrointitestaus – On huolehdittava testien laadusta • Testauksen oltava nopeaa, että palaute kehittäjille on nopeaa • Voi olla erilaisia testisettejä – pieniä ja nopeita (heti palaute kehittäjille), isoja ja hitaita pyörimässä vaikka yön yli Ohjelmistotekniikka Ohjelmistojen testaus, 2015 143(504) 4.10 Jatkuva toimitus (Continuous Delivery) 1/3 • Tapa toimittaa ohjelmisto pientenkin muutosten jälkeen kokonaisvaltaisella työnkululla asiakkaan käyttöympäristöön: – Tietojärjestelmän tuotantoympäristöön, käyttäjän tietokoneeseen tai mobiililaitteeseen. • Vaikka puhutaan "jatkuvasta", rytmi voidaan valita asiakkaan tarpeiden mukaan ja sen mukaan, mitä päivitetään: bugikorjauksia vai käyttöön vaikuttavaa uutta toiminnallisuutta. • Tärkeää on valmius toimittaa milloin tahansa. • Suosii Kanban-tyyppistä kehittämisprosessia. • Erinomainen kirja: Humble & Farley: Continuous Delivery. • Käsittelemme tässä vain muutamia asioita testauksen näkökulmasta. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 144(504) Jatkuva toimitus (Continuous Delivery) 2/3 • Onnistuminen perustuu hyvin toimivaan logistiikkaan (ml. jatkuvaan integrointiin), konfiguraationhallintaan ja hyvään testaukseen. • Logistiikan ja eri alustojen testiympäristöjen oltava hyvin luotettavia, ettei tule yllätyksiä. • Yleensä korostetaan testiautomaatiota, mutta manuaalisellakin testauksella onnistuu. • Manuaalinen testaus on tärkeää joka tapauksessa. – Uuden toiminnallisuuden testaus ja (tarvittaessa) käyttäjien hyväksymistestaus sekä sopivan laaja usein tutkiva regressiotestaus. – "Sokkona" ei pidä koskaan toimittaa mitään käyttäjille. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 145(504) Jatkuva toimitus (Continuous Delivery) 3/3 • Voidaan käyttää taktikoiden testauksen vähentämiseen, koska huonot muutokset voidaan nopeasti myös vetää takaisin. • Auttaa tekemään A/B-testausta, koska mekanismeilla voidaan nopeasti vaihtaa eri ympäristöissä käytössä olevia konfiguraatioita. – A/B-testauksessa tarjotaan eri käyttäjille erilainen versio systeemistä ja vertaillaan sitten niiden käyttöä. Käytössä mm. Googlella ja kaikilla isoilla some-palveluilla. • Laajan käyttäjäkunnan palveluissa voidaan uutta toiminnallisuutta ensin "markkinatestata" joillain palvelimilla ja sitten levittää muuallekin. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 146(504) 4.11 Järjestelmätestaus • • • • • • Testataan kokonaisjärjestelmän toimintaa Yleensä testaajien työtä Voi olla erillisen testaustiimin tehtävä Löydettyjen virheiden korjaus kallista Ajallisesti yleensä pitkäkestoisin kaikista testausvaiheista Kaikkien testitapausten suorittaminen voi kuluttaa hyvinkin paljon resursseja – Luontevaa aloittaa jälleen savutestillä • Jos järjestelmätestaus aloitetaan vasta projektin lopussa, ajaudutaan helposti ongelmiin – Varsinkin ketterässä prosessissa pyritään testaamaan koko ajan myös järjestelmätasolla Ohjelmistotekniikka Ohjelmistojen testaus, 2015 147(504) Monipuolista testausta järjestelmän tasolla 1/2 • Järjestelmätestausvaiheessa käytettävissä on koko järjestelmä, mikä tekee mielekkääksi mm. seuraavien asioiden testaamisen: – – – – – – – – – Asiakkaan vaatimukset Käytettävyys Tietoturva Suorituskyky Kuormituksen kesto Suunnittelun ominaispiirteet Järjestelmän tilat Kapasiteetti Rinnakkaisuus Ohjelmistotekniikka Ohjelmistojen testaus, 2015 148(504) Monipuolista testausta järjestelmän tasolla 2/2 – Ohjelmiston ja laitteiston konfiguraatiot – Rajapinnat ja toiminta muiden järjestelmien kanssa (vrt. järjestelmäintegrointitestaus) – end to end -käyttötapaukset – Asennus – Lokalisointi – Toipuminen virhetilanteista – Luotettavuus – Resurssien käyttö – Skaalautuvuus • Järjestelmätestaus vaatii huomattavasti enemmän luovuutta kuin alemman tason testaus – Yleispäteviä toimintamalleja mahdotonta määritellä tarkasti Ohjelmistotekniikka Ohjelmistojen testaus, 2015 149(504) Systemaattisen järjestelmätestauksen vaiheet • Järjestelmätestauksen vaiheet (mukailtu Kit: Software Testing in the Real World, 1995): – – – – Huom! Tässä koskien lähinnä toiminnallista testausta Vaatimusten analysointi ja paloittelu hallittaviin osiin Jokaiselle osalle yksityiskohtaisten vaatimusten listaus Jokaista merkityksellistä vaatimusta vastaavien syötteiden ja tulosten määrittely – Vaatimuskattavuusmatriisin määrittely • Mäppää vaatimukset ja testit – onko kaikilla vastaavuus • Nykyään ohjelmat tekevät automaattisesti – Testitapausten suorittaminen ja vaatimuskattavuuden mittaaminen – Uusien testitapausten määrittely ja suorittaminen tavoitellun vaatimuskattavuuden saavuttamiseksi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 150(504) Ei vielä ajettu Vaatimuskattavuus • Vaatimuskattavuusmatriisi – Taulukko, jossa kerrotaan yhteydet (eri tyyppisten) testitapausten ja vaatimusten välillä – Mikäli mahdollista, yhdellä (laillisella) testitapauksella kannattaa testata montaa vaatimusta – Matriisista näkee helposti sen, mitä ei (vielä) testata Vaatimus V1 V2 V3 TT2 OK OK TT3 FAIL Testitapaus TT1 TT4 Ohjelmistotekniikka V4 TBD OK Ohjelmistojen testaus, 2015 OK 151(504) Nopea vikaraportointi tärkeää • Järjestelmätestausvaiheessa pitäisi huolehtia siitä, että kehittäjät saavat vikaraportit nopeasti – Nopeus ei ole niin itsestään selvää kuin alemmissa vaiheissa • Mahdolliset organisaatiorajat hidastavat – Projektin johdon kautta kierrättäminen ei välttämättä ole hyvä idea – Nopea raportointi voi estää virheen leviämisen muihin paikkoihin – Ketterässä kehityksessä testaajat usein tiimeissä – välitön palaute Ohjelmistotekniikka Ohjelmistojen testaus, 2015 152(504) Muutostenhallinnasta laajoilla järjestelmillä 1/2 • Koska järjestelmätestien suorittajat eivät yleensä itse korjaa löydettyjä virheitä, on erittäin tärkeää huolehtia muutosten hallinnasta – Mikäli jokainen virhe korjataan heti siten, että testattava versio vaihtuu jatkuvasti, ei järjestelmätestaus pääse etenemään – Toisaalta joidenkin virheiden pikainen korjaaminen voi olla ensisijaista toisten virheiden nopealle löytymiselle • Yleensä virheiden korjaamisen priorisoinnista ja aikatauluista päättää erillinen taho (Change/Configuration Control Board) – Tähän voi kuulua testaajien ja kehittäjien lisäksi myös tuotteenhallintapäällikkö, projektipäällikkö, laatupäällikkö, tietokantojen ylläpitäjä, asiakkaita/loppukäyttäjiä, asiakastukihenkilöitä ja markkinointi-ihmisiä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 153(504) Muutostenhallinnasta laajoilla järjestelmillä 2/2 • Tämä kaikki koskee laajoja järjestelmiä, joiden konfiguraation on tärkeää pysyä samana koko testikierroksen ajan • Tärkeä tapaus tässä on hyväksymistestaus, jossa testauskierroksen avulla päätetään jonkun version ottamisesta käyttöön tai sen siirtämisestä testausprosessissa seuraavaan vaiheeseen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 154(504) Top 7 pointit järjestelmätestaukseen • Selvitä, miten ohjelmistoa käytetään ja mikä käytössä on tärkeintä – Kuka käyttää, mihin tarkoitukseen, mikä on sen toiminnan tavoite • Tunnista kaikki olennaiset ominaisuudet – Toiminnallisuus, käytettävyys, tietoturva – Ellet osaa testata niitä itse, teetä testaus toisella • Tee selväksi toimintojen ja ominaisuuksien tärkeysjärjestys – Käytön yleisyys, toimintoihin liittyvä riski • Aloita testaus tärkeimmistä asioista • Käytä luovasti erilaisia testaustyylejä – Suunnitelmalähtöisyys ja ketteryys tukevat toisiaan – Automaatiolla on oma paikkansa • Tee sellaiset dokumentit, jotka auttavat toisia • Virheraporttien tarkoitus on "myydä" virhe kehittäjille ja saada se korjatuksi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 155(504) 4.12 Järjestelmäintegrointitestaus 1/2 • Isojen tietojärjestelmäprojektien yhteydessä suureksi kysymykseksi nousee yleensä yhteensopivuus muiden järjestelmien kanssa • Koska kokonaisjärjestelmän osat tulevat usein eri toimittajilta, on syytä kiinnittää erityistä huomiota siihen, että osajärjestelmät ”juttelevat” toistensa kanssa saumattomasti • Siksi on järkevää panostaa integrointiin ja tehdä siihen keskittyvää testausta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 156(504) 4.13 Järjestelmäintegrointitestaus 2/2 • Järjestelmäintegrointitestaus on luonteeltaan teknistä, toiminnallisuus ja suorituskyky jne. varmistetaan vasta kun homma toimii ”pellin alla” • Kannattaa aloittaa mahdollisimman aikaisin, myöhäinen aloitus johtaa ongelmiin projektin lopussa – Ajureita ja tynkiä joudutaan käyttämään korvattaessa keskeneräisiä ja puuttuvia osajärjestelmiä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 157(504) Yleiskuvaus • Tarkoitus – Varmistaa, että kokonaisjärjestelmä toimii hyvin ja kaikki osajärjestelmät toimivat yhdessä. • Perustuu laadittuun testaussuunnitelmaan. • Testiympäristö vastaa järjestelmän tuotantoympäristöä. • Testiympäristö usein kokoaa yhteen eri osapuolten tuottamia järjestelmiä. • Tietojärjestelmäprojektien kriittisimpiä testauksia. – Moni suuri projekti on ongelmissa juuri siksi, että eri osapuolten tekemät järjestelmät eivät toimi yhdessä. • Edellyttää kaikkien osapuolten yhteistyötä. • Tekijänä erillinen tiimi. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 158(504) Lähestymistapa • Järjestelmien välisten rajapintojen testaus. • Tärkeimpien toimintojen toimivuuden varmistaminen. – Liiketoimintaprosessit koko järjestelmän läpi. • Testityypit: – Toiminnallisuustestaus. – Suorituskykytestaus. • Mukana myös tarkastusta. – Tietokannat, siirtotiedostot yms. kannattaa testauksen lisäksi tarkastaa manuaalisesti. • Voi olla osa asiakkaan hyväksymistestausta. • Testejä voidaan automatisoida, jos rajapinnat ovat stabiilit. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 159(504) Tekijät • Erillinen integrointitiimi. • Voi olla taho, joka ei toteuta yhtään osajärjestelmää. • Voi olla taho, joka tekee asiakkaan puolesta. hyväksymistestauksen. • Tukena muutosraati ja virheraati, joka käsittelee integroinnin kysymyksiä ja ongelmia. – Minkä osapuolen syy on se, että jokin ei toimi… joskus kaikki tekevät kaiken oikein, mutta kokonaisuus ei toimi! Ohjelmistotekniikka Ohjelmistojen testaus, 2015 160(504) Suunnittelu • • • • Integrointisuunnitelma projektin alussa – Linkittyy osajärjestelmien julkaisusuunnitelmiin – Järjestelmien testattavuuden katselmointi – Ajoitus oleellista – millä rytmillä tuotetaan uusia versioita järjestelmistä – Voi olla myös automatisoitu jatkuvan integroinnin näkökulma Sovitaan kussakin vaiheessa testattavat päästä päähän skenaariot – Esimerkiksi tilauksen käsittely alusta loppuun – testataan, miten se kulkee eri järjestelmien läpi Vastuiden sopiminen Resurssien varaus tärkeää – Ympäristöt – Testausresurssit Ohjelmistotekniikka Ohjelmistojen testaus, 2015 161(504) Toteutus • Ympäristön pystytys • Testidatan / tietokantojen hankinta • Järjestelmän konfigurointi eri osajärjestelmille • Stubien / simulaattoreiden / mock-olioiden rakentaminen puuttuville järjestelmille, jotta testaus voidaan tehdä ennen kuin kaikille asioille on toteutusta • Testauksen aloitus heti, kun on integroitavaa • Testien automatisointi regressiotestausta varten • Testauksen jatkaminen koko projektin ajan Ohjelmistotekniikka Ohjelmistojen testaus, 2015 162(504) Kokonaisuuden hallinta • Projektissa on tärkeää olla integrointinäkökulma • Kun löytyy virheitä, on löydettävä niistä vastaava taho – Kukin järjestelmä voi toimia itsenäisesti "oikein" – Voi olla vaikeaa… • Tarvitaan mielellään virheraati, joka tulkitsee tilannetta – Mukana eri osapuolten edustajat • Testiympäristö tarvitsee ylläpitäjän • Järjestelmäintegroinnin tekijä – Voi olla taho, joka ei toteuta integroitavia järjestelmiä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 163(504) Mittaus • Keskeinen tavoite seurata integroinnin etenemistä – Liiketoimintaskenaarioiden testauksen kattavuus-% – Läpäisseet – eli mikä kaikki toimii • Virheiden määrä • Virheiden määrän trendi • Virheet eri järjestelmäpareissa – Mitkä eivät toimi yhteen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 164(504) Yleisiä löydettäviä ongelmia 1/2 • Rajapinnat toteutettu virheellisesti – Ohjelmistorajapinnat – Parametrien järjestys väärä • Protokollien toteutus vajaa • Asynkronisissa prosesseissa tapahtumien järjestys väärä • Erilaiset tietotyypit – Numeroiden esitys – Tekstidatan merkistöt • Tietotyypit virheelliset toteutuksessa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 165(504) Yleisiä löydettäviä ongelmia 2/2 • Dokumentaation virheet • Dokumentaation puuttuessa tehtävät oletukset ovat virheelliset • Aikakatkaisut – Yksi järjestelmä ei odota toisen tehtävien valmistumista Ohjelmistotekniikka Ohjelmistojen testaus, 2015 166(504) Järjestelmäintegrointitestauksen menestystekijöitä 1/2 • Kaikilla osapuolilla on yhteinen tavoite • Stabiili, realistinen testiympäristö – Ympäristön hallittavuus ja konfiguroitavuus – porttien avaus esimerkiksi ei saa kestää kuukautta • Osaprojektit tähtäävät integrointiin alusta lähtien • Avoimuus rajapintojen toteutuksesta (tämäkään ei ole itsestään selvää) • Avointen standardien käyttö • Avoimen lähdekoodin ohjelmistot, jolloin eri osapuolet voivat paremmin tutustua muiden käyttämiin ratkaisuihin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 167(504) Järjestelmäintegrointitestauksen menestystekijöitä 2/2 • Integrointia mitataan ja se mittaa projektin etenemistä • Panostus viestintään • Hyvä muutoksenhallinta • Integrointi alkaa varhaisessa vaiheessa – se tarvitsee harjoittelua; ei onnistu kerralla Ohjelmistotekniikka Ohjelmistojen testaus, 2015 168(504) Järjestelmäintegroinnin sudenkuoppia • Jätetään projektin loppuun – Ei onnistu kerralla • Integrointiin ei varata resursseja • Muille osapuolille ei toimiteta rajapintojen dokumentaatiota • Ympäristöt eivät ole kunnossa – Konfigurointi – Porttien avaus – Oikeudet Ohjelmistotekniikka Ohjelmistojen testaus, 2015 169(504) 4.14 Testaus ketterässä kehittämisessä Ketterässä kehittämisessä toteutetaan vastaavia testaustasoja kuin Vmallissa, mutta hieman erilaisella rytmillä ja tavalla. Miten se tapahtuu pyrähdyspohjaisessa prosessissa? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 170(504) Pyrähdysten rytmi • Ketterä kehitysprosessi perustuu pyrähdyksiin (sprint) – Tuotetaan joukko uutta toiminnallisuutta – Toiminnot pyritään testaamaan pyrähdyksen aikana toimituskelpoiseksi – Tehdään vähän suunnitelmia – Testaus kohdistuu aina ensimmäiseksi yhteen toiminnallisuuteen järjestelmätasollakin – Testaajat ovat yleensä tiimissä mukana ja ottavat uusia toiminnallisuuksia testaukseen sitä mukaa, kun koodaajat saavat niitä testattavaksi • Kun ne on yksikkötestattu ja integroitu Ohjelmistotekniikka Ohjelmistojen testaus, 2015 171(504) Periaatteellinen ketterä testausmalli Pre-game Yksikkö- ja integrointitestaus Ominaisuuksien testaus (järjestelmätaso) Kokonaisuuden järjestelmätestaus Ohjelmistotekniikka Pyrähdys 2…N Pyrähdys 1 Post-game Uudet ominaisuudet Tiimissä Tiimissä tai hajautettuna; tilanteista riippuen Ohjelmistojen testaus, 2015 172(504) Yhden uuden toiminnon testaus 1/2 • Pyrähdyksen alussa toteutettavat toiminnot listataan pyrähdyksen työlistaan (backlog) • Testaustehtäville tehdään omia tehtäviä – joko toimintoihin liitettynä tai erikseen • Niiden testausta voidaan alkaa valmistella, vaikka sen pohjana ei olisi kuin kevyt käyttäjätarina – kommunikaatio tiimissä on avain tässä • Kun toteutus hahmottuu, testauksen toteutus jäsentyy • Testaus on ainakin aluksi tutkivaa, toteutukseen perustuvaa, mutta systemaattisia tekniikoita (ketterällä suunnittelulla) kannattaa käyttää Ohjelmistotekniikka Ohjelmistojen testaus, 2015 173(504) Yhden uuden toiminnon testaus 2/2 • Yksinkertainen testaus pyritään usein automatisoimaan, jolloin se voidaan jatkossa toistaa helposti • Asiakkaan edustaja voi osallistua karkeaan uuden toiminnon hyväksymistestaukseen • Toiminto on "done" vasta, kun se on läpäissyt testauksen! Ohjelmistotekniikka Ohjelmistojen testaus, 2015 174(504) Yhden uuden toiminnon testaus tarkemmin Sprintin backlog Uusi ohjelman versio Ominaisuus 1 Ominaisuus 2…N Aikataulu (järjestys) Testauksen suunnittelu Ohjelmistotekniikka Kehittäjä suunnittelee ja toteuttaa Yksikkö- ja integrointitestaus Testaus Ohjelmistojen testaus, 2015 Virheiden korjaus Verifiointi 175(504) Ketterän testauksen nelikenttä 1/2 • Kaiken testauksen on hyvä olla tavoitteellista. • Ketterässä kehittämisessä tehtävän testauksen erilaisia tyyppejä ja niiden tavoitteita on jäsentänyt Brian Marick ja perinpohjaisesti dokumentoineet Crispin & Gregory kirjassa Agile Testing [Crispin&Cregory 09]. • Agile Testing Quadrants – ketterän testauksen nelikenttä muistuttaa, että tietty testaus voi: – Tukea ensisijaisesti kehittämistiimin työtä tai olla suuntautunut tuotteen kritisoimiseen. – Olla suuntautunut teknologiaan tai bisnekseen – tuotteen tarkoitukseen. • Kaavio on saavuttanut paljon suosiota. Sitä ei pidä uskoa sellaisenaan, vaan kuhunkin tilanteeseen soveltaen. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 176(504) Ketterän testauksen nelikenttä 2/2 Liiketoimintaan suuntautuva Manuaalinen Q1 Q2 Toiminnalliset testit Tutkiva testaus Esimerkit Skenaariot Tarinoiden testit Käytettävyystestaus Prototyypit Käyttäjien hyväksymistestaus Simulaatiot Q3 Yksikkötestit Komponenttitestit Alpha- / betatestaus Q4 Suorituskyky- ja kuormitustestaus Kritisoi tuotetta Tukee tiimiä Automatisoitu ja manuaalinen Tietoturvatestaus Muu ei-toiminnallinen testaus Automatisoitu Ohjelmistotekniikka Teknologiaan suuntautuva Työkalut Ohjelmistojen testaus, 2015 177(504) Onko pyrähdyksissä riittävästi aikaa testaukseen? • Ideana on tehdä pyrähdyksissä juuri sellainen määrä uutta toiminnallisuutta, että aikaa on sen hyvään testaukseen • Hyvä yksikkö- ja integrointitestaus tukena • Testaus aloitetaan aina heti, kun tulee uutta testattavaa – toiminnolle, ei koko uudelle julkistukselle • Jos on pitkäaikaisia testausvaiheita, niitä voidaan käytännössä lomittaa seuraavalle sprintille – Esimerkiksi aikaa vaativat luotettavuus- tai yhteentoimivuustestaukset – Tuotteen markkinoille julkaisun edellyttämät validointitoimet (joita ei tarvitse tehdä jokaisessa sprintissä) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 178(504) 4.15 Hyväksymistestaus • Tässä tarkastellaan hyväksymistestausta lähinnä tietojärjestelmän hankinnan yhteydessä • Hyväksymistestauksen perusteella voidaan päätellä onko tuote sopimusten mukainen ja voidaan ottaa käyttöön – Perustuu siis asiakkaiden vaatimuksiin • Testauksesta vastaa asiakas • V-mallia noudatettaessa ensimmäinen vaihe testien suunnittelussa, viimeinen vaihe testien suorituksessa • Huom! Ketterässä kehittämisessä usein käytetty ATDD-tyyli ei ole läheskään riittävä järjestelmien hyväksymistestaukseen – Se on lähinnä toimintojen "savutesti" asiakkaan edustajan kanssa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 179(504) Kokonaisvaltaista • Hyväksymistestauksessa testataan kokonaista valmista tuotetta – Kannattaa käyttää testaajina tuotteen loppukäyttäjiä – Testiympäristön pitäisi olla mahdollisimman lähellä todellista loppukäyttäjän ympäristöä – Suurilla organisaatioilla voi olla useita testiympäristöjä: toiminnallisuuden testaus, suorituskykytestaus, järjestelmäintegraation testaus Ohjelmistotekniikka Ohjelmistojen testaus, 2015 180(504) Testattavat asiat • Kaikki ominaisuudet: toiminnallisuus, käytettävyys, suorituskyky, tietoturva • Mitä on määritetty, mitä on sovittu • Reklamaatiot • Myös asiat, joita ei ole määritetty, mutta joita voidaan odottaa tuotteessa alan käytäntöjen perusteella Ohjelmistotekniikka Ohjelmistojen testaus, 2015 181(504) Kiire löytää virheet takuuaikana • On tärkeää löytää puutteet takuuaikana, jolloin toimittaja korjaa ne samaan hintaan • Muuten joudutaan teettämään kalliita korjauksia • Ilman testausta otetaan käyttöön raakile, johon kukaan ei ole tyytyväinen, jonka ongelmien kanssa pärjäämiseen menee kaikki aika ja energia • Siksi tärkeää tehdä testaus kunnolla Ohjelmistotekniikka Ohjelmistojen testaus, 2015 182(504) Eikö toimittaja tee testausta? • Ei, he lupaavat enemmän kuin tekevät • Ja heiltä puuttuu loppukäyttäjien käytännöllinen näkökulma • Toimittajalla on syynsä suosia heikkoa hyväksymistestausta: siinä löytyy paljon korjattavaa, laskutus viivästyy, ongelmia ei riitä takuuajan jälkeiseen aikaan… Ohjelmistotekniikka Ohjelmistojen testaus, 2015 183(504) Testausympäristöt • Kaikki erot testiympäristön ja loppukäyttäjän ympäristön välillä ovat asioita, joita ei tule testattua – Käytetäänkö todellisia tietokantoja yms. testattavaan järjestelmään liittyviä muita järjestelmiä vai simuloidaanko niitä jotenkin? – Onko testidata generoitua vai todellista? – Onko käyttäjän laitteistossa muita ohjelmia? – Onko laitteiston konfiguraatio realistinen? • Erilaisia loppukäyttäjän ympäristöjä voi olla vaikka kuinka paljon – Profiilien luonti vastaamaan yleisimpiä ympäristöjä voi kannattaa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 184(504) Organisointi • Tilaajan oma projekti – Omat järjestelyt, oma näkökulma, oma vastuu • Joku vastaa ja vetää testauksen – Voi olla vuokrattu konsultti • Kaikki organisaatioyksiköt mukana – liiketoiminta, ICT, hallinto • Käyttäjiä saatava mukaan testaamaan • Voidaan käyttää testauspalvelutaloa alihankkijana – Koko projektissa tai vaikka suorituskykytestauksessa • Kesto vaihtelee – Pienillä järjestelmillä lyhyt testaus, että systeemi on käyttöön sopiva – Suurilla järjestelmillä voi olla kuukausien mittainen laaja projekti Ohjelmistotekniikka Ohjelmistojen testaus, 2015 185(504) Käyttäjien osallistuminen tärkeää • Käyttäjät ymmärtävät – Vaatimuksia – Omaan liiketoimintaansa liittyviä riskejä • Käyttäjät voivat – – – – Toimittaa realistista testidataa Toimittaa käyttötapauksia Suunnitella testejä ja tehdä testausta Tarkastaa ja katselmoida • Testiraportteja • Muita projektissa syntyneitä dokumentteja • Mutta eivät osaa tehdä hyvää testausta ilman apua Ohjelmistotekniikka Ohjelmistojen testaus, 2015 186(504) 4.16 Ketterä hyväksymistestaus: ATDD • ATDD = Acceptance Test Driven Development • TDD:ssä matalan tason testit ajavat koodausta eteenpäin • ATDD:ssä korkean tason testit ajavat koko prosessia eteenpäin • Kuinka “Definition of done” määritellään asiakkaan tai käyttäjän näkökulmasta? • ATDD perustuu siihen, että määritellään suoritettavia korkean tason testejä ennen kuin toteutusta on edes aloitettu • Ideaalitapauksessa testit tekee asiakas tai loppukäyttäjä • Kun testi läpäistään, on vastaava vaatimus ”Done” • ATDD-työkalut tarjoavat helpon tavan määritellä testejä muodossa, jota asiakas ja loppukäyttäjäkin ymmärtävät Ohjelmistotekniikka Ohjelmistojen testaus, 2015 187(504) ATDD-prosessi • Asiakkaan kanssa sovitaan toiminnon testitapaukset. • Testaaja tai kehittäjä suunnittelee ne ja niille tehdään yleensä kevyt testiautomaatio. • Testit lisätään backlogiin tai toimintojen Kanban-prosessin vaiheeksi (läpäisy on yksi vaatimus, että toiminto on Done). – Automatisoidut testit voidaan liittää jatkuvaan integrointiin ja siksi ne alussa eivät mene läpi. – Manuaalisia testejä ei toki tehdä ennen toteutusta… • Toteutuksen ja virheiden korjauksen jälkeen testit menevät vähitellen läpi. • Voidaan todeta asioiden olevan tältä osin alustavasti kunnossa… Ohjelmistotekniikka Ohjelmistojen testaus, 2015 188(504) ATDD:n piirteitä • Edut – Vähemmän monikäsitteisyyksiä vaatimuksissa, koska asiakas tai loppukäyttäjä on hyväksynyt testit – Kun testi menee läpi, voidaan siirtyä toteuttamaan seuraavaa vaatimusta • Testit määrittelevät projektin laajuuden: jos läpäisemättömiä testejä ei ole, ei ole mitään mitä implementoida (kuten asiakas tai loppukäyttäjä on asian hyväksynyt) • Etenemisen läpinäkyvyys johdolle ja asiakkaalle • Kannattaa kuitenkin muistaa, että ATDD-työkalut eivät välttämättä tue kaikki sovelluskohteita • …ja kaikki asiakkaan eivät ole valmiit toimimaan näin! Ohjelmistotekniikka Ohjelmistojen testaus, 2015 189(504) 4.17 Alfa- ja Beta-testit • Käyttäjät tekevät testit • Alfa-testit käyttäjän toimesta toimittajan tiloissa mahdollisimman realistisessa ympäristössä – Kehitys- tai testausympäristö ei kelpaa • Beta-testit käyttäjän toimesta käyttäjän tiloissa ja ympäristössä • Sekä alfa- että beta-testauksen tapauksessa täytyy muistaa, että ad hoc -tyyppinen testaus (kokeileminen) ei korvaa järjestelmällistä testausta käyttäen suunniteltua testistrategiaa ja testitapauksia – Keskeneräisen ohjelmiston jakelu valikoiduille käyttäjille ei siis yksinään riitä – Kokeilukin voi joissain tapauksissa olla paikallaan, mutta vasta sitten kun järjestelmä on hyväksymistestattu järjestelmällisesti Ohjelmistotekniikka Ohjelmistojen testaus, 2015 190(504) 4.18 Tarvitaanko kaikkia testaustasoja ja vaiheita? • Testauksen järjestelmällisellä jakamisella eri abstraktiotasoihin ja vaiheisiin on selviä etuja suunnittelemattomaan lähestymistapaan verrattuna • Kuitenkin pienissä projekteissa kaikkien em. testausvaiheiden läpikäyminen voi aiheuttaa ylimääräistä työtä • Testauksen tasoja ja vaiheistamista suunniteltaessa kannattaa ottaa huomioon ainakin – Kehitettävän järjestelmän monimutkaisuus – Projektin budjetti – Testausorganisaatio Ohjelmistotekniikka Ohjelmistojen testaus, 2015 191(504) Järjen käyttö sallittua • Tärkeintä ei ole vaiheiden määrän maksimointi vaan oikeiden vaiheiden valinta kutakin projektia varten • Vaiheet eivät saa hidastaa toimituksia tarpeettomasti tai hidastaa vikojen löytämistä • Huom! Samaa vaihetta voidaan kutsua eri nimillä – Yksikkötestausta voi olla paitsi moduulitestaus myös komponenttitestaus, kehittäjätestaus jne. • Ei kannata antaa termien hämätä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 192(504) Järjestelmätestejä voidaan ajaa integroinnin yhteydessä • Integrointitestauksen yhteydessä pohdittiin sen suhdetta yksikkötestaukseen: oma vaihe vai osa yksikkötestausta • Entä voitaisiinko järjestelmätestit yhdistää integrointitestaukseen? – Craig ja Jaskiel [Craig&Jaskiel 02] listaavat ominaisuuksia, jotka ovat yhteisiä heidän asiakasorganisaatioillensa, joissa näiden vaiheiden yhdistäminen on onnistunut: • Hyvä tuotteenhallinta • Suhteellisen paljon automatisoituja testejä • Kanssakäyminen kehittäjien ja testaajien välillä toimii hyvin – Automatisoidut järjestelmätestit voidaan ajaa integrointitestauksen yhteydessä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 193(504) Hyväksymistestaus järjestelmätestauksen yhteydessä • Entä hyväksymistestauksen yhdistäminen järjestelmätestaukseen? – Voi olla perusteltua tilanteissa, joissa loppukäyttäjät osallistuvat järjestelmätestaukseen – Testaus pitää tehdä tuotantoympäristöä tarkoin vastaavassa ympäristössä – asiakkaan ympäristössä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 194(504) 4.19 Milloin siirtyä tasolta toiseen? • Kaksi oleellista kysymystä testausta vaiheistettaessa – Miten vaiheet liittyvät toisiinsa? • Selkeät rajat auttavat siirtymisessä vaiheesta seuraavaan – Mistä tiedetään koska siirrytään vaiheesta seuraavaan? • Selkeät aloitus- ja lopetusehdot • Eri testausvaiheiden ei tule olla päällekkäisiä, eikä niiden välillä saa olla suuria aukkoja – Ei kannata testata samaa asiaa moneen kertaan samasta näkökulmasta. Ja kaikkia asioita pitää testata. – Huom! Olennaisinta silloin, kun testaus tehdään käsin. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 195(504) Päällekkäisyyden haittoja • Aiemmin löydettyjä (ja korjattuja) virheitä voidaan löytää uudestaan ja käsitellä turhaan uudestaan • Yksikkö- ja integrointivaiheissa löydetyt virheet ovat paljon halvempia korjata kuin myöhemmissä vaiheissa löydetyt – Yritetään löytää matalalla tasolla niin paljon kuin mahdollista • Kun testaus siirtyy kehittäjiltä erillisen testaustiimin harteille, virheiden hinta kasvaa – Yritetään löytää matalalla tasolla niin paljon kuin mahdollista • Kuitenkin: – Eri tasoilla ympäristö usein vaihtuu ja ohjelmistoon tulee uusia kerroksia. Oltava siis varovainen, kun miettii, mitä ei testata. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 196(504) Aloitus- ja lopetusehdot 1/2 • Hyvin määritellyt ja tunnollisesti noudatetut aloitus- ja lopetusehdot eri testausvaiheille / tasoille luovat yhteiset pelisäännöt projektin etenemiselle • Jotkin aloitus- ja lopetusehdoista riippuvat projektista, toiset voivat olla standardeja organisaation sisällä • Edellisen vaiheen tekijät ovat kiinnostuneita seuraavasta koska heidän panoksensa vaikuttaa paitsi oman vaiheen lopetusehdon myös seuraavan vaiheen aloitusehdon saavuttamiseen • Ehtojen merkitys riippuu kehityksen elinkaarimallista – Lineaarinen vai iteroiva, ketterä? • Laajemmin on kyse tietyn vaiheen hyväksynnästä, joka saavutetaan iteroiden – vikoja korjaten, kunnes tilanne on riittävän hyvä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 197(504) Aloitus- ja lopetusehdot 2/2 • Vaiheen aloitusehdon tulisi sisältää ainakin osa edellisen vaiheen lopetusehdoista – Lisäksi siihen voidaan sisällyttää ehtoja koskien myös esim. testiympäristön luomista, testityökaluja ja jopa testaustyövoiman hankkimista • Mikäli on vaarana, että aletaan testata versiota, jota ei käytännössä vielä voi testata, kannattaa aloitusehtoihin kirjata myös vaatimus savutestin läpäisemisestä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 198(504) Milloin saa softan siirtää prosessissa eteenpäin? 1/4 • Yksikkötestauksesta integrointitestaukseen: – Yksikkötestit menevät läpi – Tai virheet eivät riko mitään nyt toimivaa asiaa (uusi koodi ei saa huonontaa ohjelmaa ja aiheuttaa haittaa muille) – Joskus: Riittävä testikattavuus, koodin katselmointivaatimus, tarkistus työkaluilla, dokumentointi • Integroinnista järjestelmätestaukseen: – – – – Buildi toimii riittävän luotettavasti – voidaan testata Testien läpäisyaste on riittävä Riittävä testikattavuus Olemassaolevat virheet on dokumentoitu (listaukset tiedossa olevista vioista) – Läpäistään järjestelmätestaajien määrittämät savutestit Ohjelmistotekniikka Ohjelmistojen testaus, 2015 199(504) Milloin saa softan siirtää prosessissa eteenpäin? 2/4 • Järjestelmätestauksen lopetusehdot – milloin saa siirtää asiakkaalle hyväksymistestaukseen tai tuotteen paketointiin – Vaatimuskattavuus on riittävä – kaikkia osa-alueita on katettu testeillä – Läpäisseiden testien osuus on riittävä (huom. Tällaisten mittarien vaarat…) – Ei ole kriittisiä virheitä – Muistivuoto-, kuormitus- ja tietoturvatestit menevät läpi valituilla kriteereillä – Testaustiimi kokee, että buildin voi kuitata kelvolliseksi! Ohjelmistotekniikka Ohjelmistojen testaus, 2015 200(504) Milloin saa softan siirtää prosessissa eteenpäin? 3/4 • Esim. hyväksymistestauksen lopetusehdosta (mukailtu [Craig&Jaskiel 02]) – milloin ohjelma kelpaa tuotantoon: – Medium tai sen vakavampia virheitä ei saa olla – Missään ominaisuudessa ei saa olla kahta virhettä enempää eikä kaiken kaikkiaan yli 50 virhettä – Vähintään yksi testitapaus jokaista vaatimusta kohden täytyy läpäistä (vaarallinen vaatimustyyppi…) – Testitapaukset TT23, TT25 ja TT38-52 täytyy läpäistä – Kahdeksan kymmenestä kokeneesta pankkivirkailijasta pystyy avaamaan tilin korkeintaan kymmenessä minuutissa käyttäen on-line-ohjeita (käytettävyystestaus) – Järjestelmä pystyy avaamaan 1000 tiliä tunnissa (suorituskykytestaus) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 201(504) Milloin saa softan siirtää prosessissa eteenpäin? 4/4 – Näytöstä toiseen siirtyminen kestää keskimäärin korkeintaan sekunnin kun järjestelmää käyttää 100 käyttäjää (suorituskykytestaus) – Käyttäjien täytyy hyväksyä allekirjoituksellaan testien tulokset • Huom! – Vaikka hyväksymistestaus on "läpäisty" järjestelmässä on vielä virheitä, jotka toimittajan on korjattava – Systeemi voidaan kuitenkin jo ottaa käyttöön – korjattu versio toimitetaan myöhemmin – Pelkkä numeroiden tuijottaminen ei riitä päätöksentekoon järjestelmän ottamisesta tuotantoon – käyttäjien on hyväksyttävä, että systeemi on siihen riittävän hyvä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 202(504) 5. Tutkiva testaus Tutkiva testaus on tapa tehdä testausta, jossa testaus etenee testaajan havaintojen perusteella asioihin, joissa arvellaan olevan eniten ongelmia. Testaus ei hyödynnä tarkkoja ennakkosuunnitelmia, vaan on avoin kaikelle, mitä tuotteeseen on toteutettu. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 203(504) 5.1 Tutkiva testaus pähkinänkuoressa • Tutkiva testaus = exploratory testing, ET • Tämä osio on Matti Vuoren kalvosarjasta "Ketterä testaus ja testaus ketterässä ohjelmistokehityksessä" http://www.mattivuori.net/julkaisuluettelo/liitteet/kettera_testaus.pdf • Yleensä järjestelmätestauksen tasolla • Tutkitaan ohjelmistoa sitä käyttämällä ja tehdään siitä havaintoja, yritetään oppia ja ymmärtää sitä • Tunnistetaan riskialttiita ja testaamista edellyttäviä alueita • Testataan ne saman tien, ilman formaaleja testitapauksia • Tai suunnitellaan niille tarkemmat testit ja suoritetaan ne • Tulkitaan tuloksia ja jatketaan iterointia Ohjelmistotekniikka Ohjelmistojen testaus, 2015 204(504) Varoitus • Tutkivalle testaukselle ei ole standardeja ja asiantuntijoillakin voi olla erilaisia lähestymistapoja siihen – Paradigma on vielä kehittymässä • Kun alkaa soveltaa tutkivaa testausta pitää analysoida vaatimukset testaukselle ja tarkastella monia asioita: – Koko testausprosessi – mitä muunlaista testausta tehdään, mikä kaikki täydentää ET:tä – Organisaatiokulttuuri, mukaan lukien termistö – Dokumentointivaatimukset – Testaajien osaaminen – tarvitaan taitavia testaajia Ohjelmistotekniikka Ohjelmistojen testaus, 2015 205(504) Tutkiva testaus: Miksi? 1/2 • Testaus on hyvä perustaa siihen, mitä toteutus kertoo – Ollaan täydellisen realisteja. Ei luoteta dokumentteihin, vaan siihen, mitä on oikeasti saatu aikaan. Mitä toimintoja oikeasti on mukana? – Määrittelyt ovat aina vajaita ja virheellisiä – ei jäädä puuttuvien määrittelyjen ansaan – (Tietenkin on tiedettävä, miten ohjelmiston pitäisi toimia) • • Aikaa ei kulu testauksen suunnitteluun, vaan saadaan nopeammin tuloksia. – Nopea testauksen käynnistys – Nopea reagointi muutoksiin – Saadaan nopeasti palautetta kehittäjille Tutkiva testaus sopii tilanteisiin, joissa vaatimukset muuttuvat jatkuvasti – Suunnitelmat olisivat muuten aina vanhentuneita Ohjelmistotekniikka Ohjelmistojen testaus, 2015 206(504) Tutkiva testaus: Miksi? 2/2 • Kun ollaan avoimin silmin liikkeellä, löydetään paremmin virheitä kuin jos käytetään vain valmiiksi mietittyjä testitapauksia – Liiallinen suunnittelu luo ennakko-odotuksia ja sulkee silmiä havainnoilta • Osataan tunnistaa sellaisia piirteitä ohjelmistosta, jotka eivät ole määrittelyvaiheessa nousseet esille • Ohjelmistot ovat niin monimutkaisia, että testitapauspohjainen lähestymistapa ei riitä – Kaikkia testitapauksia ei pysty määrittämään; ei ole tarpeeksi aikaa • Toimintojen tekninen riskitaso paljastuu vasta, kun toteutus alkaa, tutkimalla ohjelmistoa • Sen avulla opitaan järjestelmästä • Se sopii käyttäjien näkökulmaan • Testaus on joka kerta erilaista, joten kyetään löytämään uusia virheitä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 207(504) Tutkiva testaus: Ongelmia • Testauksen laadun todentaminen on vaikeaa • Tarvitsee taitoja ja ohjausta – muuten siitä on vähän hyötyä. – Huonosti tehtynä voi olla hyvin huonoa… • Testauksen formaali osoittaminen vaikeaa – Puuttuu speksejä, raportteja • Käytettävät tekniikat eivät kunnolla dokumentoituja • Usein onkin hyvä, ettei rajoituta yhteen testaustyyliin – tutkiva testaus on vain kokonaisuuden osa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 208(504) 5.2 Tutkiva testaus: Esimerkkejä • Tuotteen käyttäytymisen tutkiminen – Miten juuri toteutettu uusi toiminnallisuus toimii? • Ketterä savutestaus • Kattava ominaisuuksien testaus – Järjestelmätestauksessa, hyväksymistestauksessa • Ketterä regressiotestaus (täydentämässä systemaattisia menettelyjä) • Oireiden taustalla olevien asioiden analysointi tarkemmalla tutkimisella – Esimerkiksi kuormitustestauksen tulosten syiden selvittäminen tarkemmilla testeillä ja mittaroinnilla • Käytettävyystestauksen ensimmäinen vaihe, jossa pyritään ennen kaikkea ymmärtämään uutta ohjelmistokonseptia Ohjelmistotekniikka Ohjelmistojen testaus, 2015 209(504) Tutkiva testaus: Sovellusalueita • Ketterässä kehittämisessä • Systemaattisessa kehittämisessä • Asiakkaan hyväksymistestauksessa – Eräät suomalaiset valtion virastot ovat siirtyneet pääasiassa ketterään testaukseen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 210(504) 5.3 Tutkiva testaus perustuu strategioihin ja tietoon • Ohjelmiston ymmärtämiseen • Havaintoihin – tunnistetaan ongelmien oireita ja alueita ohjelmistossa, joissa voi piillä virheitä? • Strategioihin – millaisella mentaliteetilla virheitä etsitään? – Esim. ohjelmiston ”rikkominen” • Kokemustietoon – millaisia virheitä on aiemmin ollut ja millä alueilla? • Testaus on intellektuaalista, haastavaa työtä • Testaaja on etsivä! Ei testitapauksia syöttävä robotti Ohjelmistotekniikka Ohjelmistojen testaus, 2015 211(504) Ohjelmiston ymmärtäminen kokeilemalla ja havainnoimalla • Silmät avoinna kaikelle • Käyttöskenaarioiden kulku viitekehyksenä • Ohjelmiston erilaisten elementtien tunnistaminen • Tapahtumien tunnistaminen – Miten ohjelma käyttäytyy, miten se reagoi • Tilojen tunnistaminen • Muutokset – Tilasiirtymät – Muutokset datassa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 212(504) Havaintojen tekeminen käyttäytymisestä • Mikä on tuttua • Mikä on uutta, vierasta? – Millä logiikalla se toimii? • Ohjelman reagointi – Käyttönopeus – Erilaiset sekvenssit – Erilainen data – Ensimmäinen kerta ja sen jälkeen • Perinteiset ongelmat vastaavissa sovelluksissa ja tilanteissa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 213(504) Mentaliteetti testauksessa • Kaikki on sallittua • Tiedetään, että virheitä on; ne on vain löydettävä • Pyritään "rikkomaan" ohjelmisto – Ollaan kovakouraisia – Bittejä saadaan aina lisää – antaa ohjelman kaatua • Hyödynnetään kokemusta • Hyödynnetään omaa ”vainua” Ohjelmistotekniikka Ohjelmistojen testaus, 2015 214(504) 5.4 Session lähtökohdat 1/2 • Tavoite – Oppiminen vai ohjelmiston rikkominen vai jokin muu? • Ohjelmiston ymmärtäminen – Ohjelmiston tarkoitus ja käyttö – Uusien toimintojen tarkoitus ja käyttö – Mitkä asiat tässä tilanteessa tuottavat suurimman arvon asiakkaalle? Miten ne toimivat? – Siis: Mihin asioihin liittyy suurin riski siitä, että asiat eivät onnistu tai toimivat väärin? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 215(504) Session lähtökohdat 2/2 • Ohjelmiston ja käyttäjän yhteistyön ymmärtäminen – Millaisia käyttöskenaarioita on ja voi olla? – Mitä tiedetään tyypillisestä käytöstä? – Millaisia kaikkia poikkeuksia voi kuvitella. – Entä tahallinen väärinkäyttö? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 216(504) Mielentila • Tutkiva testaus on aivotyötä ja edellyttää sopivia olosuhteita • Ei aikapaineita (vaikka testaukseen voikin olla annettu vain tietty aika – se on vain raami) • Realistinen ajatus bugeista ja valmius niiden näkemiseen missä tahansa • Suuntautuminen siihen, millä on oleellista • Valmius käsitysten muuttamiseen uusien havaintojen myötä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 217(504) Session kulku • Käyttöskenaariot, käyttötapaukset hyvä lähtökohta • Erityyppisten käyttäjien toimintamallit • Ei tarkkaa kuvausten antamaa ohjausta – vain viitekehys – Tiukka seuraaminen olisi systemaattista testausta… • Seurataan havaintoja, annetaan koetun suunnata testauksen kulkua Ohjelmistotekniikka Ohjelmistojen testaus, 2015 218(504) 5.5 Suorituksen dokumentointi? • Testilokeja tarvitaan aina • Omien ajatusten ulkoistaminen edes kirjoittamalla tekee ajattelusta parempaa – ja parantaa testausta • Automaattinen logitussovellus taustalla tukee muistiinpanoa • Seuraavalla sivulla on yksi esimerkki ketterän testauksen logista Ohjelmistotekniikka Ohjelmistojen testaus, 2015 219(504) Esimerkkitestiloki Ohjelmistotekniikka Ohjelmistojen testaus, 2015 220(504) 5.6 Tutkiva testaus arjessa 1/2 • Ketterän testauksen tavat ovat väistämättä tärkeitä periaatteita • Käytännön ohjelmistoteollisuudessa ei voida toimia kirkasotsaisesti yksien periaatteiden mukaan • Tutkiva testaus on jo pitkään nähty tärkeänä osana hyvinkin suunniteltua testausprojektia • Hyvään testaustapaan kuuluu ylipäätään aina se, että testaustapoja muutetaan, kun saadaan uusia havaintoja tuotteesta ja vanhat tavat eivät enää paljasta virheitä. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 221(504) Tutkiva testaus arjessa 2/2 • Olennaista on se, että tutkiminen myös tuottaa uusia testitapauksia, jotka otetaan mukaan päivitettyihin testispekseihin – – • Uusi tieto saadaan jaettua kaikille testaajille Tämä vähentää riskejä Termit ovat tärkeitä – ”Tutkiminen” on helpompi hyväksyä systemaattisessa ohjelmistokehityksessä kuin minkäänlainen "ad-hoc"-toiminta • Ollakseen tehokkainta, tämä testaustapa pitää hyväksyä tärkeänä testausmenetelmänä ja siihen pitää antaa aikaa osaavimmille testaajille • Mutta hyvä testaus koostuu erilaisista tavoista ja tyyleistä ja yhden ei ole hyvä antaa dominoida – ainakaan kunnes sen tiedetään toimivan erinomaisesti Ohjelmistotekniikka Ohjelmistojen testaus, 2015 222(504) 5.7 Uusien toimintojen nopea testisuunnittelu • Interaktion taso: – Lähtökohtana käyttäjätarina, käyttötapaus – Toimii suoraan tutkivan testauksen lähtökohtana • Logiikan taso: – Perinteiset testaustekniikat – ekvivalenssiositus, rajaarvoanalyysi, päätöspuut, tilamallipohjainen testaus • Fyysinen taso: – Tapahtumien monitorointi ohjelmallisesti osana tutkivaa testausta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 223(504) 5.8 Ennakkovarautuminen • Ketterässä testauksessa on hyvä olla ennakkokäsityksiä testattavista asioita – Niiden avulla on heti luotavissa käsitys siitä, mitä kaikkea uudessa toiminnallisuudessa on hyvä testata – Luettelo tietynlaisten sovellusten ja toiminnallisuuksien yleisistä testattavista asioista (esim. lista ”Ohjelmistojen yleiset testattavat asiat”) – Kaikki uudetkin systeemit ovat jossain määrin vanhan toistoa – Listat tyypillisistä virheistä tietynlaisissa toteutuksissa ovat hyödyllisiä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 224(504) 5.9 Ketterä testaus ei-ketterässä projektissa 1/4 • Jokainen projekti sisältää aina ketteriä piirteitä • Ymmärretään että: – Projekti ei koskaan tapahdu täysin ennakkosuunnitelmien mukaan – Testaus tuottaa uutta tietoa, johon on reagoitava • Vaikka testausta tehtäisiin hyvin suunnitelmallisesti, projektin testauksessa on tärkeää olla myös ketterästi tehtyjä osuuksia Ohjelmistotekniikka Ohjelmistojen testaus, 2015 225(504) Ketterä testaus ei-ketterässä projektissa 2/4 • • Testaussuunnittelu – Testauksen W-malli, jossa testauksen peruspiirteet suunnitellaan projektin alussa, mutta tarkempi testaus sitten, kun tuote alkaa valmistua testattavaan kuntoon Dynaaminen ohjaus – Vaikka tuotteella on buildaussuunnitelma, testaus sovitetaan ketterästi siihen, miten ohjelmiston osat valmistuvat – Testauksen painotuksia eri osa-alueille muutetaan dynaamisesti sen perusteella, paljonko vikoja löytyy ja mikä on eri osa-alueiden riskitaso – Jokaisen testikierroksen testisetti on viime kädessä tapauskohtainen valinta – Testisettejä päivitetään asiakkailta ja sidosryhmiltä saatavien havaintojen perusteella Ohjelmistotekniikka Ohjelmistojen testaus, 2015 226(504) Ketterä testaus ei-ketterässä projektissa 3/4 • Tutkiva testaus – Testauksessa on aina mukana vapaamuotoinen osuus – Uuteen versioon tutustuminen tehdään tutkivalla testauksella; se tuottaa käsityksiä systemaattisen testauksen kohteista ja on siten myös osa testaussuunnittelua – Kun systemaattinen testaus ei enää tuota tehokkaasti uusia vikoja, siirrytään vahvemmin tutkivaan testaukseen – Havaintojen perusteella päivitetään myös systemaattisen testauksen testejä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 227(504) Ketterä testaus ei-ketterässä projektissa 4/4 • Kokonaisuus on siis yhdistelmä ennakkosuunnittelua ja ketterää reagointia Testauksen pääsuunnitelma Dynaaminen muuttaminen: testitapaukset ja painotukset Tutkiva testaus Tuottaa tietoa Systemaattinen testaus Jatkaa ja täydentää Ohjelmistotekniikka Tutkiva testaus Ohjelmistojen testaus, 2015 228(504) Riskialttiiden asioiden nopea verifiointi • Ketteryydessä on keskeistä kyky tarttua nopeasti riskialttiisiin asioihin • Jos esimerkiksi projektissa toteutetaan mm. uudentyyppinen protokolla, sen toimivuutta ei verifioida pelkästään normaalin testauksen puitteissa, vaan verifiointi pyritään tekemään välittömästi erottamalla protokollan toteutus ja testaamalla se niin pian kuin mahdollista – Näin saadaan osoitettua, että protokollaa voidaan käyttää – Siihen liittyvä riski voidaan sulkea Ohjelmistotekniikka Ohjelmistojen testaus, 2015 229(504) Eräs kaksivaiheinen tutkivan testauksen malli 1. Uusille toiminnallisuuksille ensimmäisillä testauskierroksilla tehtävä testaus, jolla opitaan tuotteen käyttäytymisestä 2. Myöhempien testauskierrosten ketterä testaus, joka jatkaa virheiden etsimistä sitten, kun systemaattinen testisuunnittelu ei enää löydä virheitä tehokkaasti – Samalla vaihdetaan ”likaisempaan” testiympäristöön • Näiden välissä systemaattisempaa testausta. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 230(504) a) Uuden toiminnallisuuden ensimmäisten testauskierrosten testaus 1/2 • Sovellustilanne: – Uutta buildia ei ole testattu systemaattisesti; ei tiedetä, miten se toimii ja käyttäytyy – Se on saattanut läpäistä automaattiset savutestit • Tavoitteet – – – – – Opitaan uudet toiminnallisuudet Tutkitaan ja ymmärretään sovellusta Tarkkaillaan, miten se käyttäytyy Havainnoidaan mahdollisia / tunnettuja ongelma-alueita Löydetään virheitä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 231(504) a) Uuden toiminnallisuuden ensimmäisten testauskierrosten testaus 2/2 • Taktiikka ja menettelyt – – – – – – – Suoritetaan täysiä käyttötapauksia "kokeilevassa mielentilassa" Kokeillaan kaikkea ainakin kerran Toimitaan puhtaassa testiympäristössä Tehdään muistiinpanoja häiriöistä, hitaudesta, järjestelmän tilasta jne... Kokeillaan sovelluksen alueita, joilla on aiemmin ollut virheitä Tunnistetaan ja raportoidaan virheitä Tarkistetaan myöhemmin muistiin (paperille ja mieleen) laitettujen asioiden pohjalta, että testispeksit kattavat kaikki epäilyttävät alueet Ohjelmistotekniikka Ohjelmistojen testaus, 2015 232(504) b) Myöhäisten testikierrosten tutkiva testaus 1/4 • Sovellustilanne – Uusi buildi on testattu systemaattisesti • Perusidea: – Testaustapojen vaihtaminen auttaa löytämään uusia virheitä – Käytetään tutkivaa testausta uusien virheiden löytämiseen – Sovelletaan tekniikoita, joita ei ole aiemmin käytetty projektissa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 233(504) b) Myöhäisten testikierrosten tutkiva testaus 2/4 • Taktiikka ja menettelyt – Käytetään tutkivia tekniikoita virheiden löytämiseen – Käydään läpi alueita, joilla on ollut paljon virheitä – Testataan virallisten testitapausten "ympärillä" tavoitteena ohjelmiston "rikkominen" – Suoritetaan kokonaisia käyttötapauksia – Testaus tehdään "likaisessa" testiympäristössä – tämä auttaa ongelmiin törmäämisessä – Testausta muutetaan tuotteen käyttäytymisen perusteella; keskitytään alueisiin, jotka ovat hitaita, joissa on odottamattomia ilmiöitä jne. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 234(504) b) Myöhäisten testikierrosten tutkiva testaus 3/4 – – – – – – Käytetään mielikuvitusta ohjelmiston monimutkaisilla alueilla Aseta itsesi noviisin mielentilaan (joka ei ymmärrä mitään) ja expertin mielentilaan (joka kokeilee kaikkea, koska "siihen on oikeus") tai toimi kuin lapsi Tee satunnaisia asioita. Tee samanaikaisia asioita. Keskeytä asioita (mobiililaitteen tapahtuma, PC:n tapahtuma, kollegan tekemä keskeytys!) jne. Tee virheitä! Raportoi kaikki virheet Tarkista testispeksit ja ehdota uusia testitapauksia Ohjelmistotekniikka Ohjelmistojen testaus, 2015 235(504) b) Myöhäisten testikierrosten tutkiva testaus 4/4 1. Valitse rooli, jossa toimit (simuloi jotain käyttäjäryhmää käytettävien toimintojen osalta) 2. Valitse sen pohjalta testiympäristö 3. Valitse käyttötapaukset ja priorisoi ne 4. Tunnista prioriteetit – Uudet toiminnot, muutokset – Millä alueilla on ollut virheitä – Toimintojen prioriteetit (tuotteen ja valitun käyttäjäryhmän kannalta) 5. Suorita kokeileva testikierros 6. Suorita virheitä tekevä testikierros 7. Suorita kuormittava testikierros 8. Sovita toimintasi havaintoihisi ja improvisoi! Ohjelmistotekniikka Ohjelmistojen testaus, 2015 236(504) 6. Riskianalyysi ja testien priorisointi • Riskianalyysiä tehdään – Tiedostamatta: jos jätän tenttiin luvun viimeiseen iltaan, millä todennäköisyydellä reputan ja mitä seurauksia siitä on? – Tiedostaen: mikäli organisaation avainhenkilöiden täytyy matkustaa samana päivänä samaan kohteeseen, kannattaako heidät laittaa samalle lennolle? • Turvallisuuskriittisten järjestelmien kehittämisessä riskianalyysi on pakollista, muualla suositeltavaa – Riskianalyysiin ei ole "yhden koon malleja" – Jokaisessa organisaatiossa pitäisi olla henkilö, joka osaa suunnitella projekteille tehokkaan ja yksinkertaisen käytännöt • Riskianalyysin menettelyt vaihtelevat eri tilanteissa. Tässä luvussa esitetään vain muutama tapa, joka sopii testauksen suuntaamiseen. Esim. projektin riskianalyysi olisi hieman erilainen. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 237(504) Erilaisia riskejä • On olemassa kahdenlaisia riskianalyysejä (ja riskejä) – Projektiriskit. Mikä voisi mennä pieleen projektissa? Aikataulut, käytettävissä henkilöitä, teknisiä ongelmia... – Tuoteriskit. Mitkä asiat tuotteessa voisivat aiheuttaa ongelmia käyttäjälle? • Kun suunnittelemme testausta, jälkimmäinen on tärkein – Valitettavasti kaikista mahdollisista testeistä voidaan dokumentoida ja ajaa vain pieni osa – Riskianalyysiä käyttämällä voidaan testejä priorisoida: aloitetaan niillä, jotka testaavat tärkeimpiä asioita ja jatketaan muihin, jos on aikaa – Riskianalyysin tuloksilla voidaan myös vakuuttaa projektin johto siitä, että asiat pitää tehdä tietyllä tavalla Ohjelmistotekniikka Ohjelmistojen testaus, 2015 238(504) 6.1 Käytön ymmärtäminen lähtökohtana • Tärkeää ymmärtää tuotteen käyttöä – Miten tuotetta käytetään? – Millainen on työprosessi, mikä siinä on tärkeää? – Mitä tehdään eniten – eli millaisten toimintojen ja ominaisuuksien on oltava hyvässä kunnossa – Millaisten asioiden on onnistuttava varmasti – missä ei saa tulla koskaan ongelmia • Esimerkiksi tietojärjestelmän käyttäjillä on perustehtäviä, joita käytetään koko ajan – niiden on toimittava varmasti • Ja tietoturvallisuuden vuoksi on monien asioiden oltava pomminvarmoja • Käyttäjän toiminta & liiketoimintataso on oman riskien tunnistamien paikka Ohjelmistotekniikka Ohjelmistojen testaus, 2015 239(504) 6.2 Riskianalyysin kulku 1/5 • Käyttäjälähtöisen yksinkertaisen riskianalyysiprosessin kulku: Kokoa riskianalyysisessio Käytä järjestystä testien priorisointiin Ohjelmistotekniikka Listaa järjestelmän toiminnot (ja ominaisuudet) Järjestä omiNaisuudet riskin mukaan Arvioi niiden käytön yleisyys Arvioi tuloksia ja muuta tarvittaessa Ohjelmistojen testaus, 2015 Arvioi toimintojen tärkeys käyttäjille Laske riskipohjeinen prioriteetti 240(504) Riskianalyysin kulku 2/5 • Riskianalyysi pitäisi tehdä mahdollisimman aikaisessa vaiheessa projektia • Aivoriihen (brainstorming team) kokoaminen: mukana esim. käyttäjiä, kehittäjiä, testaajia sekä henkilöitä markkinoinnista, asiakaspalvelusta sekä teknisestä tuesta – Tavoitteena mahdollisimman laaja tietämys tuotteesta ja toimialasta – Muutaman tunnin sessio, jolla käsikirjoitus ja vetäjä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 241(504) Riskianalyysin kulku 3/5 • Listataan tuotteen toiminnot ja muut ominaisuudet – Eli kaikki se, mihin testaus tulee kohdistumaan – Mietitään tärkeimmille käyttäjäryhmille, miten usein ominaisuuksia käytetään ja miten tärkeä ominaisuus on käyttäjälle, miten olennaista on toiminnon toimiminen hyvin – Karkeina numeerisina arvioina 1…5 • Taajuuden asteikko esim. 1-5 (harvoin, silloin tällöin, päivittäin, monta kertaa päivässä, jatkuvasti) • Tärkeyden asteikko esim. 1-5 (kosmeettinen haitta, hidastus, ylimääräistä työtä, vakava vahinko, kuolema) – Niiden tulo kertoo riskin ja testauksen prioriteettia kuvaavan luvun – Arvioidaan mieluummin ylöspäin pyöristäen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 242(504) Riskianalyysin kulku 4/5 • Analyysi listataan yleensä taulukkoon. Esimerkkinä puhelinsovellus Ominaisuus Käytön taajuus (1-5) Onnistumisen kriittisyys (1-5) Prioriteetti (tulo) Puhelun soitto 5 3 15 Hätäpuhelu 1 5 5 (kuitenkin kriittinen…) Soittajan nimen 5 näyttö 1 5 Ohjelmistotekniikka Ohjelmistojen testaus, 2015 243(504) Riskianalyysin kulku 5/5 • Taulukko ja keskustelu on vain väline yhteisen ymmärryksen luomiseen • Tulosten perusteella nähdään, mitkä tuotteen osa-alueet ovat sellaisia, joihin pitää panostaa testaamalla ja muilla keinoin – Kun analyysi tehdään ennen systeemin suunnittelua, voidaan suunnitteluunkin vaikuttaa • Taustaksi tarvitaan tietoa käyttäjien toiminnasta – ilman sitä ei hyvä testauskaan ole mahdollista Ohjelmistotekniikka Ohjelmistojen testaus, 2015 244(504) Riskianalyysi toteutuksen näkökulmasta • Edellä katseltiin toimintoja käyttäjän näkökulmasta • Kun tiedetään tiedetään ohjelman toteutusprosessi, voidaan ottaa senkin piirteitä huomioon ja miettiä, miten altis projekti on bugien syntymiselle • Pohdi tällöin vaikkapa pääkomponenteittain – Paljonko on uutta koodia – uusi on virhealtista – Onko toteuttava tiimi uusia – uuden tiimin työtä pitää katsella tarkemmin – Onko jokin teknologia uusi ja vasta kypsyvä – pitää testata tarkemmin • Riskianalyysi keskittyy usein liikaa tähän näkökulmaan, ottamatta huomioon eri ominaisuuksien käyttöä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 245(504) Riskianalyysejä päivitettävä • Niin kuin muitakin dokumentteja, myös riskianalyysin tuloksia täytyy pitää yllä – Esim. vaatimusten muuttuessa • Kun ryhdytään tekemään järjestelmän uutta versiota, voidaan yleensä edellisen riskianalyysin tuloksia hyödyntää – Muutettavien osien kohdalta riskit yleensä kasvavat – Yleensä häiriöiden todennäköisyydet muuttuvat ennemmin kuin niiden vaikutukset Ohjelmistotekniikka Ohjelmistojen testaus, 2015 246(504) Turvallisuuskriittisten järjestelmien riskianalyysit • Edellä tarkasteltiin "tavallisia" ohjelmistoja • Turvallisuuskriittisten järjestelmien riskianalyysit on tehtävä tarkemmin • Lähtökohta niissä on systemaattinen turvallisuusanalyysi tai vaaran arviointi, jossa tarkastellaan esim. käyttötehtävien kulkua tai systeemin osia ja arvioidaan niistä koituvaa vaaraa • Tarkempaan sen kulttuurin toimintamallien käsittelyyn ei ole tässä mahdollisuutta • Perusperiaate on: Mitä suuremmat riskit, sitä systemaattisemmin riskianalyysi pitää tehdä ja sitä enemmän sille on virallisia tai "kulttuurisia" vaatimuksia Ohjelmistotekniikka Ohjelmistojen testaus, 2015 247(504) MoSCoW-menetelmän priorisointitapa • Toinen priorisointitapa on MoSCoW-menetelmään, joka määrittelee seuraavat neljä prioriteettia (alenevassa tärkeysjärjestyksessä): – – – – Must test Should test Could test Won’t test • Ks. “Successful Test Management: An Integral Approach”, Iris Pinkster & Bob van de Burgt & Dennis Janssen & Erik van Veenendaal, Springer, 2004. & https://en.wikipedia.org/wiki/MoSCoW_Method Ohjelmistotekniikka Ohjelmistojen testaus, 2015 248(504) Esimerkki MoSCoW-arvioinnista Kaikki asiakkaat kärsivät Must test Yksi asiakkaista kärsii Must test Kaikki asiakkaat kärsivät Must test Yksi asiakkaista kärsii Should test Me menetämme rahaa Ei kiertotietä Should test Kiertotie on olemassa Could test Kukaan ei menetä rahaa Ei kiertotietä Could test Kiertotie on olemassa Won’t test Ihmisiä kuolee Jos tämä vaatimus ei toteudu… Ohjelmistotekniikka Asiakkaat menettävät rahaa Ohjelmistojen testaus, 2015 249(504) Edistymisen seuranta, eräs esimerkki testatut vaatimukset toimitus Could test arvio Should test toteutunut Must test aika Ohjelmistotekniikka Ohjelmistojen testaus, 2015 250(504) Hienojakoinen MoSCow… • Joissain projekteissa voidaan tarvita vielä hienojakoisempaa priorisointia – Testijoukot kootaan testitapauksista, jotka perivät testijoukon MoSCoW-prioriteetin • Testijoukko voi vastata esim. yhden vaatimuksen testejä – Testijoukon sisällä, testitapaukset priorisoidaan vielä asteikolla High, Medium ja Low – Nyt voidaan tehdä päätös, että esimerkiksi Should test – prioriteetin omaavasta joukosta ajetaan vain High-prioriteetin omaavat testit – Huom! Eri joukkoihin kuuluvien testien prioriteetit eivät välttämättä enää ole vertailukelpoisia keskenään • Onko Should test Low tärkeämpi testitapaus kuin Could test High? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 251(504) Testikohteen riskien ja vaatimusten yhteensovittaminen • Jos on olemassa riski, mutta ei sitä vastaavaa vaatimusta, pitää miettiä onko riski turha vai pitääkö sitä vastaava vaatimus lisätä • Jos on olemassa vaatimus, mutta ei siihen liittyvää riskiä, voidaan riski joko lisätä tai sitten vaatimus poistaa turhana • Riskianalyysi voi siis parantaa myös vaatimusmäärittelyn laatua • Analyysiä voidaan käyttää myös taloudelliselta näkökantilta katsottuna – Ei arvioidakaan suoraan häiriöiden vaikutusta käyttäjiin, vaan pikemminkin ohjelmiston tuottamaan rahamäärään – Esim. mikäli jokin ominaisuus on äärimmäisen tärkeä jollekin hyvin maksavalle asiakkaalle, voidaan tämä ottaa huomioon häiriön vaikutusta arvioitaessa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 252(504) 7. Testauksen dokumentoinnista • Kuten ohjelmistotuotannossa yleensä, dokumentoinnilla on merkittävä osuus testauksessa – Dokumentteja (dokumentti-dokumentteja ja tietojärjestelmien sisältöjä) syntyy usein paljon – Niiden kirjoittamiseen voi kulua huomattavan paljon aikaa – Dokumenttien ja varsinaisten testien synkronointi voi muodostua ongelmaksi • Dokumentoinnin tarkoituksena on saada tieto suunnittelijoiden ja testaajien korvien välistä muotoon, jota muutkin voivat käyttää – Kun asiat kirjataan ylös, huomataan yleensä puutteita ja väärinkäsityksiä – Asiat pitää muistaa myöhemminkin – Dilemma: miten dokumentoida kaikki tarpeelliset asiat, mutta ei mitään turhaa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 253(504) 7.1 Testauksen korkean tason suunnitteludokumentit • Testauksen suunnittelun tavoitteena on tehdä testien suorittaminen ja niistä raportointi mahdollisimman helpoiksi – Projektisuunnitelma: • Mitä dokumentteja tuotetaan • Kuka tuottaa • Milloin • Testauksen yleissuunnitelmasta (päätestaussuunnitelma) on hyötyä: – – – – Yleinen lähestymistapa testaukseen – mitä, miten, koska Testien aikataulut Testausvaiheiden aloitus- ja lopetusehdot Kuka vastaa ja mistä (mm. testiympäristöjen pystyttäminen jne.) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 254(504) 7.2 Testauksen suunnittelun prosessi • Testauksen suunnittelu [Haikala&Märijärvi 06] mukaillen: Kokemus, tarkistuslistat Ohjelmiston vaatimukset Projektin elinkaarimalli Testauksen ja testien suunnittelu Noudatettavat standardit (mm. turv. kriitti.) Yrityksen toimintaohjeet Ohjelmiston määrittelyt Testien tarkempi suunnittelu (oikeaan aikaan) Aiemmat projektit Testitapausten, skriptien suunnittelu ja toteutus yms. Testien suoritus Testiraportit Ohjelmistotekniikka Ohjelmistojen testaus, 2015 255(504) Suunnitteludokumenttien suunnittelusta 1/2 • Suunnitelmia laadittaessa pitää muistaa niiden tarkoitus ja vaatimukset – Hyvä dokumentointi auttaa keskittymään oikeisiin asioihin kun se ”mitä” tai ”miten” ollaan testaamassa muuttuu – Mitä suunnitelmia vaaditaan – Keiden pitää hyödyntää niitä ja ymmärtää ne • Esim. hyväksymistestaussuunnitelmaa pitää ymmärtää ihmisten, jotka eivät tiedä testauksesta paljoakaan – Alan ja päämiehen kulttuuri ja tottumukset – Isoihin projekteihin enemmän suunnittelua kuin pieniin – Suunnitelmilla jaetaan tietoa ja luodaan luottamusta – Jos asiat eivät sujukaan, suunnitelmat ja niissä todetut kompromissit ovat tärkeä suoja testaajille Ohjelmistotekniikka Ohjelmistojen testaus, 2015 256(504) Suunnitteludokumenttien suunnittelusta 2/2 • Suunnitelmia pitää muistaa päivittää • Suunnitteluprosessi on tärkeämpi kuin suunnitelmat – Jaetaan näkemyksiä, kokemuksia ja tietoa, opitaan • Testityökalut saattavat auttaa dokumentoinnissa – Tietyntyyppisten dokumenttien (osittainen) generointi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 257(504) Suunnitteludokumentaation kokonaisuudesta 1/2 • Kuten testauksen vaiheistaminenkin, dokumentointi pitää suunnitella projektin koon, riskitason ja testattavan järjestelmän perusteella • Aina tarvitaan jokin suunnitelma • Pienellä projektilla riittää yleensä yksi yleinen testaussuunnitelma, joka kattaa sekä integrointi- että järjestelmätestauksen – Suunnitelma tehdään määrittelyn yhteydessä ja sitä täydennetään myöhemmin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 258(504) Suunnitteludokumentaation kokonaisuudesta 2/2 • Suuremmilla projekteilla tehdään päätestaussuunnitelma, joka kuvaa testauksen kokonaisuuden ja eri testaustasoille ja testityypeille omat suunnitelmat • Päätestaussuunnitelma on tärkeä. Sen avulla jaetaan tietoa siitä, mitä kaikkea testausta on ajateltu tehtävän. Päätestaussuunnitelma Järjestelmätestaussuunnitelma Integrointitestaussuunnitelma Yksikkötestaussuunnitelma Ohjelmistotekniikka Ohjelmistojen testaus, 2015 259(504) 7.3 IEEE 829 antaa osviittaa suunnitelmiin • IEEE 829-2008, Standard for Software and System Test Documentation, on yksi niitä harvoja standardeja, joita testauksessa käytetään • Sen mukaan on tehty paljon testaussuunnitelmia ja raportteja • Hyvä uutinen: Standardin uusin versio ymmärtää, että tilanteet ja tarpeet vaihtelevat ja silloin saa dokumentaation laajuus ja sisältökin vaihdella Ohjelmistotekniikka Ohjelmistojen testaus, 2015 260(504) 1. Introduction IEEE 829:n esimerkkirunko päätestaussuunnitelmalle 1.1 Document identifier 1.2 Scope 1.3 References 1.4 System overview and key features 1.5 Test Overview 1.5.1 Organization 1.5.2 Master test schedule 1.5.3 Integrity level schema 1.5.4 Resources summary 1.5.5 Responsibilities 1.5.6 Tools, techniques, methods, and metrics Ohjelmistotekniikka 2. Details of the master test plan 2.1 Test processes including definition of test levels 2.1.1 Process: management 2.1.2 Process: acquisition 2.1.3 Process: supply 2.1.4 Process: development 2.1.5 Process: operation 2.1.6 Process: maintenance 2.2 Test documentation requirements 2.3 Test administration requirements 2.4 Test reporting requirements 3. General 3.1 Glossary 3.2 Document change procedures and history Ohjelmistojen testaus, 2015 261(504) IEEE 829:n esimerkkirunko yhden testaustason suunnitelmalle 3. Test management 1. Introduction 1.1 Document identifier 1.2 Scope 1.3 References 1.4 Level in the overall sequence 1.5 Test classes and overall test conditions 2. Details for this level of test plan 2.1 Test items and their identifiers 2.2 Test traceability matrix 2.3 Features to be tested 2.4 Features not to be tested 2.5 Approach 2.6 Item pass/fail criteria 2.7 Suspension criteria and resumption requirements 2.8 Test deliverables Ohjelmistotekniikka 3.1 Planned activities and tasks; test progression 3.2 Environment / infrastructure 3.3 Responsibilities and authority 3.4 Interfaces among the parties involved 3.5 Resources and their allocation 3.6 Training 3.7 Schedules, estimates, and costs 3.8 Risk(s) and contingency(s) 4. General 4.1 Quality assurance procedures 4.2 Metrics 4.3 Test coverage 4.4 Glossary 4.5 Document change procedures and history Ohjelmistojen testaus, 2015 262(504) 7.4 Matala taso: testitapausten dokumentointi • Testitapauksia ei yleensä suositella kuvattavaksi suunnitelmadokumenteissa, vaan – – – – Testauksenhallintajärjestelmässä Erillisessä dokumentissa, vaikkapa Excel-taulukossa Tai jossain muualla, missä niiden ylläpito on helppoa Yksikkötestauksen testitapaukset dokumentoidaan niiden testikoodissa (josta voi tuottaa listauksia) • Testitapausten ei pidä olla jotain, mikä jäädytetään, vaan jatkuvasti kehittyvää testauksen "raaka-ainetta", joten niiden käsittelyn on oltava helppoa ja tapahduttava yhdessä paikassa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 263(504) 7.5 Pienissä projekteissa kevyesti • Pienissä projekteissa testaussuunnitelmat voidaan sisällyttää muihin suunnitelmiin – Tavoite: dokumenttien ja niiden sivujen määrän minimointi – Järjestelmätestaussuunnitelma voidaan sisällyttää projektisuunnitelmadokumenttiin – Integrointitestaussuunnitelma voidaan sisällyttää suunnitteludokumenttiin – Kunkin moduulin suunnittelun yhteyteen voidaan liittää sitä vastaavan testiympäristön ja testitapausten määrittely Ohjelmistotekniikka Ohjelmistojen testaus, 2015 264(504) 7.6 Testausraportit • Erityisiä testausraportteja tehdään yleensä järjestelmätestaustasolla tietyn buildin testaukselle – • Niitä tukee reaaliaikainen näkymä testauksen edistymiseen testauksenhallintajärjestelmässä Testausraportin runko-esimerkki: – – – – – – – Johdanto Ristiriidat ja poikkeamat Kattavuustarkastelu Tulokset Arviointi Toiminta Hyväksyminen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 265(504) 7.7 Hyvä testausraportti • • • • Hyvä raportti tarjoaa juuri sitä sisältöä, mitä tarvitaan raportointihetkellä. Se on tehty niiden ihmisten luettavaksi, jotka tietoa tarvitsevat (esitystavat, detaljit, asioiden järjestys). Lyhyys ja kompaktius on etu. Raporttien kirjoittaminen tai odottaminen ei saa aiheuttaa viiveitä toimintaan. – • Raportoitava data on hyvä saada tuotettua automaattisesti, ei käsin syöttöä. Raportointi tukee testauksen dokumentointia mm. pakollisten standardien tarpeisiin (esim. turvallisuuskriittiset järjestelmät) ja auttaa toiminnan kehittämisessä. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 266(504) IEEE 829-2008:n dokumentaation rakenne 1/2 Huom: Testitasot voivat olla muitakin kuin tässä olevat esimerkit Master test plan (MTP) Acceptance test plan System test plan Component integration test plan Component test plan System test design System test procedures System test cases Test execution Ohjelmistotekniikka Ohjelmistojen testaus, 2015 267(504) IEEE 829-2008:n dokumentaation rakenne 2/2 Level interim test status report(s) Test execution Test level logs Acceptance test report Test level anomaly reports System test report Component integration test report Component test report Master test report Ohjelmistotekniikka Ohjelmistojen testaus, 2015 268(504) IEEE 829-2008:n suosittelemat dokumentit riskitason mukaan • Vertailu kriittisille ja triviaaleille projekteille (erimerkki, ei tarkka) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 269(504) Esimerkkejä IEEE 829-2008:n mukaisista dokumenttipohjista • Kurssin projektin sivulle on koottu dokumenttipohjia, jotka on tehty standardin esimerkkien perusteella. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 270(504) 7.8 IEEE 829-2008 – Ketterässä toiminnassa riittää vähäisempi dokumentaatio "6.2 Eliminate content topics covered by the process Some organizations are using agile methods and exploratory testing techniques that may de-emphasize written documentation. For testing software with agile methods, they can choose as little as a general approach test plan, and then no detailed documentation of anything except the Anomaly Reports. Some organizations use a blended approach combining agile testing with parts of the test documentation detailed in this standard. It is up to the individual organization to ensure that there is adequate documentation to meet the identified integrity level." Ohjelmistotekniikka Ohjelmistojen testaus, 2015 271(504) 8. Testauksen seuranta • Testauksen edistyminen yksikkö- ja integrointitestauksessa – Suositaan automaattisesti tehtäviä listauksia suoritetuista, läpäisseistä ja läpäisemättömistä testeistä – Testaustyökalut tekevät niitä "luonnostaan" – Seurataan testikattavuutta tuotteen osa-alueilla • Testauksen edistyminen järjestelmätestaustasolla – Suoritetut testit kirjataan testauksenhallintajärjestelmään (Quality Center, TestLink, Excel-taulukko) tai työtehtäväjärjestelmässä (kuten JIRA) – Testilokeja pidetään varsinkin tutkivassa testauksessa – Seurataan eri toimintojen testausta ja vaatimuskattavuutta – Verrataan haluttuun testauksen edistymiseen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 272(504) 8.1 Testauksenhallintaohjelmisto pähkinänkuoressa • • • • • • i Luo ja hallitse testitapauksia Organisoi testitapaukset testisuunnitelmiin Suorita testitapauksia ja kirjaa läpäisy buildeittain Seuraa tuloksia Laadi raportteja Testitapaukset voidaan linkittää vaatimuksiin – Vaatimuskattavuuden seuranta • Linkitys vikatietokantoihin, kuten Bugzilla, Mantis, JIRA • Esimerkki sellaisesta avoimen lähdekoodin TestLink http://www.teamst.org/ Ohjelmistotekniikka Ohjelmistojen testaus, 2015 273(504) 8.2 Virhetilanteen seuranta • Tärkeä näkökulma projektin etenemiseen • Löydetyt virheet kirjataan vikaraportteihin (raportti per virhe) – tästä lisää myöhemmin • Virheiden luokittelu (esim. mild, moderate, serious, catastrophic) – Liian monta tasoa hankaloittaa luokittelua • Yksikkö- ja integrointitestaustasolla virheitä ei yleensä listata • Järjestelmätestaustasolla virheet viedään vikatietokantaan (Bugzilla, Mantis tms.) – virheraportoinnista lisää myöhemmin • Seurataan testauksen kattavuusmittareita • Seurataan tilannetta tuotteen osa-alueittain ja säädetään tarpeen mukaan testaustapoja Ohjelmistotekniikka Ohjelmistojen testaus, 2015 274(504) 8.3 Testausraportti • Erityisten testausvaiheiden jälkeen tehdään usein testausraportti – Esimerkiksi jonkin buildin järjestelmä- tai hyväksymistestaus – Erityistestaukset, kuten käytettävyys- tai suorituskykytestaus • Tutkivan testauksen testilogit ovat osa raportin aineistoa • Testipäiväkirjan pitämisestä saattaa myös olla hyötyä – Testaajat pitävät usein omaa päiväkirjaa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 275(504) 9. Lisää testauksen menetelmistä ja tekniikoista • Tässä luvussa käsitellään dynaamiseen testaukseen liittyviä menetelmiä ja täydennetään näkemystä rikkaasta testauksen kokonaisuudesta. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 276(504) Tarjolla suuri määrä menetelmiä • Erilaisia tekniikoita on kehitetty valtava määrä – Käytettävä tekniikka täytyy valita tapauskohtaisesti – Yleisesti ottaen testauksessa on hyvin hankala löytää Best Practise™-tyyppisiä toimintatapoja – kaikki riippuu tilanteesta • Sopivan tekniikan valintaan kussakin tilanteessa voidaan antaa kuitenkin joitain nyrkkisääntöjä • Tekniikat yleensä täydentävät toisiaan ja niitä käytetään yhdessä, joustavasti soveltaen • Tekniikat voidaan myös luokitella usealla eri tavalla Ohjelmistotekniikka Ohjelmistojen testaus, 2015 277(504) Valinnan peruskysymyksiä • Tekniikoiden valinnan pohjaksi pitää miettiä monia kysymyksiä: – – – – – – – Hyödynnetäänkö testattavan ohjelman koodia vai ei? Kuka testaa? Millaisia asioita testataan? Minkä tyyppisiä ongelmia etsitään? Mitä pitää tehdä? Mistä tiedetään onnistuiko testiajo vai ei? Missä ohjelmistokehityksen vaiheessa ollaan? (Tehdäänkö koodia vai arvioidaanko soveltuvuutta käyttöön) • Tällaisia asioita tarkastellaan seuraavaksi. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 278(504) Menetelmien kuvailua tyypeittäin • Seuraava luokittelu jakaa tekniikat sen perusteella mihin em. kysymykseen ne pääsääntöisesti yrittävät vastata – Luokittelu ja kuvaukset perustuvat suurelta osin lähteeseen [Kaner et al. 02] • Eri tekniikoita pitää sopivasti yhdistellä aina tarpeen mukaan • Tekniikat muodostavat eräänlaisen työkalupakin – Ruuvimeisselillä ja vasaralla pääsee jo pitkälle, mutta joskus tarvitaan sahaakin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 279(504) 9.1 Hyödynnetäänkö ohjelman koodia vai ei? 1/4 • Lasilaatikkotestauksessa testitapaukset valitaan järjestelmän toteutukseen, kuten lähdekoodiin, tutustumalla (glass/white/clear box testing) • Lasilaatikkotestaus keskittyy usein vain toteutettujen toimintojen testaukseen – Yksikkötestaus on tällaista – TDD:ssä tehdään vielä toteuttamattomille asioille (metodit, funktiot) testitapauksia, jotka epäonnistuu, kunnes toteutus on tehty (ja toimii). Näin pidetään samalla kirjaa toteutuksen edistymisestä. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 280(504) Hyödynnetäänkö ohjelman koodia vai ei? 2/4 • Mustalaatikkotestauksessa testattava ohjelma nähdään mustana laatikkona eli sen toteutuksesta ei välitetä (black box testing) • Kun yksiköitä yhdistetään ja abstraktiotaso kasvaa, siirrytään lasilaatikkotestauksesta mustalaatikkotestaukseen – Yksikkötestaus usein lasilaatikkotestausta, järjestelmätestaus mustalaatikkotestausta • Mutta alimmalla tasolla lasilaatikkotestaus jatkuu Ohjelmistotekniikka Ohjelmistojen testaus, 2015 281(504) Hyödynnetäänkö ohjelman koodia vai ei? 3/4 • Testitapaukset valitaan spesifikaation tai toteutuksen perusteella • Testit voidaan suunnitella vaikka toteutusta ei vielä olisikaan – Määrittelyt, käyttötapaukset tai käyttäjätarinat pohjana • Testitapaukset säilyttävät käyttökelpoisuutensa myös toteutuksen muuttuessa, jos määrittely säilyy samana • Menetelmä toimii myös muulle kuin ajettavalle ohjelmalle, eli ideat yleistyvät Ohjelmistotekniikka Ohjelmistojen testaus, 2015 282(504) Hyödynnetäänkö ohjelman koodia vai ei? 4/4 • Tekniikat täydentävät toisiaan: siinä missä lasilaatikkotestit löytävät matalan tason virheitä (lähellä koodia), mustalaatikkotestit löytävät korkeamman tason virheitä (lähellä vaatimuksia ja käyttäjiä) – Spesifikaatiot korkeammalla abstraktiotasolla kuin toteutus, jossa metsä hukkuu helposti puiden sekaan • Mikäli testauksessa käytetään hyväksi tietoa ohjelman toteutusperiaatteista, mutta ei tehdä puhdasta lasi- tai mustalaatikkotestausta, voidaan tätä kutsua harmaalaatikkotestaukseksi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 283(504) 9.2 Kuka testaa? 1/3 • Kehittäjä: – Yksikkötestaus, integrointitestaus • Testaaja: – Integrointitestaus, järjestelmätestaus – Tilaajan puolella hyväksymistestaus • Käyttäjätestit: – Ohjelmistoa testaa sen käyttäjä, joskus mukana myös toimittajan testaustiimin jäsen; hyväksymistestaus • Alfa-testaus: – Käyttäjätesti järjestelmän toimittajan tiloissa, testiversiot eivät julkisia • Beta-testaus: – Käyttäjätesti asiakkaan tiloissa, julkisesti jaettavat testiversiot Ohjelmistotekniikka Ohjelmistojen testaus, 2015 284(504) 9.3 Kuka testaa? 2/3 • Crowd testing: – Laajat käyttäjämäärät tavoitteellisessa testauksessa • Sisällöllinen asiantuntijatestaus (subject-matter expert testing): – Ohjelmisto annetaan sellaisen henkilön testattavaksi (ei välttämättä käyttäjä), joka tuntee jonkin ohjelmiston toteuttaman osa-alueen kuin omat taskunsa – Tuloksena löytyneitä vikoja, kritiikkiä ja joskus myös kehujakin • Paritestaus: – Kaksi testaajaa testaavat yhdessä yhden tietokoneen ääressä ja vaihtavat koneenkäyttäjää aina välillä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 285(504) 9.4 Kuka testaa? 3/3 • Bugi-kekkerit (bug bashes): – Toimittajan tiloissa hieman ennen ohjelmiston julkistusta järjestettävä esim. puoli päivää kestävä tilaisuus, johon kaikki työntekijät (myös ohjelmoijat, myyntimiehet, sihteerit…) voivat osallistua – Onnistuminen riippuu paljon organisaatiosta • Eat your own dogfood: – Toimittaja ottaa omassa organisaatiossaan hyötykäyttöön ohjelmiston esiversion – Vasta kun ohjelmisto on havaittu omassa käytössä tarpeeksi luotettavaksi, se toimitetaan asiakkaalle Ohjelmistotekniikka Ohjelmistojen testaus, 2015 286(504) 9.5 Mitä ohjelman osaa testataan? 1/3 • Funktiotestaus: testataan funktiot yksi kerralla – Testataan jokainen funktio niin hyvin, että voidaan sanoa sen toimivan kuten pitäisi – Kannattaa tehdä ennen monimutkaisempia testejä, joissa testitapaukset kattavat useampia funktioita • Ominaisuustestaus (feature testing): testataan ominaisuuksia, jotka tyypillisesti on toteutettu usean eri funktion yhteistoimintana • Menutestaus (menu tour): graafisen käyttöliittymän menut ja dialogit käydään läpi ja testataan kaikki valinnat Ohjelmistotekniikka Ohjelmistojen testaus, 2015 287(504) 9.6 Mitä ohjelman osaa testataan? 2/3 • Logiikkatestaus: testaan ohjelman muuttujien välisiä riippuvuuksia – Esim. mikäli muuttujan Ikä arvo on suurempi kuin 50 ja muuttujan Tupakoi arvo on True, muuttujan TarjoaHenkivakuutusta arvo tulee olla False – Tavoitteena on testata jokainen looginen suhde ohjelman muuttujien välillä (mikä on usein kuitenkin mahdotonta) • Tilapohjainen testaus: käydään läpi suuri määrä ohjelman mahdollisia tilamuutoksia ja tarkastetaan, että jokaisessa tilassa ohjelma hyväksyy vain oikeat syötteet ja siirtyy niiden seurauksena oikeaan tilaan • Konfiguraatiokattavuustestaus: testataan ohjelmiston erilaisia konfiguraatioita (esim. laitteisto, muu ympäristö) ja mitataan kuinka suuri osa kaikista mahdollisuuksista on katettu Ohjelmistotekniikka Ohjelmistojen testaus, 2015 288(504) 9.7 Mitä ohjelman osaa testataan? 3/3 • Vaatimustestaus: testataan vaatimusmäärittelyssä mainitut vaatimukset yksitellen yrittäen näyttää, että ne joko on täytetty tai sitten ei – Vaatimuskattavuusmatriisia voidaan hyödyntää testauksen kattavuutta mitattaessa • Spesifikaatiopohjainen testaus: testataan ohjelmiston spesifikaatioissa esitettyjä sellaisia vaatimuksia, joiden toteutumiseen voidaan vastata joko kyllä tai ei – Spesifikaatioiksi voidaan laskea myös käyttöohjeet, mainokset yms. • Syötteiden testaus – Klassiset menetelmät ekvivalenssiositus ja raja-arvoanalyysi. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 289(504) 9.8 Minkä tyyppisiä ongelmia etsitään? 1/3 • Riskiperustainen testaus: käytetään riskianalyysiä sen selvittämiseen mitä testataan seuraavaksi – Testaus priorisoidaan sen perusteella, millä todennäköisyydellä jokin ohjelman ominaisuus ei toimi ja toimimattomuuden mahdollisilla seuraamuksilla – Mitä suurempi riski johonkin ominaisuuteen liittyy, sen aikaisemmin ja täydellisemmin se pitää testata Ohjelmistotekniikka Ohjelmistojen testaus, 2015 290(504) 9.9 Minkä tyyppisiä ongelmia etsitään? 2/3 • Riskiperustaisen testauksen lisäksi pitää testata myös sellaisia alueita, joihin ei riskianalyysin perusteella pitäisi keskittyä – Koskaan ei voi olla varma siitä, kuinka hyvin analyysi on tehty • On olemassa riski siitä, että riskianalyysi on väärässä – Mikäli jokin riski on jäänyt analyysissä huomaamatta, tulee toteutusta testattua tältä osin edes hieman • Esim. kannattaa testata ajoitus- ja rinnakkaisuusriippuvaisia ominaisuuksia vaikka niihin ei riskianalyysissä olisikaan kiinnitetty huomiota – Esim. mikäli tapahtuma A tapahtuu yleensä ennen tapahtumaa B, yritetään etsiä tilanteita, joissa B tapahtuukin ennen A:ta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 291(504) 9.10 Minkä tyyppisiä ongelmia etsitään? 3/3 • Ominaisuuksien luonteen perusteella: – – – – Käytettävyystestaus etsii käytettävyysongelmia. Suorituskykytestaus suorituskykyongelmia. Tietoturvatestaus tietoturvaongelmia. Jne… Ohjelmistotekniikka Ohjelmistojen testaus, 2015 292(504) 9.11 Mitä ohjelmalla pitää tehdä? • Skenaariotestaus: testataan testitapauksilla, jotka on johdettu käyttötapauksista (use case) tai käyttäjätarinoista • Liiketoimintaprosessin testaus. Testataan liiketoimintaprosessia mielellään päästä päähän (end to end testaus) • Käytettävyystestauksessa voidaan suorittaa suoraan käyttöön liittyviä toiminnallisia skenaarioita (testitapauksia laajempia) • Olennaista on testata koko ohjelman elinkaari – – – – Asennus Käyttö – normaali käyttö, ylläpito, varmuuskopiointi Päivitys Käytöstä poisto Ohjelmistotekniikka Ohjelmistojen testaus, 2015 293(504) 9.12 Asennustestaus • Asennus on ollut perinteinen ongelma-alue – Nykyisin se tulee vastaan myös päivitysten ja jatkuvan tuotantoonsiirron kautta • Asenna ohjelmisto eri tavoilla ja eri ympäristöihin i – Tarkasta mitkä tiedostot lisätään ja mitkä muuttuvat levyllä – Toimiiko installoitu ohjelma? – Mitä tapahtuu kun poistat asennuksen? • Yleisiä ongelmia – Onnistuminen erilaisilla käyttäjien oikeuksilla – moni ohjelma edellyttää ihan turhaan admin-oikeuksia asennuksessa – Jotkut Linux-peräiset ohjelmat eivät pidä, jos asennushakemiston nimessä on välilyöntejä – Joskus silläkin on väliä, mille levyasemalle ohjelman asentaa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 294(504) 9.13 Suorituskyky- ja kuormitustestaus 1/3 • Suorituskykytestaus: testataan – Täyttääkö systeemi suorituskykyvaatimuksensa – Kuinka nopeasti ohjelma toimii, jotta voidaan tarvittaessa optimoida – Ongelmia voi löytää, jos vertailee keskenään saman testiajon käyttämää aikaa eri kertoina – Mikäli suorituskyky yllättäen huononee, on syytä epäillä virhettä • Virhe voi tällöin löytyä myös kolmannen osapuolen koodista • Esim. jos kyseessä on Java-ohjelma, voi äkillinen suorituskyvyn heikkeneminen kertoa myös virtuaalikoneen uuden version ongelmista • Nettipalveluille tehdään yhdessä kuormitustestauksen kanssa. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 295(504) Suorituskyky- ja kuormitustestaus 2/3 • Kuormitustestaus: kuormitetaan ohjelmistoa siten, että se tarvitsee paljon resursseja (paljon työtä, vähän aikaa) – Tämä johtaa luultavasti häiriöön, jonka syiden penkominen saattaa johtaa sellaisten heikkouksien tunnistamiseen, jotka ovat relevantteja myös normaalikäytössä Sovelluspalvelin 2 Sovelluspalvelin 1 Tietoliikenn e-yhteys • Stressitestaus: lisätään kuormaa vähitellen, kunnes ilmenee häiriö (esim. vasteajat kasvavat sallittua pidemmiksi) – milloin palvelu ei enää toimi? Ohjelmistotekniikka Tietokanta -palvelin 1 Ohjelmistojen testaus, 2015 Käyttäjät ja clientit 296(504) Suorituskyky- ja kuormitustestaus 3/3 • Testaukset tärkeää aloittaa hyvissä ajoin, jotta voidaan parantaa suorituskykyä systeemin suunnittelulla – tai varautua palvelinhankintoihin • Nettipalvelujen testaus tehdään kuormitustestausohjelmilla, kuten JMeter, joilla luodaan yhteen tai useampaan tietokoneeseen joukko virtuaalisia käyttäjiä tekemään tyypillisiä asioita • Ei etsitä toiminnallisia virheitä ja sellaiset eivät saa keskeyttää tätä testausta – Käytetään siis yksinkertaisia skriptejä, jotka on testattu toimiviksi ja jotka eivät mene koko ajan rikki järjestelmän kehittyessä • Lisätietoa ks. Vuoren kalvosarja osoitteessa http://www.mattivuori.net/julkaisuluettelo/liitteet/suorituskykytestaus. pdf Ohjelmistotekniikka Ohjelmistojen testaus, 2015 297(504) Suorituskyky- ja kuormitustestaus 4/8 • Nettipalvelun testausprosessi pähkinänkuoressa: • Valmistaudu, mallinna ja suunnittele – Perusta pieni tiimi miettimään, miten testaus tehdään. – Palkkaa expertti tekemään ensimmäinen testaus – ja opi, miten se tehdään. – Selvitä suorituskykyvaatimukset: montako yhtäaikaista käyttäjää, vasteajat, jne… Analysoi miten realistisia vaatimukset ovat. Millainen olisi pahin tilanne? – Mallinna käyttäjien toimintaa (käyttöprofiili). Tunnista hetket, jolloin palvelulla on paljon käyttäjiä (esim. perjantain viimeinen työtunti jollain sovelluksilla). – Tunnista kriittiset / edustavimmat käyttötapaukset – jokin kokonainen tehtävä, vaikkapa tilauksen tekeminen. – Tee testauksessa käytettävistä komponenteista luotettavia – testaus ei saa keskeytyä toiminnallisiin virheisiin. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 298(504) Suorituskyky- ja kuormitustestaus 5/8 • Rakenna testijärjestelmä – Rakenna testijärjestelmä, joka vastaa tuotantoa "täysin". – Jos et voi tehdä täysin vastaavaa, käytä matematiikkaa selvittämään vastaavuus (esim. palvelinten määrä ja nopeus). Mieti muista eroja ja niiden vaikutuksia suorituskykyyn. Voit muunnella järjestelmän konfiguraatiota "suorituskykymallin" luomiseksi. – Valitse hyvä suorituskykytestaustyökalu, jolla luot kylliksi virtuaalisia käyttäjiä ja ajat testejä useasta työasemasta (jopa vain yksi työasema voi joskus simuloida muutamaa sataa käyttäjää). – Jos käyttöliittymäkerros on tarpeen ohittaa testeissä, analysoi ja testaa mikä on sen vaikutus. – Automatisoi ympäristön luontia, jotta voit jatkossa vain nappia painamalla ajaa testejä silloin tällöin – uusille buildeille, jos palvelimet vaihtuvat jne… – Aja ensimmäiset testi niin varhain kehityksessä kuin mahdollista, jotta ehdit muuttaa niiden perusteella arkkitehtuuria, jos on tarvetta. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 299(504) Suorituskyky- ja kuormitustestaus 7/8 • Asenna testiympäristö: – – – – • Käynnistä monitorointi palvelimilla, jotta voit tarkkailla mitä kuormitettaessa tapahtuu. Käytä realistista dataa ja realistisen suuria tietokantjoa – mutta älä tuotantodataa. Tarkista toisen kerran, että testiympäristö ei liity tuotantojärjestelmiin ja niiden dataan, joka voisi vaarantua testeissä. Aja testipalvelimilla samat muut prosessit ja muu kuorma kuin tuotantoympäristössä. Aja testit – – – – – – – Käynnistä testit ja lisää kuormaa vähitellen ja tarkkaile, miten järjestelmä käyttäytyy. Seuraa mittareita. Esim. prosessorin käyttöaste ei yleensä saa nousta yli 60% Käytä järjestelmää samaan aikaan manuaalisesti. Selvitä suorituskykyvaatimusten täyttyminen. Lisää kuormaa, jotta näet miten järjestelmä toimii tosisuurella kuormalla. Se ei saa kaatua. Simuloi palvelunestohyökkäystä. Toista testit muutaman kerran. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 300(504) Suorituskyky- ja kuormitustestaus 8/8 • Analysoi – Analysoi testissä kerättyä informaatiota tiimin kanssa. – Mieti, missä pullonkaulat todella ovat ja mitä niille voi tehdä. – Jos datassa näkyy outoja asioita, yritä eristää ilmiö ja tutki sitä erityisillä testeillä tarkemmin. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 301(504) 9.14 Luotettavuustestaus • Luotettavuustestaus: pitkäkestoinen testi, jonka tarkoituksena on paljastaa vikoja, jotka jäävät nopeissa testeissä helposti huomaamatta – Esim. karanneet osoittimet, muistivuodot, pinon ylivuodot yms. – Ajetaan testiä jopa useita päiviä • Yleensä kehittelyn loppuvaiheessa systeemiä kypsytettäessä • Tärkeää erilaisille alustoille, joilla laaja käyttäjäkunta – Esim. puhelimen käyttöjärjestelmä ja perussovellukset • Mallipohjainen testaus soveltuu hyvin ohjaamaan tällaista testausta, koska se tuo ajoon koko ajan vaihtelua (mallipohjaisesta testauksesta kerrotaan myöhemmin…) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 302(504) 9.15 Regressiotestaus 1/3 • Regressiotestaus: uudelleenkäytetään testitapauksia ja testataan niitä käyttäen muutosten jälkeen uudelleen – Kun jotain muutetaan, kaikenlaista voi hajota – "Kun yhden asian korjaa, kaksi muuta menee rikki" • Englanniksi ”regress” = taantua • Käytännössä eräs tärkeimmistä ja käytetyimmistä menettelyistä • Tehdään kaikilla testaustasoilla • Voidaan tehdä manuaalisesti tai testiautomaatiolla tai molemmilla • Perinteisin testiautomaation sovellus Ohjelmistotekniikka Ohjelmistojen testaus, 2015 303(504) Regressiotestaus 2/3 • Mitä testataan? – Mihin kaikkeen muutos voi vaikuttaa? Analysoidaan koodia. Ollaan realisteja: muutos voi usein vaikuttaa minne tahansa… – Joskus on käytössä vakio regressiotestisetti, jota sitten tapauskohtaisesti täydennetään, myös tutkivalla testauksella – Kaksi strategiaa: 1) mahdollisimman samalla tavalla aina (eli testitapauksilla, jotka ovat menneet ennen läpi monta kertaa) tai 2) miksei vähän eri testitapauksilla, niin voidaan saada kiinni uusia bugeja 3) kompromissi: jotkut asiat, jotka on "pakko tarkistaa", ajetaan perussetillä, mutta sen päälle mietitään testit tapauskohtaisesti Ohjelmistotekniikka Ohjelmistojen testaus, 2015 304(504) Regressiotestaus 3/3 • Muutamia tapoja – Integrointitestauksessa automaattiset testit tarkistavat jonkin komponentin muutoksen jälkeen, että muut komponentit toimivat ok. Testit on kehitetty toteutuksen aikaisessa testauksessa. – Tietojärjestelmän muutosten jälkeen ajetaan automatisoituja käyttöliittymätestejä useimmille toiminnoille. Testit on erityisesti koodattu tätä varten, kun järjestelmä on stabiloitunut. – Muutosten jälkeen tehdään regressiotestaus manuaalisesti tutkivalla testauksella. • Ongelmia – Manuaalisesti tehtynä voi olla tylsää työtä – Automaattitesteillä on aina ylläpito-ongelma Ohjelmistotekniikka Ohjelmistojen testaus, 2015 305(504) 9.16 Savutestaus 1/2 • Savutestaus (smoke testing): tarkoituksena on testata, onko ohjelmiston uusi versio (esim. uusi buildi) riittävän toimiva testattavaksi kunnolla – Jos se kaatuu koko ajan, ei testaamisesta tule mitään • Useimmiten automatisoitu ja standardoitu testi, jolla testataan perustoiminnallisuutta, jonka voi olettaa toimivan • Keskitytään laajuuteen eikä syvyyteen – Esim. mikäli buildiin on linkitetty väärä tiedosto, voi virheen löytää savutestin avulla nopeasti • Tarkoituksena ei siis varsinaisesti ole virheiden löytyminen • Kannattaa suunnitella yhteistyössä kehittäjien kanssa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 306(504) Savutestaus 2/2 • Testitapaukset yleensä osajoukko regressiotestauksessa käytetyistä • Savutestin voi tehdä joko kehittäjä tai testaaja • Tärkeää on tehdä se samanlaisessa ympäristössä kuin missä sen jälkeiset testit ajetaan • Mikäli vain mahdollista, savutestit kannattaa automatisoida, koska ne joudutaan yleensä toistamaan usein – Se on realistista, koska kyse on yksinkertaisista perustesteistä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 307(504) 9.17 Mistä tiedetään onnistuiko testiajo vai ei? • Evaluation-based • Vertaaminen spesifikaatioon tai muuhun auktoriteettiin – Mikäli eroja löytyy, kyseessä on luultavasti häiriö • Vertaaminen talletettujen tulosten kanssa – Verrataan esim. regressiotestauksessa tuloksia edellisen ajokerran tuloksiin – Jos edelliset olivat oikeita, ja nyt saatiin eri tulos, saattaa kyseessä olla häiriö Ohjelmistotekniikka Ohjelmistojen testaus, 2015 308(504) 9.18 Heuristinen johdonmukaisuus • Ohjelman pitäisi toimia… – Samoin kuin ennenkin – Kuten muiden ohjelmien vastaavassa tilanteessa – Kuten ihmiset sanovat sen toimivan (ohjelman pitäisi toimia kuten me luulemme käyttäjien haluavan sen toimivan) – Sisäisesti johdonmukaisesti, esim. virheenkäsittely on toteutettu samantyyppisissä funktioissa samalla tavalla – Kuten sen ilmeinen tarkoitus vaatii • Mikäli jossakin em. kohdassa havaitaan epäjohdonmukaisuutta, voi kyseessä olla häiriö tai sitten tietoinen suunnittelupäätös Ohjelmistotekniikka Ohjelmistojen testaus, 2015 309(504) Oraakkelin käsite i • Oraakkeli on termi mekanismille, jolla todetaan, onko testi läpäisty vai ei – eli se tapa, jolla saadaan selville oliko testissä havaittu käyttäytyminen ok vai ei – Termi tulee Delfoin oraakkelista http://fi.wikipedia.org/wiki/Delfoin_oraakkeli • Käytännössä oraakkeli voi olla esim. – – – – Järjestelmän aikaisempi ja luotettavaksi havaittu versio Toinen algoritmi Toinen ohjelma tai vaikka pilvipalvelu Asiantunteva käyttäjä (joka tuntee bisnessäännöt) • Mikään oraakkeli ei ole täydellinen… Ohjelmistotekniikka Ohjelmistojen testaus, 2015 310(504) 10. Virheraportoinnista Virheraportointi (tai vikaraportointi) on käytännössä tärkein kommunikaation muoto testaajien ja kehittäjien välillä. Vaikka tavoitteet ovat yleensä selkeitä, ei toimivaa raportointia ole kuitenkaan helppo toteuttaa. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 311(504) 10.1 Virheraportti jakaa tietoa • Mukailtu lähteestä Cem Kaner, ”Bug Advocacy”, Quality Week 2002. • Massamarkkinoille suunnattujen ohjelmistojen tapauksessa suurin osa käyttäjien löytämistä virheistä on itse asiassa jo löydetty varsinaisessa testauksessa – miksi niitä ei ole korjattu? • Virheraportti on väline, jolla testaajan on tarkoitus saada organisaatio vakuuttuneeksi siitä, että löytyneen vian korjaamiseen kannattaa käyttää aikaa ja rahaa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 312(504) Ongelma täytyy "myydä" kehittäjille • Jos testauksen tarkoitus on löytää virheitä, silloin virheraportit ovat testaajan ensisijainen tuotos – Ne ovat tuloksia, jotka testauksesta näkyvät ulkopuolelle ja joiden perusteella testaajat muistetaan – Paras testaaja ei ole se, joka löytää eniten virheitä, vaan se, joka saa eniten virheitä korjatuksi • Koska aikaa ei ikinä ole tarpeeksi, testaajan täytyy ”myydä” ongelma kehittäjälle, jotta tämä käyttäisi aikaansa sen korjaamiseen • Myyminen perustuu kahteen tavoitteeseen – Kehittäjä täytyy saada haluamaan korjata vika – Kehittäjän vastalauseet ja selitykset, miksi vikaa ei tarvitse korjata, täytyy pystyä kumoamaan Ohjelmistotekniikka Ohjelmistojen testaus, 2015 313(504) Mitkä seikat saavat kehittäjän haluamaan korjata vian? • • • • • Vian aiheuttama virhe / ongelma näyttää tosi pahalta Vika näyttää mielenkiintoiselta ongelmalta Se vaikuttaa moniin ihmisiin Sen toistaminen on triviaalia Se saattaa meidät noloon tilanteeseen, tai vastaava bugi on saattanut kilpailijan noloon tilanteeseen • Johto haluaa, että vika korjataan • Ohjelmoija haluaa tehdä testaajalle palveluksen yms. henkilökohtaiset syyt • Vetoaminen ammattitaitoon tms. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 314(504) Mikä saa kehittäjän vastustelemaan vian korjaamista? 1/2 • Kehittäjä ei saa virhettä toistettua • Bugin toistaminen vaatii erikoista temppuilua • Toistaminen ei ole mahdollista näillä tiedoilla ja lisätietojen kaivaminen vaatii paljon työtä • Kehittäjä ei ymmärrä virheraporttia • Epärealistinen bugi • Korjaaminen vaatii paljon työtä • Korjaaminen on riskialtista • Ei nähtävissä olevaa vaikutusta käyttäjille • Ei tärkeä; kukaan ei välitä, jos tämä ei toimi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 315(504) Mikä saa kehittäjän vastustelemaan vian korjaamista? 2/2 • Kyseessä ei ole vika vaan ominaisuus • Johto ei välitä tämän kaltaisista ongelmista • Kehittäjä ei pidä testaajasta tai ei luota häneen tms. henkilökohtaiset syyt Ohjelmistotekniikka Ohjelmistojen testaus, 2015 316(504) Kuinka motivoida vian korjaamiseen? • Kun testaaja huomaa häiriön, on kyseessä oire, itse virhe on vielä paljastamatta • Kenties havaittu häiriö ei ole paras mahdollinen esimerkki ko. virheen aiheuttamista häiriöistä • Siksi täytyy tehdä lisää töitä ennen virheraportin kirjoittamista sen osoittamiseksi, että virhe on vakavampi ja yleisempi kuin miltä ensisilmäyksellä näyttää Ohjelmistotekniikka Ohjelmistojen testaus, 2015 317(504) Vakavuuden selvittäminen • Kun testaaja on löytänyt häiriön, on ohjelmisto saatu haavoittuvaan tilaan • Jatkamalla testausta tässä tilassa, voidaan selvittää vian todellinen vakavuus – Vaihtelemalla kontrollia (ensin A, sitten B tai toisin päin) – Vaihtelemalla optioiden ja asetusten arvoja – Vaihtelemalla ohjelmisto- ja laitteistokonfiguraatiota Ohjelmistotekniikka Ohjelmistojen testaus, 2015 318(504) Onko kyseessä uusi vai vanha vika? • Jos kyseessä on vanha vika, sen korjaamiseen ei olla motivoituneita, ellei se ole aiheuttanut valituksia asiakkailta • Uusiin vikoihin suhtaudutaan vakavammin • Jos kyseessä on vanha vika, voi yrittää löytää uusia tapoja, joilla häiriö esiintyy ohjelmiston uudessa versiossa – Kyse on tällöin uudesta ongelmasta • Em. kohdat korostuvat erityisesti ohjelmiston ylläpitovaiheessa, kun uuden version tarkoituksena on vain korjata kriittisimpiä virheitä • Jos vikatietokantaa ”siivotaan” aika ajoin, voi tärkeää tietoa kadota Ohjelmistotekniikka Ohjelmistojen testaus, 2015 319(504) Yleisyyden selvittäminen • Etsi riippuvuuksia konfiguraatioista – Jos häiriötä ei saada toistetuksi kehittäjän ympäristössä, on motivointi vian korjaamiseksi hankalaa – Virheraportin täytyy kertoa ne ympäristöt, joissa häiriö ilmenee • Yritä yleistää ääritapaukset – Raja-arvoanalyysi auttaa häiriön etsimisessä – Negatiivinen testaus, virheelliset syötteet – Kun vika on löytynyt, ei tarvitse enää tyytyä raja-arvoihin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 320(504) 10.2 Voiko virheen toistaa? • Testaajan pitäisi raportoida myös sellaiset virheet, joita ei saa toistetuksi – Jos raportti on riittävän tarkka, ohjelmoija voi sen perusteella selvittää virheen olinpaikan – Kun huomaat, että et saa virhettä toistetuksi, kirjoita ylös heti kaikki mitä siitä muistat • Jos olet epävarma siitä mitä teit, sano se virheraportissa – Kannattaa kirjata myös se, mitä teit ennen kuin huomasit häiriön – Tarkasta vikatietokannasta, löytyisikö sieltä jotain vastaavaa – Yritä muuttaa ohjelman ajoitusta hitaammaksi ja nopeammaksi – Juttele ohjelmoijan kanssa ja/tai lue koodia – Virhe, jota ei saada toistetuksi on testaajan virhe, kannattaa yrittää ottaa opikseen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 321(504) 10.3 Hyvän virheraportin resepti • Selkeä, kuvaava otsikko auttaa löytämään raportin bugikannasta • Selosta kuinka häiriön saa toistettua, sisällytä kaikki askeleet • Kuvaile, mitkä askeleet ovat ja mitkä eivät ole tärkeitä ongelman kannalta, ja miten tulokset vaihtelivat eri testiajoissa • Analysoi ongelmaa ja kerro, miten se voidaan toistaa pienimmällä määrällä askelia • Raportin pitää olla helposti ymmärrettävä • Sävyn pitää olla neutraali • Vain yksi virhe per raportti • Jos toistamiseen tarvitaan tiedosto, liitä se raporttiin tai kerro mistä se löytyy – Nykyään suositaan kuvaruutukaappauksia, koska levytila on halpaa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 322(504) Virheraporttipohja 1/4 Tyypillisiä raporttilomakkeissa olevia asioita – mutta nämä vaihtelevat • ID, raportin yksilöivä numero • Otsikko – Kuvaa ongelman yhdellä rivillä – Virheraportin tärkein kenttä • Johto lukee tämän kun haluaa tietää mitkä ongelmat ovat vielä korjaamatta • Ongelman kuvaus – Pidempi kuvaus (kuvia liitteeksi) • • • • • Kuka raportoi Raportin luontipäivä Ohjelman tai komponentin nimi Julkistuksen ja version numero Testikonfiguraatio(t) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 323(504) Virheraporttipohja 2/4 • Raportin tyyppi – Ohjelmointivirhe, suunnitteluvirhe, dokumentoinnin vastaamattomuus, ehdotus, kysymys • Voiko toistaa – kyllä, ei, joskus, en tiedä: jos testaaja väittää, että virhe voidaan toistaa ja ohjelmoija on toista mieltä, testaaja joutuu toistamaan virheen ohjelmoijan silmien edessä • Vakavuus – Miten paljon haittaa käyttöä • Prioriteetti (korjaamiselle) – Projektipäällikkö / error manager tms. täyttää • Vaikutus asiakkaisiin – Esim. tekninen tuki täyttää Ohjelmistotekniikka Ohjelmistojen testaus, 2015 324(504) Virheraporttipohja 3/4 • Avainsanat • Ongelman kuvaus ja toistaminen – Askel askeleelta • Suositeltu korjaus • Kuka selvittää – Projektipäällikkö täyttää • Status – Testaaja täyttää: avoin, suljettu, roskis • Päätös – Projektipäällikkö omistaa tämän kentän – Odottaa, korjattu, ei voida toistaa, lykätty korjausta, toimii kuten suunniteltu, tarvitaan lisää tietoa, duplikaatti, vedetty pois tms. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 325(504) Virheraporttipohja 4/4 • Päätöstä vastaavan buildin versionumero • Päätöksen tekijä – Ohjelmoija, projektipäällikkö, error manager, testaaja • Päätöksen testaaja – Jos testaaja löytää virheen, hän myös testaa korjauksen • Virheraportin versiohistoria • Vapaamuotoiset kommentit – Muista neutraali sävy Ohjelmistotekniikka Ohjelmistojen testaus, 2015 326(504) 10.4 Vikatietokannat • Viat raportoidaan yleensä reaaliaikaiseen vikatietokantaan • Siellä ne voidaan osoittaa jollekin kehittäjälle tai tiimille • Tilannetta päivitetään, kun vikaa käsitellään ja korjataan ja lopulta vika voidaan "sulkea" • Tunnettuja systeemejä ovat mm. – Bugzilla – Mantis – Jira • Virhetilannetta seurataan koko ajan ja tilastoidaan – Ohjelmissa on hyvät raportointitoiminnot Ohjelmistotekniikka Ohjelmistojen testaus, 2015 327(504) Esimerkki Mantisin lomakkeesta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 328(504) 11. Ohjelmistojen mittaaminen Ohjelmistoprojekteissa mikään ei ole pysyvää paitsi muutos. Mittausten avulla voidaan tehdä sivistyneitä arvauksia projektin nykytilasta sekä siitä, mitä pitäisi muuttaa ja mihin suuntaan. Toisaalta tuotemittarit voivat auttaa kohdistamaan testausta virheherkimpiin osiin. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 329(504) 11.1 Mittarit 1/2 • Pääasiallinen lähde [Haikala&Märijärvi 06] • Mitä halutaan mitata, minkälaista tietoa kaivataan? • Tarvitaanko tuotemittareita, projektimittareita, vai molempia? Vai halutaanko mitata jotain muuta? – Mitä enemmän sen parempi? • Joitain suureita ei voida mitata tarkasti, kuten jäljellä olevien vikojen määrää, mutta arvioita voidaan antaa – Jos jäljellä olevien vikojen määrä voitaisiin laskea, ne olisi luultavasti helppo myös poistaa – Toiset arviot ovat parempia kuin toiset Ohjelmistotekniikka Ohjelmistojen testaus, 2015 330(504) Mittarit 2/2 • Mittauksessa törmätään yleensä asenneongelmiin – Ohjelmistoprojekteissa on aina vaarana, että mittaaminen kohdistuu suoraan henkilöön ja tämän suoritukseen – Mittaustulosten hyödyntämistapa pitäisi tehdä kaikille selväksi • Mittaamista on perinteisesti hyödynnetty testauksessa varsin laajasti – Testikattavuus – Testien kohdistaminen virheherkimpiin osiin ohjelmistoa • Koodi, joka on monimutkaista on yleensä myös virheherkkää – Osat, joiden luotettavuusvaatimukset ovat korkeat Ohjelmistotekniikka Ohjelmistojen testaus, 2015 331(504) Aloita yksinkertaisilla mittareilla • Aloita testauksen mittaaminen yksinkertaisilla mittareilla, jotka vaikuttavat luotettavilta, ja kokoa ne mittarijoukoksi – Jos on esimerkiksi mahdollista mitata vaatimusten kattavuutta, se voi olla hyvä alkupiste – Kokoelma toisiaan täydentäviä vaatimuksiin ja spesifikaatioihin sekä kooditason kattavuuteen pohjautuvia mittareita voi olla hyödyllinen – Sen sijaan, että tuijotettaisiin pieniin muutoksiin mitatuissa arvoissa, kiinnostavampia ovat suuret muutokset ja trendit (tulemmeko paremmiksi vai huonommiksi) – Hopealuotia ei ole mittauksessakaan – Muuta mittarijoukkoa pienin askelin, yritä pysyä perillä muutosten vaikutuksista Ohjelmistotekniikka Ohjelmistojen testaus, 2015 332(504) Mittarit vs. riskit • Onko mittarijoukolla ja tuotteen tai projektin riskeillä jokin yhteys? – Testaa mittarijoukkoa keksimällä skenaarioita, joissa jokin tärkeä riski realisoituu tuotteessa tai projektissa nähdäksesi havaitsevatko mittarit sen selvästi – Jos ei, voisiko mittarijoukkoa parantaa huomaamaan tällaisia ongelmia? • Älä luota mittareihin, jotka ovat olleet usein väärässä: mitä onnistuneiden ja epäonnistuneiden testien suhde oikeastaan kertoo? • Voisiko tätä tietoa täydentää esimerkiksi jollakin vaatimuksiin/spesifikaatioihin/koodikattavuuteen liittyvillä mittareilla? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 333(504) Mittaamisen huolellinen suunnittelu • Isoissa projekteissa/organisaatioissa tarvitaan usein mittaussuunnitelmaa: – – – – – – Miksi mitaan Mitä mitataan Ketkä osallistuvat mittaamiseen Mitä osia järjestelmästä mitataan Koska mitataan Kuinka tiedot kerätään ja analysoidaan Ohjelmistotekniikka Ohjelmistojen testaus, 2015 334(504) Vaatimuksia mittareille 1/2 • Mittaamisen tulosten merkitys liiketoiminnalle – Peruste mittaamiselle – Yhteinen käsitys siitä, miksi tietoa kerätään ja miten sitä voidaan hyödyntää ja tullaan hyödyntämään • Käyttöönoton helppous – Tarvitaanko käyttöönottoprojekti • Ymmärrettävyys – Syyt muuttuville arvoille • Selektiivisyys – Tulokset kohdennettavissa mittauksen kohteeseen • Jos mittarin arvo muuttuu, tiedetään mikä muuttuu mittauksen kohteessa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 335(504) Vaatimuksia mittareille 2/2 • Objektiivisuus – Tulokset eivät riipu mittaajasta tai mittaustilanteesta • Luotettavuus – Tarkkuus, toistettavuus, mittaria ei käytetä vahingossa väärin • Taloudellisuus – Mittauksen kustannukset suhteessa saavutettuun hyötyyn • Uudelleenkäytettävyys Ohjelmistotekniikka Ohjelmistojen testaus, 2015 336(504) Laadun mittareita – aluksi lyhyt lista esimerkkejä • Avointen vikojen määrä – Kaikki viat – Vakavien vikojen määrä – estävät tai erityisesti haittaavat • Koekäyttäjien tyytyväisyys • Laadullinen mittari • Parannus edelliseen versioon • Vertailu kilpailijaan • Kehitystiimin tyytyväisyys • Laadullinen mittari • Testaajien tyytyväisyys – Laadullinen mittari Ohjelmistotekniikka Ohjelmistojen testaus, 2015 337(504) Testitapausten määrä mittarina • Oikeasti testitapausten määrä ei kerro mitään. • Ja siten ei myöskään niiden läpäisy – "läpäisty 5000 testitapausta" • Syy: olennaista on testien laatu ja kun tarkastellaan liikaa määriä, on vaara, että suuri osa testitapauksista on aivan triviaaleja. • Parempi on katsella ohjelmassa olevien virheiden määriä ja luonnetta. – Eri vakavuusasteet. • Testitapausten suoritusten määrä on enemmän työprosessiin liittyvä asia: miten sovittu ja odotettu testaustyö etenee • Tutkivassa testauksessa ei edes ole "testitapauksia" Ohjelmistotekniikka Ohjelmistojen testaus, 2015 338(504) Perinteinen testauksen eteneminen • Isoissa projekteissa, joissa pitkä järjestelmätestausvaihe [Rothman 07] Ohjelmistotekniikka Ohjelmistojen testaus, 2015 339(504) S-käyrä kertoo kypsymisestä • Virheiden seuranta alusta asti on tärkeää • Esimerkki järjestelmätestauksen virhekäyrästä [Haikala&Märijärvi 06]: • Aletaan miettiä julkistusta, kun käyrä tasaantuu • Tasaantumisen saavuttamiseen tarvittavia resursseja on valitettavasti vaikea arvioida etukäteen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 340(504) Toinen käyrä samasta asiasta – kumpi viestii positiivisemmin? • Toinen tapa kuvata asiaa – viesti kenties selkeämpi [Rothman 07] Ohjelmistotekniikka Ohjelmistojen testaus, 2015 341(504) Kypsyyden mittareista lisää • Edellä oli S-käyrä esimerkkinä kypsymisen seuraamisesta • Käyrä antaa implisiittisen vihjeen, että virheitä pitäisi alkaa löytymään vähemmän • Miksi seurata löydettyjen ja korjattujen absoluuttista määrää? • Miksei seurata avoinna olevien virheiden määrää? • Entä virheiden löytymisen tahti (montako per päivä)? • Vaihtoehtoja mittareiksi on monia, eikä pidä koskaan hyväksyä ensimmäistä tarjottua • Testaajien fiilis on tärkeä ja joskus paras mittari: miltä softa tuntuu, onko se kypsynyt ja alkaako se olla julkaisukunnossa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 342(504) Suorat ja johdetut mittarit • Perusmittarit: suoritetut testit, löytyneet virheet, kattavuus suhteessa vaatimuksiin/spesifikaatioihin, koodikattavuus, koko, mutkikkuus, käytetty työmäärä, jne. • Johdetut mittarit: virhetiheys, onnistuneiden ja epäonnistuneiden virhekorjausten suhde, löydettyjen virheiden määrän suhde niiden virheiden määrään, jotka olisi voitu löytää, jne. • Prosessisidonnaiset mittarit: testien suoritusnopeus, automatisointiaste, virheiden elinaika päivissä, testaukseen suunnitteluun kulunut työmäärä, laatuvelka ketterässä projektissa, jne. • Yleisesti ottaen ongelma ei ole mittareiden keksiminen, koska niitä on jo tarpeeksi; ongelma on valita sopivat mittarit Ohjelmistotekniikka Ohjelmistojen testaus, 2015 343(504) 11.2 Ei-toiminnallinen testaus • Kuinka mitata ei-toiminnallista testausta? • Suorituskykytestauksessa mittaus voi olla on/off – jos vaatimukset täyttyvät, tilanne on ok, eikä muutu, ellei softaa kehitettäessä saada sitä hidastumaan. • Käytettävyystestauksessa vähän eri tavalla – kypsyminen on sitä, että katsotaan, miten työlistalla olevat parannukset saadaan tehtyä ja onko vielä julkaisemista estäviä puutteita. – Pienet kosmeettiset asiat eivät haittaa. – Mitataan kenties puutteiden sijaan testihenkilöiden tyytyväisyyttä eri testauskierroksilla. • Jne… Ohjelmistotekniikka Ohjelmistojen testaus, 2015 344(504) 11.3 Sitä saa mitä mittaa! – Kuinka mittareita huijataan • Johto saa sitä mitä mittaa – 100% koodikattavuuden saavuttaa helpommin kun jättää testien tulokset huomioimatta – Automatisoinnin astetta voi kasvattaa hankkiutumalla eroon manuaalisesta testauksesta – Tehokkaaksi testaajaksi pääsee kunhan käy muuttamassa itse lähdekoodia ja löytämällä itse tekemänsä virheet seuraavana päivänä – Jos on painetta löytää virheitä, ei panosteta niiden ennaltaehkäisyyn – Jos ei haluta löytää virheitä, niitä löydetään vähemmän • Jos mittareihin on yhdistetty palkitsemista, kiusaus niiden huijaamiseen voi nousta ongelmaksi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 345(504) 11.4 Järjestelmätason kattavuusmitat 1/2 • Perinteiset mittarit: – Vaatimuskattavuus – kuinka hyvin eri vaatimukset on saatu katettua • Mille prosenttiosuudelle vaatimuksista on testejä? • Kattavuus suhteessa vaatimusten tärkeyteen – Toiminnallinen kattavuus • Liitetään testit ohjelman toimintoihin, jopa käyttöliittymän toimintoihin – Kattavuus eri yksiköiden suhteen • Komponentit, moduulit, yms. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 346(504) Järjestelmätason kattavuusmitat 2/2 • Muita vaihtoehtoja – Riskikattavuus • Kuinka tuotteen riskit on testauksessa otettu huomioon, erityisesti isojen riskien osalta – Riskikattavuus suhteessa vaatimuksiin/toimintoihin – Kattavuus sen suhteen mikä on tärkeää eri käyttäjäryhmille • 70 % yrityskäyttäjille tärkeistä vaatimuksista on katettu, 83 % kotikäyttäjille tärkeistä – Käyttöskenaario- / käyttötapaus- / tarinakattavuus • Tällä tasolla käytettävät kattavuusmittarit riippuvat käytettävästä prosessista – V-malli vai ketterä prosessi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 347(504) 11.5 Koodin kattavuusmitat • Koodikattavuuden avulla voidaan päätellä, että vielä ei olla testattu riittävästi – Sen päätteleminen, että on testattu tarpeeksi, on sitten toinen asia – 100 % koodikattavuus ei yleensä takaa vielä yhtään mitään • Koodikattavuutta seurataan yleensä yksikkötestauksessa • Kattavuusmittaus vaatii ohjelman instrumentointia, hidastaa sitä ja voi piilottaa koodin vikoja • Vaikka järjestelmätason testaajien ei tarvitse huolehtia kooditason kattavuudesta, on hyvä tietää mitä hyviä ja huonoja puolia kehittäjien käyttämissä mittareissa on Ohjelmistotekniikka Ohjelmistojen testaus, 2015 348(504) Yleistä koodin kattavuusmitoista • Hyvää yksikkötestausta täytyy vaatia ohjelmointitiimeiltä ja alihankkijoilta – Testien laatuun panostaminen on parempi strategia kuin vain mittareiden tuijottaminen • Lisäksi testit ovat vain yksi laadunvarmistuksen keino: koodikatselmoinnit, staattinen analyysi, jne. ovat myös tärkeitä • Yksikkötason mittaustiedot saadaan automaattisesti työkaluilta, jotka on integroitu yksikkötestaukseen ja/tai matalan tason integrointitestaukseen – Näitä on helppo käyttää vaatimuksina seuraavaan vaiheeseen siirtymiselle (laatuportit) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 349(504) Miksi liiallinen koodikattavuuteen keskittyminen on vaarallista 1/2 • Kun omaa koodia kehitetään järkevästi, sen määrä minimoidaan ja suurin työ tehdään kirjastoissa. • Silloin oma kattavuusmittaus ei kerro mitään: sometype MyFunction(optional String myString) { return LibraryFunction(myString); } • Kun testi käy return-rivillä, kaikki mahdollinen on selvästi testattu. Vai onko? Miten käyttäytyy LibraryFunction() kaikilla mahdollisilla syötteillä? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 350(504) Miksi liiallinen koodikattavuuteen keskittyminen on vaarallista 2/2 • Kattavuusnumeroiden sijaan pitää ensimmäisenä ajatella hyvien testien tekemistä ja katsella numeroita vain avustavana infona. • Erityisesti pitää varoa, että kattavuusmittoja ei pidetä keskeisinä testausvaatimuksina ja alihankkijan työn arviointikriteerinä. • Kannattaa myös muistaa, että joitakin asioita voi testata paremmin järjestelmätasolla – Se ratkaisee! – Silloin ei koodikattavuusmittausta yleensä ole päällä kuin silloin tällöin. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 351(504) laske tulokset Esimerkin asetelma alustukset • Havainnollistetaan erilaisia kattavuusmittoja esittämällä testattava ohjelma oheisen kulkukaavion mukaisella notaatiolla • Testauksessa ollaan kiinnostuneita ohjelman käyttäytymisistä, joita vastaavat eri suorituspolut • Suorituspolku kuvaa ohjelman kontrollin kulkua testikohteen alusta sen loppuun ohjelmaa suoritettaessa opiskelijoita jäljellä laske arvosanajakauma kyllä loppu hae seuraavan opiskelijan tiedot ei mukana tentissä kyllä määrää arvosana päivitä opiskelijan tiedot Ohjelmistotekniikka ei Ohjelmistojen testaus, 2015 Esimerkki lähteestä [Haikala&Märijärvi 06] 352(504) Lausekattavuus laske tulokset • Miten suuri osa lauseista katetaan testeillä? • Jos jokainen lause suoritetaan testiajossa ainakin kerran, on lausekattavuus 100 % • Mikäli ohjelmassa on 100 lausetta, joista testitapaukset suorittavat 63, sanotaan lausekattavuuden olevan 63 % alustukset opiskelijoita jäljellä ei laske arvosanajakauma kyllä loppu hae seuraavan opiskelijan tiedot ei mukana tentissä kyllä määrää arvosana Ohjelmistotekniikka Ohjelmistojen testaus, 2015 päivitä opiskelijan tiedot 353(504) Päätöskattavuus • Decision coverage / brach coverage • Kontrollin haarautumiskohdat ovat avainasemassa testikattavuutta määriteltäessä • Päätöskattavuus vaatii, että jokainen päätös saa testattaessa molemmat arvonsa • Eli tarkistetaan mm. if-lausekkeet ja katsotaan, että testitapauksilla käydään molemmat polut Ohjelmistotekniikka Ohjelmistojen testaus, 2015 a==0 && b>0 ei kyllä 354(504) Ehtokattavuus • Condition coverage • Jatkoa päätöskattavuudelle, mutta nyt tarkastellaan, miten "osaehtojen" kaikki mahdolliset totuusarvot käsitellään testauksessa • Eli testataanko tilanteet, joissa – – – – a==0 && b>0 ei kyllä a == 0 a != 0 b>0 b <= 0 Ohjelmistotekniikka Ohjelmistojen testaus, 2015 355(504) Moniehtokattavuus • Multiple condition coverage • Moniehtokattavuus vaatii, että päätöksen kaikkien ehtojen molempien arvojen kaikki mahdolliset kombinaatiot tulee käytyä läpi • Ei siis riitä, että lausekkeen ehdot testataan, vaan testataan myös kaikki niiden kombinaatiot, esim. testitapaukset, joissa – – – – (a=0, b=0), (a=1, b=0), (a=0, b=1) ja (a=1, b=1) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 356(504) Polkukattavuus 1/2 • • • • Path coverage Miten hyvin testataan kaikki mahdolliset suorituspolut? Vähemmän käytetty kattavuusmitta Täysin polkukattava testaus on käytännössä saavuttamaton tavoite – Ongelma I: silmukat tekevät polkujen määrän liian suureksi • Monet ohjelmat on tarkoitettu pyörimään ikuisessa silmukassa valmiina vastaanottamaan ulkopuolisia ärsykkeitä => ääretön määrä suorituspolkuja • Voidaan saavuttaa vain esim. yhden funktion sisällä – Ongelma II: kaikki ohjelmakoodia tutkimalla löydetyt polut eivät ole välttämättä suorituksessa mahdollisia • Esim. jonkin polun suorittaminen funktion läpi edellyttää tiettyä parametrin arvoa, jolla ko. funktiota ei ikinä kutsuta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 357(504) Polkukattavuus 2/2 laske tulokset alustukset • Kuinka monta eri suorituspolkua oheisella ohjelmalla on? opiskelijoita jäljellä – Toisin sanoen, kuinka monta erilaista tapaa on päästä alkusolmusta loppusolmuun? • Jos opiskelijoita on n kappaletta, ja jokaisen kohdalla on kaksi mahdollisuutta sen n mukaan onko osallistunut tenttiin vai ei: 2 • Jos kyseessä olisi 100:n opiskelijan kurssi, olisi suorituspolkuja 2100 • Jos silmukasta voisi hypätä pois kesken kaiken, olisi polkuja vielä paljon enemmän: n n-1 n-2 1 0 2 +2 +2 +…+2 +2 Ohjelmistotekniikka Ohjelmistojen testaus, 2015 ei laske arvosanajakauma kyllä loppu hae seuraavan opiskelijan tiedot ei mukana tentissä kyllä määrää arvosana päivitä opiskelijan tiedot 358(504) 11.6 Mutkikkuusmitat 1/2 i • Complexity measure. • Kertoo koodin laadusta. – Ylläpidettävyys. Hyvä tarkistaa, kun esimerkiksi ottaa ylläpitoon toisen yrityksen tuottamaa koodia. – Herkkyys mennä rikki muutettaessa, lähes itsestään… tai kun käytetään erilaisia syötteitä ja niiden yhdistelmiä. – Todennäköisyys, että koodissa on virheitä. – Siis vahva "haju"… – Perustuu yleensä koodin rakenteen staattiseen analysointiin työkaluilla. • Käytännön arjessa ei kiinteä rooli testauksessa, vaan yleisemmin koodin laadun varmistuksessa eikä sielläkään kovin laajasti – paitsi kriittisten järjestelmien kehityksessä. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 359(504) 11.7 Mutkikkuusmitat 2/2 i • Testauksessa idea: kohdistetaan testausta monimutkaisimpiin osiin koodia, monimutkaisiin komponentteihin – varsinkin alussa, kun ne tulevat testauksen piiriin. • Periaatteessa mittoja voisi käyttää tarvittavien testitapausten määrän selvittämiseen. • Tyypillisiä: Halsteadin mittarit, McCaben syklomaattinen numero. Rivimäärä taas ei kerro mutkikkuudesta mitään. • Kehitysympäristöistä joko löytyy mittaustyökalu valmiina tai sellainen on helppo asentaa. • Lisätietoa – http://en.wikipedia.org/wiki/Cyclomatic_complexity – http://en.wikipedia.org/wiki/Halstead_complexity_measures Ohjelmistotekniikka Ohjelmistojen testaus, 2015 360(504) 11.8 Virheiden kylväminen 1/2 • Error seeding • Lisätään tietoisesti virheitä ohjelmakoodiin, jotta – Voidaan yrittää arvioida jäljellä olevien ”oikeiden” virheiden määrää testauksen avulla löytyneiden kylvettyjen virheiden määrästä – Näin voidaan myös arvioida testauksen kykyä löytää virheitä • Merkitään Vo:lla oikeiden ja Vk:lla kylvettyjen virheiden kokonaismäärää sekä Vol:lla ja Vkl:lla löydettyjen oikeiden ja kylvettyjen virheiden määrää • Oletetaan lisäksi, että Vo/Vol = Vk/Vkl • Jäljellä olevien virheiden määrän arvioksi saadaan (Vol x (Vk/Vkl)) - Vol Ohjelmistotekniikka Ohjelmistojen testaus, 2015 361(504) 11.9 Virheiden kylväminen 2/2 • Kylvämisen ongelmia: – – – – Minkälaisia virheitä pitäisi kylvää? Onko kaikki kylvetyt virheet muistettu poistaa? Paljonko menetelmästä aiheutuu ylimääräistä työtä? Kylvösten poisto muuttaa ohjelmaa ja se pitää testata kokonaan uudelleen – kuluu aikaa, rahaa – Eettinen ongelma: on demoralisoivaa laittaa ohjelmaan tahallisesti vikoja • Eräs muoto on laittaa järjestelmän muihin osiin virheitä (miten testattava komponentti selviää niistä?), mutta niitä kannattaa mieluummin kutsua testitapauksiksi. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 362(504) Mutaatiotestaus • Virheiden kylvämistekniikan erikoistapaus • Tuotetaan ohjelmasta versioita, joissa kaikissa on kylvettynä eri virhe • Voidaan käyttää – Testauksen tehokkuuden arviointiin (kuinka monta mutanttia löydettiin) – Sen testaukseen, kuinka hyvin ohjelma kykenee toipumaan virheistä • Aikaisemmin mutaatioiden tuottamista on käytetty myös testauskurssin harjoitustöiden generointiin! Ohjelmistotekniikka Ohjelmistojen testaus, 2015 363(504) 12. Automaatio ja työkalut Tässä kohdassa tutustutaan testiautomaatioon sekä testaamista helpottaviin työkaluihin. Työkalujen suuren määrän vuoksi tarkoituksena on antaa lähinnä yleiskuva, jonka avulla voi sitten helposti hankkia lisätietoja. Yksi työkalu sopii yhteen hommaan ja toinen toiseen. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 364(504) Orientaatioksi • Alkupään kalvot perustuvat Mika Maunumaan kokoamaan materiaaliin • Eri näkökulmat – Ohjelmistosuunnittelu kuvaa, miten asiat ovat – Testaus kysyy ovatko asiat oikeasti niin • Testaus on perinteisesti ollut käsityötä • Testausautomaation kultainen lupaus on poistaa käsityö ja ratkaista testausongelmat – Kun ohjelma testaa ohjelmaa, säästetään aikaa ja rahaa – Ohjelma jaksaa testata virheettömästi, nopeammin ja pidempään – Kaikkea ei voida testata käsin • Stressi- ja suorituskykytestaus jne. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 365(504) 12.1 Testiautomaatio kokonaisuutena • Testiautomaatio on manuaalisen testauksen täydentäjä, ei sen korvaaja – Testit on suunniteltava etukäteen – Automatisoidaan vain parhaat testit – Käsityön rooli muuttuu, mutta ei poistu • Ohjelmisto, jonka tarkoitus on ”ajaa” toista ohjelmaa – Molemmat ovat syntyneet (osittain) samoista vaatimuksista – Näkökulmassa ja tavoitteissa on suuri ero • Testaus ja testien automatisointi vaativat erilaisia taitoja • Testiautomaatio ei ole testauksen hopealuoti Ohjelmistotekniikka Ohjelmistojen testaus, 2015 366(504) 12.2 Mitä on testiautomaatio • Perustapauksessa testausohjelma ajaa testit testattavalle kohteelle. – Testitapauksia ei suoriteta käsin. • Testit kuitenkin suunnitellaan ja toteutetaan testausohjelmalle yleensä käsin. – Tehdään testitapauksille pieniä ohjelmanpätkiä. • Käytetään kaikilla testaustasoilla – Yksikkötestien suorittaminen vaikkapa JUnitilla tai QTestillä on testiautomaatiota. – Testien ajaminen integrointipalvelimella. – Käyttöliittymätestien automatisointi. – Kuormitustestien ajaminen. – Jne… Ohjelmistotekniikka Ohjelmistojen testaus, 2015 367(504) Eri tapoja kohteen ohjaamiseen (yksinkertaistettuna) • Testipenkki: – Testiajuri kutsuu testattavan ohjelman funktioita tai muita rajapintoja. Yksikkötestaus on tätä. • Instrumentoitu: – Kohteessa tai käyttöjärjestelmässä on jokin ajuri, jota testiohjelma pyytää esim. etsimään näytöltä painonapin ja klikkaamaan sitä. Voidaan kutsua napin API:a tai vaikka emuloida hiiren klikkausta. • Testausrobotti: – Fyysinen robotti tunnistaa näytöllä olevat kohteet ja sormellaan käyttää ohjelmaa. …Kaikilla näillä on omat sovelluskohteensa ja hyvät ja huonot puolensa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 368(504) 12.3 Testiautomaation lupauksia • Regressiotestaus helpottuu, enemmän testejä useammin • Voidaan suorittaa manuaaliselle testaukselle mahdottomia testejä – Esim. verkkosovellusten kuormitustestaus • Testauksessa tehdyt virheet vähenevät, kone on ihmistä tarkempi – Toisaalta myös uudenlaiset virheet tulevat mahdollisiksi • • • • • Resurssien tehokkaampi käyttö Testien eheys ja toistettavuus Testit voidaan suorittaa eri laite- tai ohjelmistoalustoilla Testien uudelleenkäyttö testikohteen pysyessä samana Luottamus toimivuuteen kasvaa, markkinoille pääsy nopeutuu Ohjelmistotekniikka Ohjelmistojen testaus, 2015 369(504) 12.4 Testiautomaation yleiset ongelmat • Epärealistiset odotukset – Työkalut ratkaisevat kaikki pulmat • Huonot testaustavat – ”Automating chaos just gives faster chaos” • Odotetaan automaation löytävän paljon uusia virheitä • Virheellinen turvallisuuden tunne – Koska automaatio ei löytänyt virheitä, niitä ei olekaan • Automatisoitujen testien ylläpito • Tekniset ongelmat – Buginen testaussofta, yhteensopivuus • Organisaation ongelmat – Johdon tuen puute, organisaation kulttuuri, koulutus Ohjelmistotekniikka Ohjelmistojen testaus, 2015 370(504) 12.5 Automaation rajoitukset 1/3 • Ei poista manuaalisen testauksen tarvetta – Kaikkea ei kannata automatisoida • Harvoin ajettavat testit • Testattava ohjelmisto on ”liikkuva maali” • Testin tulokset on helposti ihmisen tulkittavissa, mutta erittäin vaikea koneelle (esim. äänen tai kuvan laatu) • Fyysistä toimintaa vaativat testit – Kaikkea ei tarvitse automatisoida • Vain parhaat ja usein toistuvat testit • Testikohteen testattavuus nousee tärkeään asemaan, sen puute voi johtaa automatisoinnin epäonnistumiseen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 371(504) Automaation rajoitukset 2/3 • Manuaaliset testit löytävät enemmän virheitä – Virhe löytyy yleensä ensin manuaalisella testillä, joka sitten automatisoidaan regressiotestausta varten – James Bach raportoi kokemuksistaan Borlandilla: automaatio löysi vain alle 20 % kaikista projektin aikana löydetyistä virheistä vaikka automaatioon oli satsattu jo useita vuosia (James Bach, Test Automation Snake Oil, 1999) • Uudet ominaisuudet pitävät sisällään enemmän virheitä kuin vanhat • Manuaalinen testaaja voi nopeasti löytää paljon virheitä samalla kun automaatiota vasta laajennetaan uusille alueille Ohjelmistotekniikka Ohjelmistojen testaus, 2015 372(504) Automaation rajoitukset 3/3 • Testausautomaatio saattaa rajoittaa ohjelmistokehitystä – Testit ovat herkkiä vähäisillekin muutoksille ohjelmistossa • Automaattisen testin alustus on raskaampi operaatio kuin manuaalisen testin • Ylläpito vaatii työtä • Työkaluilla ei ole mielikuvitusta – Työkalut tekevät vain sen, mitä niiltä on pyydetty – ihminen voi varioida testin suoritusta ja toimia älykkäänä tarkkailijana • Automaatio ei lisää tehokkuutta – Ajon hinta ja ajoaika vs. suunnittelun ja ylläpidon hinta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 373(504) 12.6 Ohjelman testattavuus • Ohjelma pitää suunnitella siten, että testiautomaatio pystyy – Ohjaamaan sitä, suorittamaan toimintoja – Selvittämään ohjelman kulloisenkin tilan – Hakemaan dataa käyttöliittymästä ja tietovarastoista selvittääkseen, mitä testien johdosta tapahtui • Tämä haaste on tiedostettu jo pitkään – Silti mm. uusissa käyttöjärjestelmissä on asia yleensä unohdettu • Monet testattavuutta edistävät piirteet helpottavat myös ylläpidettävyyttä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 374(504) Testattavuudelle tärkeitä piirteitä 1/4 • Yleinen yksinkertaisuus ja selkeys – Testiautomaatiota ei voi tehdä sekavalle ja mutkikkaalle ohjelmalle • Arkkitehtuuri: – Arkkitehtuuri, jossa käyttöliittymä voidaan ohittaa logiikan testausta varten – Modulaarisuus, jolloin komponentteja voi testata erikseen • API:t – API, johon voidaan tarttua ulkopuolisesta ohjelmasta (yksikkötestauksen lisäksi myös järjestelmätesteissä) – Standardoidut, tutut tiedonsiirtoprotokollat ja dataformaatit, joita on helppo käsitellä – Testausrajapinta (ei saa muodostaa takaporttia hakkereille) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 375(504) Testattavuudelle tärkeitä piirteitä 2/4 • Tietokannat – Standardimuotoiset tietokannat, joista on helppo hakea dataa – Testidatan luonti mahdollista ilman sovellusohjelmaa • Käyttöliittymät – Käyttöliittymäteknologia, jossa käyttöliittymän elementit voidaan tunnistaa ohjelmallisesti – Käyttöliittymäelementteihin voidaan syöttää dataa ja sopivan API:n avulla ja simuloiden näppäimistöä, eleitä – Elementeistä voidaan lukea dataa API:n avulla. Jos se ei onnistu, pitää ottaa ruutukaappauksia ja tunnistaa niistä OCR:n avulla kenttien tekstit, tai vertailla bittikarttoja – Sudenkuoppia: Dynaamisesti generoidut ikkunoiden luokat, usealla objektilla sama tunniste, muokattavat kontrollit, kontrollien vaihtelevat sijainnit. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 376(504) Testattavuudelle tärkeitä piirteitä 3/4 • Logit – Suorituksen logitus on tärkeää pitkissä testiajoissa ja selvittämiseksi, mitä tapahtuu konepellin alla – Mahdollisuus säilyttää väliaikaistiedostoja niiden tarkastelemiseksi testiohjelmalla • Ajoympäristön konfigurointi – Konfigurointi yksinkertaisissa konfigurointitiedostoissa, joita voidaan generoida testejä varten • Koodaustapa – Selkeä, rakenteinen, modulaarinen koodi, jota on helppo ymmärtää ja tunnistaa testattavat kokonaisuudet – Selkeät nimeämiskäytännöt – Ei kovakoodattuja resurssitietoja, vaan kuvaus tiedostoissa, jolloin ne voidaan korvataOhjelmistojen testiversioilla testaus, 2015 377(504) Ohjelmistotekniikka Testattavuudelle tärkeitä piirteitä 4/4 • Ei-intrusiivinen testaus – Esim. turvallisuuskriittisen järjestelmän testauksessa ei ole hyvä, jos ohjelmaa instrumentoidaan sen testausta varten. Tietyn konfiguraation ohjelmaa pitää voida testata vain "käyttämällä", koskematta sen komponentteihin. – Tällöin on tärkeää, että esim. käyttöliittymää voidaan testata ilman API:a, vain simuloimalla käyttäjää, esim. fyysisellä robotilla. – Ja ohjelman tila täytyy voida selvittää ilman ylimääräistä logitusta yms. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 378(504) 12.7 Testiautomaatio – erilaista ohjelmistosuunnittelua • Testausautomaation toteutus on ohjelmistonkehitysprojekti; skriptit vaativat – – – – Ohjelmointi- ja suunnittelutaitoja Testaustaitoja Dokumentointitaitoja Ylläpitotaitoja • Kuka testaa testiohjelmiston? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 379(504) Testiautomaatio ohjelmistoprosessin eri vaiheissa 1/3 • Yksikkötestaus: – Kehittäjien pitäisi huolehtia yksikkötestauksesta – Kehittäjät eivät ole useinkaan kiinnostuneita testaamaan omaa koodiaan manuaalisesti • Manuaalinen testaaminen voidaan kokea tylsäksi tavaksi hukata paljon aikaa – Tarvitaan apuvälineitä, jotka automatisoivat yksikkötestauksen mahdollisimman pitkälle • Mieluiten näiden apuvälineiden tulisi integroitua saumattomasti kehittäjien käyttämiin kehitysvälineisiin – Editorit, kääntäjät, IDE:t (Integrated Development Environment) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 380(504) Testiautomaatio ohjelmistoprosessin eri vaiheissa 2/3 • Useita kaupallisia ja ilmaisia työkaluja on saatavilla • Yksi esimerkki ovat xUnit-kehykset – Niiden taka-ajatuksena on sälyttää kehittäjien harteille niin testien suunnittelu ja koodaaminen kuin ajaminen ja tulosten analysointikin – Automaattiset regressiotestit saadaan ”kaupan päälle” Ohjelmistotekniikka Ohjelmistojen testaus, 2015 381(504) Testiautomaatio ohjelmistoprosessin eri vaiheissa 3/3 • Integrointitestaus: – Yksikkötestaustyökaluja voidaan hyödyntää myös integrointitestauksessa – Ajurien ja/tai tynkien automaattinen generointi – Ennen varsinaista integrointitestiä kannattaa testattavalle kokonaisuudelle tehdä savutesti, jolla selvitetään onko se kelvollinen etenemään integrointitestaukseen – Erityisesti jatkuvan integraation maailmassa tehdään normaalin työn osana integrointi omassa työasemassa ja sitten varsinainen integrointi palvelimella • Integroinnin onnistumisen todennäköisyys kasvaa merkittävästi • Yhtä olennaista kuin testaustyökalu, on testausta pyörittävä automatiikka • Järjestelmätestaus – siitä jatkossa lisää Ohjelmistotekniikka Ohjelmistojen testaus, 2015 382(504) 12.8 Automaation lähestymistavat • Erityisesti käyttöliittymän kautta testaavasta automaatiosta voidaan havaita erilaisia näkökulmia – Helppokäyttöisyys, ylläpidettävyys ja kyky löytää virheitä eri tilanteissa vaihtelevat • Seuraavassa testiautomaatio jaetaan viiteen lähestymistapaan – – – – – Nauhoita ja toista Komentojonot Dataohjattu Avain- ja toimisanat (keywords, action words) Mallipohjainen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 383(504) Nauhoitus ja toisto 1/2 • Alkeellisin (ja pahamaineisin) muoto – Nauhoitetaan käyttöliittymästä tietty sekvenssi tietyllä syötteellä ja toistetaan samaa kerrasta toiseen – Muutos kohteessa vaatii yleensä uuden nauhoituksen – Yleensä virhe löytyy nauhoitettaessa • Toisto ei löydä uusia virheitä • Testin tarkoitus on ajaa tietty sekvenssi läpi ja katsoa tuliko oikea tulos (jos tarkastukset on implementoitu) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 384(504) Nauhoitus ja toisto 2/2 • Syntyvät skriptit ovat lähes poikkeuksetta – – – – Huonosti strukturoituja Huonosti dokumentoituja Lähes mahdottomia ylläpitää Lineaarisia • Eivät välttämättä vaadi ohjelmointiosaamista – Kynnys kokeilla on alhainen • Soveltuvat ohjelmiston ominaisuuksien esittelyyn – Valmis testikohde, jonka rajapinta ei ole muutosaltis • Nauhoitusta voi kuitenkin käyttää luomaan runko, josta rakennetaan yleiskäyttöisiä hyviä testejä – Muokataan nauhoitettua esim. Python-koodia Ohjelmistotekniikka Ohjelmistojen testaus, 2015 385(504) Komentojonot eli skriptit 1/2 • Koodataan skripti suorittamaan tietty sekvenssi – – – – – Jokainen testitapaus on siis pieni ohjelma tai funktio Muutos sekvenssiin vaatii pienen muutoksen osaan skriptiä Syöte- ja tulostiedot ovat osa skriptiä Skriptit ovat hyvin strukturoituja ja dokumentoituja Tyypillinen tapa yksikkötestauksessa • Skriptien varautuminen virhetilanteisiin hallitaan hyvin • Vaatii osaamista ohjelmistosuunnittelusta – Samanlaista kurinalaisuutta – Samoja taitoja Ohjelmistotekniikka Ohjelmistojen testaus, 2015 386(504) Komentojonot eli skriptit 2/2 • Myös käyttö voi vaatia ohjelmointitaitoja • Skriptejä on kahdenlaisia – Lineaarisia • Skripti, joka vain syöttää dataa (tms.) ja tarkistaa, mitä tapahtui – Rakenteellisia • Kuin lineaariset skriptit, mutta kontrolli yms. koodattu käsin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 387(504) Dataohjattu testaus • Eriytetään testitapausten sisältö ja suorituskoodi • Taitovaatimukset, roolien jako – Skriptin koodaaminen vaatii ohjelmointitaitoja – Testijoukkojen luominen vaatii testaustaitoja 1) Testien kuvaus testidatamassalla (yleisin merkitys) – Esimerkiksi suunnitellaan huolella iso lista tietueita tietokantaan, joista sen pitäisi selvitä kunnialla – Ajetaan skriptillä, joka syöttää kunkin tietueen ja tarkistaa, mitä tapahtui – Mitä vs. miten 2) Testitapaukset kirjoitetaan dataksi – Tyypillisesti sarja matalan tason komentoja – Käytettävissä olevat komennot riippuvat skriptistä – Skripti suorittaa annetun testitapauksen tai testijoukon • Sisältää toteutuksen yksinkertaiselle navigoinnille tyyliin "paina nappulaa X" Ohjelmistotekniikka Ohjelmistojen testaus, 2015 388(504) Avain- ja toimisanat (keywords, action words) 1/2 • Lähes kaikki tietojenkäsittelyyn liittyvät ongelmat voidaan ratkaista lisäämällä uusi rajapinta tai nostamalla abstraktiotasoa • Avainsana (keyword) kuvaa joitakin käyttöliittymän toimintoa – kwSelectMenu ”File”, kwPressButton btOK – Myös vertailuja: kwCompareText ”foo.txt” – Matalan tason toiminnot • Toimisanat (action words) kuvaavat korkeammalla tasolla käyttäjän toimia – awSendEmail on sama toiminto eri alustoilla – Voi koostua useasta avainsanasta – Toimisanat edustavat ongelmakentän sanastoa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 389(504) Avain- ja toimisanat (keywords, action words) 2/2 • Testitapaukset määritellään toimisanojen avulla – Kuvaus toimisanoista avainsanoiksi määritellään erillisessä datassa – Avainsanat toteutettu skriptissä (esim. pieni Python-funktio) • Toimisanoilla saavutetaan korkea siirrettävyys – Jos toimisanaa vastaavan toiminnon toteutus käyttöliittymässä muuttuu, niin korjataan toimisanan määrittelyä avainsanoilla – ei välttämättä tarvetta koskea testeihin • Tuoteperheen eri jäsenille sama testi – Tarvittaessa joka jäsenelle oma avain- ja mahdollisesti toimisanatoteutus Ohjelmistotekniikka Ohjelmistojen testaus, 2015 390(504) Mallipohjainen 1/2 • Mallipohjainen testaus perustuu järjestelmään käyttäytymistä kuvaavaan malliin – Kuvataan mm. tilakoneilla – Alunperin käytetty lähinnä protokolla- ja API-testauksesta – Nykyään yhä enemmän myös sulautettujen järjestelmien ja GUItestauksessa • Yksikertaisimmillaan kuvaa joukon sekvenssejä esim. käyttöliittymän läpi • Vahvuus – – – – Käyttötapojen variointi Syötteiden variointi Rinnakkaisuuden hallinta Mallit voivat sisältää myös odotetut tulokset • Smart monkey vs. dumb monkey testing Ohjelmistotekniikka Ohjelmistojen testaus, 2015 391(504) Mallipohjainen 2/2 • Heikkoudet? – Työkalujen käyttö vaatii uutta osaamista – Organisaatioon kohdistuvat muutospaineet, jos testitapauksia ei enää tarvitse erikseen suunnitella – Vaatii uuden tavan ajatella testausta • Testimalli ei kuvaa testitapausta, vaan se on lähempänä testijoukkoa – Oikea taso mallille • Mallinnetaanko käyttöliittymän elementtejä ja niihin kohdistuvia syötteitä – nopea apinatestaus • … vai mallinnetaanko käyttäjän toimia – avain- ja toimisanat tilasiirtymien niminä – Mallintaminen vaatii eniten osaamista (mallien laatu vs. testien laatu) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 392(504) 12.9 Automatisoinnin suunnittelu 1/2 • Tunnista testitilanteet – Mitä voidaan testata – Priorisoi – Raja-arvoanalyysi, ekvivalenssiluokat • Suunnittele testitapaukset – Miten valittu asia voidaan testata – Testin tarkoitus, oletettu tulos Ohjelmistotekniikka Ohjelmistojen testaus, 2015 393(504) Automatisoinnin suunnittelu 2/2 • Luo testitapaukset (mallipohjaisessa testauksessa testimallit) – Skriptit, datat, tulokset jne. – Asetus- ja puhdistusoperaatiot – Esi- ja jälkiehdot • Suorita testit • Vertaile saatuja tuloksia oletettuihin tuloksiin – Oletus: jos molemmat ovat samat, niin testi OK – Huomaa muuttuvat asiat kuten kellonaika ja päiväys • Säännölliset lausekkeet Ohjelmistotekniikka Ohjelmistojen testaus, 2015 394(504) Konfiguraationhallinta • Testimateriaali ajan tasalla – Skriptit – Testidata • Ohjelmiston versio – Testware liittyy olennaisesti tiettyyn versioon testattavasta ohjelmistosta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 395(504) Esi- ja jälkikäsittely • Automaation vaatiman datan määrä on yleensä suuri – Tiedon läpikäynti käsin on aikaa vievää ja virhealtista • Esikäsittelyllä valmistetaan dataa – Tekstistä binääriseen muotoon – Tietokannan taulut – Tietoelementtien kombinointi • Jälkikäsittely tarkastaa ja muokkaa tuloksen – Vertailuja loki-tiedostoon (säännöllisillä lauseilla) – Tietokannan muutokset – Binäärisestä (ihmisen tulkittavaan) tekstimuotoon Ohjelmistotekniikka Ohjelmistojen testaus, 2015 396(504) 12.10 Tunnettuja työkaluja • Toiminnalliseen testaukseen – HP QuickTestPro, IBM Rational Functional Tester, Robot Framework, jne. • Suorituskykytestaukseen – HP LoadRunner, IBM Rational Performance Tester, JMeter, jne. • Testauksen hallinta – HP Quality Center, TestLink, jne. • Testauksen skriptauskielet – Perl, Python, Ruby, Visual Basic, Java, C++ • Testauskehykset – xUnit, Fit(Nesse), QTest • Jatkuvan integroinnin moottorit – Jenkins, Hudson • Vertailu-, haku- ja käsittelytyökalut – diff, grep, awk Ohjelmistotekniikka Ohjelmistojen testaus, 2015 397(504) 12.11 Automatisointiprojekti 1/2 • Aloitetaan yleensä suurin lupauksin – Työkalu ratkaisee testauksen ongelmat – Automatisoidut testit ovat halpoja – Kun käyttöliittymän läpi testaava automaatio vilistää ruudulla, tulee helposti euforinen olo siitä, että tuotteen laatu paranee silmissä – jos ei ymmärrä mitä todellisuudessa tapahtuu • Kaatuu monesti illuusion särkymiseen – Huonojen käytäntöjen automatisointi ei parantanut tilannetta • Automatisoitiin vääriä, huonoja tai virheellisiä testejä – Valittiin väärä tai epäyhteensopiva (ja kallis) työkalu – Ylläpitoon ei oltu varauduttu • Skriptien muuttaminen työlästä • Testien riippuvuutta ohjelmistoversiosta ei huomioitu Ohjelmistotekniikka Ohjelmistojen testaus, 2015 398(504) Automatisointiprojekti 2/2 – ”Automatisoidaan kaikki testit” yms. epärealistiset tavoitteet – Automatisoijat ovat usein kalliimpia kuin manuaaliset testaajat, samalla rahalla olisi saavutettu paljon aikaan manuaalisessa testauksessa – Automaatio ei toivu virheistä • Kannattaa aloittaa kevyesti – – – – Kannattaa kokeilla useampia eri työkaluja Pilottiprojekti Aloitetaan esim. savutestien automatisoinnista Otetaan selvää, onko joku muu projekti/organisaatio käyttänyt vastaavaa välinettä vastaavassa projektissa – Testausstrategia ja ihmisten sitoutuminen kuntoon • Automaatio ei vähennä testauksen suunnittelun tarvetta Ohjelmistotekniikka Ohjelmistojen testaus, 2015 399(504) 12.12 Työkalun valinta Päämäärät Hankintasuunnitelma Ensimmäiset kokeilut Haastattelut vertailu useita vaihtoehtoja Vaihtoehtojen karsiminen yksi vaihtoehto Hankinta ja kokeilu Kokeiluprojekti Käyttöönotto Kuvan lähde: Jussi Niutanen. Symbian-sovellusten testauksen automatisointityökalut. Diplomityö, TTY, Sähkötekniikan osasto, 2005. Automatisoinnin kehittäminen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 400(504) Testaustyökalun ostajan muistilista 1/3 • Mukailtu lähteestä: Dustin, Rashka, Paul: Automated Software Testing, Addison Wesley, 1999. • Arvioi miten työkalu tulee parantamaan nykytilannetta • Miten valita oikea työkalu • Miten paljon rahaa työkaluun ollaan valmiita sijoittamaan • Paljonko työkalun käyttöönotto vaati ylimääräistä aikaa • Kuinka paljon työkalun käyttö vaatii asiantuntemusta – Tarvitaanko uutta työvoimaa? • Paljonko käyttäjien kouluttaminen tulee maksamaan Ohjelmistotekniikka Ohjelmistojen testaus, 2015 401(504) Testaustyökalun ostajan muistilista 2/3 • Kuinka työkalun käyttökelpoisuutta voidaan arvioida ennen hankintapäätöstä – Tärkeää evaluoida omista tarpeista käsin – Pilotointi • Kuinka työkalun käyttöönotto toteutetaan • Muutamia nyrkkisääntöjä – Hyväkään testiautomaatio ei korvaa ammattitaitoisia testaajia ja hyvää testausstrategiaa • Se voi kyllä täydentää niitä – Ei kannata olettaa, että testityökalut olisivat sen laadukkaampaa softaa kuin muut ohjelmistokehityksen apuvälineet – Mikäli testataan graafista käyttöliittymää, kannattaa olettaa, että se muuttuu usein Ohjelmistotekniikka Ohjelmistojen testaus, 2015 402(504) Testaustyökalun ostajan muistilista 3/3 – Testiautomaatioskripti on tyhmä, testitapaukset vaativat hyvää suunnittelua • Manuaalista testiä suunnitellessa voi aina olettaa, että testaaja on ajatteleva ihminen – Mikäli mahdollista, testiskriptit pitäisi kirjoittaa yleiskäyttöisellä skriptauskielellä • Oppimiskynnys, valmiiden kirjastojen puute, testaajien ja kehittäjien yhteistyö • Vaatimus työkaluspesifisen kielen käyttämiseen voi olla hyvä syy ko. työkalun hylkäämiseen • Lukittuminen tiettyyn toimittajaan Ohjelmistotekniikka Ohjelmistojen testaus, 2015 403(504) Yhteenveto • Testiautomaatio ei poista manuaalista testausta, vaan täydentää sitä • Automaation tekeminen on kalliimpaa kuin manuaalinen testaus – Testien toisto on halvempaa • Automaatio vaatii ohjelmistoteknistä osaamista – Testwaren suunnittelu ja toteutus – Konfiguraationhallinta • Uusia virheitä löydetään paremmilla testeillä – ei vanhojen automatisoinnilla Ohjelmistotekniikka Ohjelmistojen testaus, 2015 404(504) 12.13 Mallipohjainen testaus • Mukailtu lähteistä Ibrahim K. El-Far, James A. Whittaker: Model-based Software Testing ja [Broekman&Notenboom 02] • Testaajilla on usein mielessään jonkinlainen implisiittinen malli testikohteen käyttäytymisestä – Tyyliin: jos teen toiminnon A, voin sen jälkeen valita tehtäväksi joko toiminnon B tai C • Mallipohjaisen testauksen ideana on yksinkertaisesti kirjata tämä testimalli ylös ja käyttää sitä eksplisiittisesti testauksen apuna • Mikäli malli on tarpeeksi tarkka, voidaan sitä – Jakaa useamman testaajan kesken – Uudelleenkäyttää Ohjelmistotekniikka Ohjelmistojen testaus, 2015 405(504) Mallinnus 1/2 • Mallin testikohteesta tekee ideaalitapauksessa se, joka ymmärtää parhaiten kuinka testikohteen pitäisi käyttäytyä • Malli pitäisi tehdä jo kehitysvaiheessa, mutta mikäli se on jäänyt tekemättä, kannattaa sen tekeminen joissain tapauksissa myös pelkästään testausta varten – Mallin tekemisen kannattavuus riippuu mm. siitä kuinka kauan kohteen testauksen oletetaan kestävän – Mikäli kehitysvaiheessa tehdystä mallista on generoitu toteutus automaattisesti, ei testausta yleensä kannata perustaa yksin tähän malliin, koska silloin testattaisiin vain koodingeneroinnin oikeellisuutta • Mikäli malli paisuisi muuten liian mutkikkaaksi, voidaan sen kokoa rajoittaa keskittymällä vain testauksen kannalta mielenkiintoisiin (riskialttiimpiin) osiin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 406(504) Mallinnus 2/2 • Monesti testauksen kannalta hyödyllisin tapa mallintaa testikohteen käyttäytymistä on tilakone • Formaalisti äärellinen tilakone (FSM eli Finite State Machine) voidaan esittää viisikkona (S, T, A, F, L), jossa – – – – S on järjestelmän mahdollisten syötteiden joukko T on järjestelmän tilojen joukko A on järjestelmän alkutila F on tilasiirtymäfunktio S x T → T • kertoo mihin tilaan siirrytään kun nykyisessä tilassa saadaan uusi syöte – L on järjestelmän lopputilojen joukko • Tilakone on kullakin hetkellä vain yhdessä tilassa kerrallaan Ohjelmistotekniikka Ohjelmistojen testaus, 2015 407(504) Esimerkkimalli 1/2 • Esimerkkinä yksinkertainen jonkin mediasoittimen toimintaa kuvaavaa tilakonemalli, jossa – – – – S = {Play, Rec, FF, Rwd, Stop} T = {Valmius, Toisto, Nauhoitus, Kelaus eteen, Kelaus taakse} A = Valmius, L = {Valmius} F määritellään taulukon avulla siten, että ylin vaakarivi kertoo painettavan näppäimen nimen ja vasemmanpuoleisin pystyrivi sen tilan missä ollaan, risteyksestä löytyy tila, johon siirrytään: Play Rec FF Rwd Stop Valmius Toisto Nauhoitus Kelaus eteen Kelaus taakse Valmius Toisto Toisto Toisto Toisto Toisto Valmius Nauhoitus Nauhoitus Nauhoitus Nauhoitus Nauhoitus Valmius Kelaus eteen Toisto Kelaus eteen Kelaus eteen Kelaus eteen Valmius Kelaus Ohjelmistotekniikka taakse Toisto Ohjelmistojen testaus, 2015 Kelaus taakse Kelaus taakse Kelaus taakse 408(504) Valmius Esimerkkimalli 2/2 • Äärellinen tilakone voidaan piirtää suunnattuna graafina: Toisto Kelaus eteen Play FF, Rwd, Rec, Play Stop Stop Stop Play FF, Rec, Rwd Valmius Play FF Rec Stop Rwd Kelaus taakse Stop Nauhoitus Play, FF, Rec, Rwd Rwd, Rec, FF Ohjelmistotekniikka Ohjelmistojen testaus, 2015 409(504) Erityisiä mallityyppejä 1/2 • UML:n tilakoneet ovat äärellisen tilakoneen laajennus, joissa sallitaan lisäksi mm. – Tilojen alitilat, eli käytännössä tila voi sisältää toisen tilakoneen – Rinnakkaiset tilat, eli tilakone voi olla useassa tilassa yhtä aikaa • Myös Markov-ketjut, joilla voidaan mallintaa stokastisia järjestelmiä, voidaan nähdä eräänlaisina tilakoneiden laajennuksena – Käyttökelpoisia esim. silloin kun halutaan kerätä tietoa virheiden todennäköisyyksistä järjestelmän luotettavuutta arvioitaessa – Ns. operationaaliset profiilit, jotka pyrkivät mallintamaan käyttäjien toimintaa, ovat eräs tapa hyödyntää tilastotietoa testauksessa • Esim. mikäli videonauha on lopussa, on todennäköisempää, että käyttäjä kelaa nauhaa taaksepäin kuin eteenpäin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 410(504) Erityisiä mallityyppejä 2/2 • Aktiomallit perustuvat muuttujiin ja aktioihin – Järjestelmän tila tallennetaan muuttujiin – Kullakin aktiolla on esiehto (vahti), joka kertoo millaisissa tiloissa se voidaan suorittaa, ja jälkiehto, joka kertoo millaisia vaikutuksia tilaan sen suorituksella on • Esimerkiksi tapahtuma Pienennä, joka voidaan suorittaa kun x > 0, ja jonka suorituksen seurauksena x ← x – 1 – Aktiomallissa tapahtumien logiikka nousee selkeämmin esiin kuin tilakoneessa, mutta järjestelmän täsmällinen tila ja sen muutokset ovat vaikeampia hahmottaa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 411(504) Testien generointi 1/3 • Kun käyttäytyminen on mallinnettu äärellisen tilakoneen avulla, on testitapausten suunnittelu helppoa – Testitapauksia voidaan generoida automaattisesti • Jokainen testitapaus vastaa jotakin polkua suunnatussa graafissa – Jotta testitapaukset olisivat riippumattomia toisistaan, kannattaa niiden aina alkaa tilakoneen alkutilasta (tai jostain muusta tunnetusta tilasta) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 412(504) Testien generointi 2/3 • Esimerkki testitapauksesta, jossa ensin nauhoitetaan, sitten kelataan taaksepäin ja sitten toistetaan: Toisto FF, Rwd, Rec, Play 5 Kelaus eteen Play Stop Stop Stop Play FF, Rec, Rwd FF Valmius Play 3 Stop Rwd 4 Kelaus taakse 1 Rec Stop 2 Nauhoitus Play, FF, Rec, Rwd Rwd, Rec, FF Ohjelmistotekniikka Ohjelmistojen testaus, 2015 413(504) Testien generointi 3/3 • Testitapaus voidaan ajaa manuaalisesti seuraamalla polkua tilakoneessa • Vaihtoehtoisesti polku voidaan koodata esim. testiskriptiksi, joka kutsuu vastaavaa toiminnallisuutta polun kaarien osoittamassa järjestyksessä • Mikä parasta, testien tuottaminen on helppo automatisoida Ohjelmistotekniikka Ohjelmistojen testaus, 2015 414(504) Mallin suorituksen seuranta 1/2 • Yleisesti ottaen, malli ei sinällään helpota testien tulosten keräämistä • Testikohde on kuitenkin mahdollista instrumentoida siten, että sen käyttäytymistä voidaan tarkastella tilakoneesta käsin – Laiton käyttäytyminen on helppo todeta esim. tilanteessa, jossa testikohde yrittää siirtää tilakoneen tilasta toiseen sellaisella syötteellä, jonka pitäisi pitää tila samana Ohjelmistotekniikka Ohjelmistojen testaus, 2015 415(504) Mallin suorituksen seuranta 2/2 • Tilakoneesta voidaan kätevästi nähdä paitsi ne testitapaukset jotka on suoritettu, myös ne joita ei vielä ole suoritettu • Testikattavuus voidaan tilakoneessa määritellä annettujen syötteiden, saavutettujen tilojen tai läpikäytyjen kaarien avulla – Voidaan vaatia, että testeissä esim. kaikki mahdolliset syötteet on annettu, kaikki tilat on täytynyt saavuttaa ja puolet kaarista käydä läpi – Huom! Kattavuus mallin elementtien suhteen voi käytännössä tarkoittaa hyvin eri asiaa kuin kattavuus testikohteen koodissa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 416(504) Epädeterminismi ja reaaliaikajärjestelmät • Epädeterminismi – Mikäli tilasta voidaan siirtyä samalla syötteellä kahteen tai useampaan eri tilaan, on kyseessä epädeterministinen tilakone – Tämä on eräs tapa mallintaa mm. laitteen ympäristössä tapahtuvia ilmiöitä kuten esimerkiksi tietoliikenneverkon häiriöitä • Reaaliajan mallintamista varten on olemassa erilaisia tilakoneiden laajennuksia – Ominaisuudet tyyliin: tilassa A ei saa viipyä yhtäjaksoisesti kauempaa kuin 3 ms Ohjelmistotekniikka Ohjelmistojen testaus, 2015 417(504) Tilaräjähdys 1/2 • Valitettavasti tilakoneet kärsivät ns. tilaräjähdysongelmasta (state space explosion) • Tilaräjähdys tarkoittaa sitä, että ei-triviaalin järjestelmän käyttäytymistä kuvaava malli kasvaa niin suureksi (paljon tiloja ja tilasiirtymiä), että sitä ei pystytä enää käsittelemään nykyisillä algoritmeilla tehokkaasti • Eräs ratkaisu: pienennetään tilakonetta joko – Jättämällä jotain mallintamatta – Abstrahoimalla käyttäytymistä • Esim. monimutkainen syöte testikohteelle mallinnetaan vain kahdella vaihtoehdolla: laillinen syöte ja laiton syöte Ohjelmistotekniikka Ohjelmistojen testaus, 2015 418(504) Tilaräjähdys 2/2 – Yleisessä tapauksessa tilakoneen pienentäminen on hankala ja tarkkuutta vaativa tehtävä • On helppo saada aikaiseksi pienempi tilakone, joka ei enää vastaakaan testikohteen oletettua käyttäytymistä – Toinen yleisesti käytetty tekniikka on tila-avaruuden generointi lennossa vain siltä osin kuin se on sen hetkisen tilanteen kannalta tarpeellista Ohjelmistotekniikka Ohjelmistojen testaus, 2015 419(504) Tilakonetestauksen havaitsemia virheitä 1/2 • Tilakonetestauksen havaitsemia virheitä (aina kaikki näiden virheiden havaitsemiseen tarvittava tieto ei ole saatavilla): – Tilakoneen tilat, joilla ei ole sisään tulevia tilasiirtymiä • Malli on puutteellinen, ehkä myös toteutus • Esim. videonauhurin tapauksessa Pause-tila, johon ei pääse millään syötteellä mistään muusta tilasta – Jokin tila puuttuu tilakoneesta • On ehkä toteutettu jotain, mitä ei ole spesifioitu • Videonauhuriin on toteutettu Pause-tila, mutta sitä ei on tilakoneessa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 420(504) Tilakonetestauksen havaitsemia virheitä 2/2 – Tilakoneessa on ylimääräinen tila • Jotain on ehkä jäänyt toteuttamatta • Tilakoneessa on Pause-tila, mutta sitä ei ole toteutettu – Tilasiirtymä vie väärään tilaan • Mallissa on virhe, ehkä myös toteutuksessa • Syötteellä Play tilakone siirtyy Toista-tilasta Valmius-tilaan – Tilasiirtymä puuttuu • Malli on puutteellinen, ehkä myös toteutus • Toista-tilasta ei pääse Valmius-tilaan Stop-napilla Ohjelmistotekniikka Ohjelmistojen testaus, 2015 421(504) Off-line- vs. online-testaus 1/2 Test Behaviour Generate Test Suite Execute Test Suite Evaluate Test Results Report Results No Yes Online? Yes Test Objectives Select Next Test Step No Execute Step on Model& SUT Evaluate Result Objectives Achieved ? Adapted from: Alan Hartman, Mika Katara, and Sergey Olvovsky. Choosing a Test Modeling Language: a Survey. In Proceedings of the Haifa Verification Conference 2006, IBM Haifa Labs, Haifa, Israel, October 2006. Number 4383 in Lecture Notes in Computer Science, pages 204-218. Springer 2007. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 422(504) Off-line- vs. online-testaus 2/2 • Off-line-testauksessa generoidaan ensin testitapaukset ja sitten ne suoritetaan kuten perinteisessä automatisoinnissa • Online-testauksessa testien generointi ja suoritus etenevät yhtäaikaisesti testiaskel kerrallaan – Testitapauksia ei sinänsä ole, vain pitkiä testiajoja • Off-line on yhteensopivampi olemassa olevien testausprosessien kanssa, eli helpompi ottaa käyttöön • Online mahdollistaa pitkäkestoisten testien tekemisen ja sopii paremmin epädeterminististen järjestelmien testaukseen – Epädeterministinen testikohde voi vastata monella tapaa oikein tietyssä tilanteessa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 423(504) Työkalut? 1/2 • Kaupallisia työkaluja mallipohjaiseen testaukseen on olemassa, mm. – Conformiq Designer http://www.conformiq.com/products/conformiq-designer/ • Javalla höystetyt UML:n tilakoneet testimalleina • Testigeneraattori esim. TTCN-3-kielisten testien tekemiseen – Smartesting CertifyIt http://www.smartesting.com/index.php/cms/en/product/certify-it – ALL4TEC MaTeLo http://www.all4tec.net/index.php/en/modelbased-testing/20-markov-test-logic-matelo Ohjelmistotekniikka Ohjelmistojen testaus, 2015 424(504) Työkalut? 2/2 • Ilmaisia avoimen lähdekoodin työkaluja – TTY/OHJ:ssa kehitetty TEMA-työkalukokoelma http://tema.cs.tut.fi/ – VTT:n OSMO Tester http://code.google.com/p/osmo/ – Intel:n fMBT https://01.org/projects/fmbt – ModelJUnit http://www.cs.waikato.ac.nz/~marku/mbt/modeljunit/ – Jne… työkaluvalikoima kasvaa koko ajan • Luultavasti isompi ongelma kuin löytää oikeat työkalut on saada testaajat tekemään testimalleja Ohjelmistotekniikka Ohjelmistojen testaus, 2015 425(504) 13. Tietoturvan testaaminen Vielä pari vuotta sitten tietoturva oli aika pienen piirin mielenkiinnon kohteena. Valitettavasti nykypäivänä kaikkien on oltava siitä kiinnostuneita. Miten sitten tietoturvaan liittyviä seikkoja pitäisi testata? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 426(504) Tietoturvatestauksen iso haaste • Testauksen täytyy löytää kaikki ohjelmistossa olevat tietoturva-aukot, vastustajalle riittää yksi • Tietoturvaan liittyvät häiriöt ovat yleensä paljon huomaamattomampia kuin esim. toiminnallisuus- tai suorituskykyhäiriöt • Toiminnallisten ongelmien kanssa voidaan ”elää”, mutta yksikin haavoittuvuus voi olla tuhoisa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 427(504) 13.1 Mitä kaikkea kuuluu tietoturvallisuuteen? 1/2 • Ks. Wikipedian artikkeli http://fi.wikipedia.org/wiki/Tietoturva • Perusasiat: – Saatavuus tai käytettävyys (engl. availability): tieto on saatavilla, kun sitä tarvitaan. – Luottamuksellisuus (engl. confidentiality): tietoa voivat käsitellä vain sellaiset henkilöt, joilla on siihen oikeus. – Eheys (engl. integrity): tieto ei saa muuttua tahatta tai hyökkäyksessä, tai muutos pitää ainakin havaita; toisinaan eheys määritellään myös tietojen loogisuudeksi (ns. sisäinen eheys) ja paikkansapitävyydeksi (ns. ulkoinen eheys). Ohjelmistotekniikka Ohjelmistojen testaus, 2015 428(504) Mitä kaikkea kuuluu tietoturvallisuuteen? 2/2 • Näitä täydentäviä: – Kiistämättömyys: Henkilö ei voi menestyksellisesti kiistää tekoa, jonka hän on tehnyt. Kiistämättömyys riippuu viime kädessä siitä, mitä oikeudessa hyväksytään näytöksi. – Tunnistus: Henkilö (tietojärjestelmän käyttäjä) voidaan tarvittaessa liittää käyttäjätunnukseen (joka voi olla anonyymi) ja voidaan kenties luotettavasti tunnistaa luonnolliseksi tai oikeushenkilöksi. • Tietoturvan osa-alueita ovat työasemien tietoturva, palvelinten tietoturva, tietokoneverkon tietoturva. ympäristöturvallisuus ja sovellusten turvallisuus. – Tällä kurssilla meitä kiinnostaa lähinnä sovellusten turvallisuus Ohjelmistotekniikka Ohjelmistojen testaus, 2015 429(504) 13.2 Tietoturvan testaaminen tärkeää • Tietokoneita (PC, tabletti, kännykkä jne.) käytetään yleisesti luottamuksellisten ja salaisten tietojen säilyttämiseen • Tietoja siirretään pilveen ja takaisin • Tietojärjestelmät ovat täynnä ihmisille ja yrityksille kriittisiä tietoja • Kaikki digitaaliset laitteet ovat pian kiinni verkossa • Mikäli jätät tietoturvan testauksen tekemättä, murtautujat tekevät sen puolestasi! Ohjelmistotekniikka Ohjelmistojen testaus, 2015 430(504) … mutta unohtuu usein • Ohjelmisto voi toimia muuten täysin oikein, mutta se voi silti sisältää virheitä, jotka voivat vaarantaa tietoturvan • Tietoturvaan liittyviä vaatimuksia ei vielä nykyään ymmärretä kovin laajasti – Verkko on täynnä softaa, jonka tekemisessä ei ole kiinnitetty yhtään huomiota tietoturvaan – Esim. käyttöjärjestelmiä joudutaan jatkuvasti paikkaamaan tietoturvapäivityksillä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 431(504) 13.3 Tietoturvatestauksen kohteet • • • • • • Verkkoliikenne. Palvelinympäristöt. Käyttäjän tietokoneympäristöt. Mobiililaitteet. Digitaaliset laitteet. Sovellukset. • Tässä kalvosarjassa katsellaan lähinnä sovellustasoa. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 432(504) 13.4 Tietoturvatestauksen luonne • Testaus on laajempi kokonaisuus, jossa – Arvioidaan kohteen tietoriskejä – tärkeät tiedot, miten ne houkuttelevat, mitä pitää erityisesti suojata. – Tarkastetaan suunnitelmia ja toteutusta – onko käytetty asianmukaisia suojauksia ja suunnitteluratkaisuja, onko toteutus asianmukainen. – Testataan, että kaikki suojausmekanismit toimivat. • Tehdään toiminnallista testausta. • Kokeillaan erityisiä hyökkäyksiä. – Asiaan liittyy myös käytettävyyden arviointi ja testaus: ihmisen käyttövirheet ovat olennainen tapa altistaa tieto ulkopuolisille. – Samoin kuormitustestauksella tarkistetaan, että sovellus kestää palvelunestohyökkäykset asianmukaisesti. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 433(504) 13.5 Lähtökohtana riskianalyysi • Tietoturvatestauksen tarpeita voi selvittää riskianalyysin avulla, jolla saadaan selville tietojen ja liiketoiminnan suojauksen kannalta tärkeimmät seikat • Mitä tietoa käsitellään? • Millaisia riskejä tietoon liittyy? • Mitkä tiedot pitää suojella kaikkein varmimmin? • Riskianalyysin jälkeen tiedetään, minkä asioiden testaamiseen kannattaa panostaa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 434(504) 13.6 Paljon ohjeita • Tietoturvaa voidaan varmistaa ja täytyy varmistaa monella tasolla, esim. serverin fyysinen sijoittelu vs. palomuurit vs. käyttäjien autentikointi • Julkishallinto on ohjeistanut tietoturvakysymyksissä tietojärjestelmien käyttäjiä ja toimittajia: http://www.2014.vm.fi/vm/fi/16_ict_toiminta/009_Tietoturvallisuus /02_tietoturvaohjeet_ja_maaraykset/index.jsp • Uuden järjestelmän kehittämisessä pitää ensin katselmoida, että oikeat suojausmekanismit ovat periaatteessa olemassa ja sitten testata, että kaikki on muistettu käytännössäkin ja että kaikki toimii turvallisesti. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 435(504) 13.7 OWASP – Nettisivustojen tietoturva • https://www.owasp.org, The Open Web Application Security Project • Organisaatio nettisivustojen turvallisuuden parantamiseen • Kuuluisa uhkien Top 10 –listastaan, jota monet organisaatiot käyttävät tietoturvatestauksensa perustana • Monet työkalutkin keskittyvät juuri niiden uhkien testaamiseen • Suomessa: OWASP Helsinki – https://www.owasp.org/index.php/Helsinki – Sivulla paljon hyödyllistä materiaalia Ohjelmistotekniikka Ohjelmistojen testaus, 2015 436(504) OWASP – Nettisivustojen haavoittuvuudet • Esimerkkinä OWASP Top 10 – 2015 (http://owasptop10.googlecode.com/files/OWASP%20Top%2 010%20-%202015.pdf) – – – – – – – – – – A1 Injection A2 Broken Authentication and Session Management A3 Cross-Site Scripting (XSS) A4 Insecure Direct Object References A5 Security Misconfiguration A6 Sensitive Data Exposure A7 Missing Function Level Access Control A8 Cross-Site Request Forgery (CSRF) A9 Using Components with Known Vulnerabilities A10 Unvalidated Redirects and Forwards • Näitä ei nyt ole mahdollisuuksia käydä tarkemmin läpi, mutta kiinnostuneiden kannattaa perehtyä. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 437(504) OWASP Testing guide • Kattava opas tietoturvatestaukseen: • https://www.owasp.org/index.php/OWASP_Testing_Guide_v4 _Table_of_Contents • Huomattava, että opas käsittelee vain tietoturvallisuuden ja haavoittuvuuksien ”teknistä testausta” – tietoriskianalyysi on aina asia, jolla kokonaisvaltainen testausprosessi on syytä aloittaa. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 438(504) 13.8 OWASP – Mobiiliturvallisuus • Mobiiliturvallisuusprojektin sivut: • https://www.owasp.org/index.php/OWASP_Mobile_Security_ Project#tab=Home • Edelleen (kevät 2015) ”work in progress”. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 439(504) 13.9 PC-sovellusten uhista • Toisin kuin perinteisessä testauksessa, tietoturvan testauksessa on vähemmän hyötyä spesifikaatioista • Sen sijaan, että testattaisiin täyttääkö ohjelmisto spesifikaationsa, kannattaa erityisesti tutkia – Mitä sivuvaikutuksia toteutus sallii • Puskurin ylivuodon seurauksena voidaan suorittaa vierasta koodia – Miten ohjelmisto käyttäytyy ympäristönsä kanssa • Käyttöjärjestelmäkutsut, verkkoliikenne yms. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 440(504) Käyttöliittymän kautta tulevat uhat 1/2 • Käyttöliittymän suojaus luvattomilta käyttäjiltä esim. salasanan avulla – Toimiiko käyttäjän tunnistaminen oikein? – Hyväksytäänkö heikkoja salasanoja? • Kelpaako esim. käyttäjätunnus salasanaksi? – Mikäli käyttäjä saa päästä käsiksi vain osaan tiedoista (esim. kotihakemisto monen käyttäjän käyttöjärjestelmässä) toimivatko rajoitukset oikein? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 441(504) Käyttöliittymän kautta tulevat uhat 2/2 • Voidaanko käyttöliittymän kenttiin syöttää laittomia syötteitä kuten liian pitkiä merkkijonoja? – Seurauksena voi olla esim. puskurin ylivuoto, jonka seurauksena taas voi vierasta koodia päästä suoritukseen – Järjestelmä voi myös kaatua, mikä voi tarkoittaa palvelunestoa eli järjestelmän tarjoamia palveluja ei voida käyttää (denial of service) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 442(504) Tiedostojärjestelmän kautta tulevat uhat • Ohjelmistojen liitynnät tiedostojärjestelmään jäävät usein huonolle testaukselle • Tiedostoihin kuitenkin tallennetaan salaisuuksia kuten salasanoja, lisenssiavaimia yms. • Windows-maailmassa registry on erityisen huono paikka tallentaa salaisuuksia – Unix-maailmassa sama pätee tietysti ohjelmien omiin konfiguraatiotiedostoihin (.emacs tms.) • Tiedostoformaattien perusteella voidaan tehdä fuzz-testausta, joka tarkistaa kuinka robustisti tiedosto-operaatiot on toteutettu Ohjelmistotekniikka Ohjelmistojen testaus, 2015 443(504) Käyttöjärjestelmän kautta tulevat uhat • Mikäli ohjelma säilyttää muistissaan kryptattuna salaista tietoa, on tämä yleensä turvassa; ongelmia syntyy silloin kun tietoa käsitellään kryptaamattomana – Esim. salasanojen hallintaohjelmat dekryptaavat vain täsmälleen sen verran kerrallaan kuin tarvitaan • Mikäli käyttöjärjestelmän tarjoamat resurssit vähenevät, kuten käytettävissä olevan muistin määrä, seurauksena saattaa olla esim. – Palvelunesto – Ohjelman kontrolloimaton kaatuminen • Voidaanko salaiset tiedot dumpata levylle selväkielisinä? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 444(504) Toisten ohjelmien kautta tulevat uhat • Yhä suuremmassa määrin ohjelmat käyttävät muita ohjelmia erilaisten rajapintojen kautta • Mitä tapahtuu, jos jokin toinen ohjelma joutuu hyökkäyksen uhriksi tai kaatuu? • Testaajan täytyy selvittää kytkennät muihin ohjelmiin ja selvittää tilanteet, joissa nämä saattavat aiheuttaa uhan tietoturvalle • Esimerkiksi kommunikoitaessa verkon kautta on syytä varmistaa, että ohjelmisto toimii oikein laittomien pakettien, liian lyhyiden ja liian pitkien pakettikehysten yms. kanssa – Fuzz-testaus on tässä jälleen paikallaan – Vastaavia huolen aiheita liittyy myös tavallisiin rajapintoihin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 445(504) Ohjelmiston itsensä suojaaminen • Joskus ohjelma sisältää algoritmeja yms., jotka antavat edun kilpailijoihin nähden • Tällöin on järkevää suojautua takaisinmallintajia vastaan, jotka voivat yrittävät selvittää koodin sisältöä esim. disassembleria käyttäen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 446(504) Muita uhkia • Monesti hyökkäykset saattavat tulla monelta rintamalta yhtä aikaa – Esim. blokataan sovelluksen pääsy johonkin kirjastoon ja annetaan käyttöliittymän kautta laiton syöte samanaikaisesti • Joskus myös ohjelmistoon sisäänrakennetut ”ominaisuudet” saattavat tarjota turvallisuusreikiä – Binääriin on esimerkiksi saattanut jäädä mukaan instrumentoitua testikoodia, joka tarjoaa valmiita koukkuja testitapausten suorittamista varten • Yksittäisen komponentin kehittäjä on saattanut olla tietämätön kokonaisuudesta, johon komponentti kuuluu – Mikäli esim. parametrina välitettävä tieto on salaista, sitä ei saa kirjoittaa edes väliaikaisesti selväkielisenä levylle Ohjelmistotekniikka Ohjelmistojen testaus, 2015 447(504) Avoimuuden haaste • Testausrajapinnat voivat tarjota myös suojaukset ohittavia reittejä sovellukseen. • Ohjelman repositoryissä tarjolla olevat testitapausten skriptit voivat paljastaa reittejä suojausten ohittamiseen. – Avoimen lähdekoodin sovellusten erityinen haaste – koodi on tarjolla kräkkereille tutustuttavaksi – yhteisön pitää huolehtia, että aukkoja ei ole. – Toisaalta avoimuus tekee aukkojen löytämisen ja korjaamisen paljon todennäköisemmäksi; tietoturvaekspertit yleensä suosivat avoimuutta. • Joskus ohjelman koodeista löytyy tietoa testaustunnuksista, joita hyökkääjä voi käyttää. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 448(504) Esimerkkihyökkäyksiä sovelluksille 1/7 • Blokkaa sovelluksen kutsut (dynaamisiin) kirjastoihin – Käytetään työkalua, jonka avulla voidaan tarkkailla mitä kirjastoja sovellus kutsuu missäkin tilanteessa ja blokataan kutsut johonkin tiettyyn kirjastoon Testataan, että sovellus ei vaaranna tietoturvaa vaikka kirjastoa ei olisikaan saatavilla – Mikäli yritetään kutsua kirjastofunktiota, johon pääsy on blokattu, seurauksena on yleensä poikkeuskäsittelyn käynnistyminen • Usein poikkeustenkäsittelijöitä ei ole testattu niin hyvin kuin muuta koodia • Seurauksen voi olla sovelluksen kaatuminen ja salaisten tietojen dumppaaminen näytölle tai levylle Ohjelmistotekniikka Ohjelmistojen testaus, 2015 449(504) Esimerkkihyökkäyksiä sovelluksille 2/7 – Sovellus voi myös näyttää jatkavan toimintaa normaalin tapaan, vaikka kirjastofunktion tarjoamaan palvelua ei olisikaan käytettävissä • Tämä voi olla merkki esimerkiksi siitä, että sovelluksessa ei tarkasteta jotain paluuarvoa vaikka pitäisi • Seurauksena voi olla jopa väärien oikeuksien myöntäminen käyttäjälle Ohjelmistotekniikka Ohjelmistojen testaus, 2015 450(504) Esimerkkihyökkäyksiä sovelluksille 3/7 • Etsi epäilyttäviä optioita ja niiden yhdistelmiä – Sekä komentoriviltä, että graafisen käyttöliittymän kautta annettavien optioiden testaus on vaikeaa mahdollisten kombinaatioiden suuren määrän vuoksi – Mikäli testauksessa keskitytään vain käyttäjän kannalta oleellisimpiin vaihtoehtoihin, on hyvinkin mahdollista, että joidenkin optioiden valinnan seurauksena sovellus suorittaa testaamatonta koodia – Kannattaa yrittää etsiä sellaisia optioiden kombinaatioita, joiden yhteisvaikutuksesta tietoturva voi vaarantua – Mikäli kyseessä on vanhan ohjelman uusi versio, kannattaa tutustua myös edelliseen versioon ja sen dokumentaatioon Ohjelmistotekniikka Ohjelmistojen testaus, 2015 451(504) Esimerkkihyökkäyksiä sovelluksille 4/7 – Mikäli jokin optio on kadonnut uuden version dokumentaatiosta, kannattaa kokeilla vieläkö toteutus tukee sitä ja jos tukee, toimiiko se turvallisesti • Käyttäjältä tulevan syötteen tarkastaminen voi olla toteutettu vain osalle optioista – Jos sovellus kysyy esimerkiksi osoitetta, ja maa voidaan valita ennalta määrätystä joukosta valikkoa käyttäen, voi postinumerokentän tarkastaminen riippua siitä mikä maa valitaan • Sovellus voi sallia ylipitkän ja kontrollimerkkejä sisältävän postinumeron syöttämisen… – Olisiko mahdollista syöttää SQL-lauseita ja suorittaa niitä? • …vai koodataan postinumerontarkastusalgoritmi myös ulkomaisille osoitteille? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 452(504) Esimerkkihyökkäyksiä sovelluksille 5/7 • Porttiskannaus – Verkkoa hyödyntävien sovellusten on suojauduttava porttiskannaajia vastaan – Käytetään testauksen apuna porttiskanneria – Testataan erityisesti sovellusspesifisten porttien käyttö (numerot 1024-65535) – Mikäli sovellus yrittää salata avoinna olevan portin antamalla virheilmoituksen kytkeytymisyrityksestä, täytyy virheilmoituksen olla standardimuotoa, ettei se herättäisi epäilyksiä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 453(504) Esimerkkihyökkäyksiä sovelluksille 6/7 • Etsi vaihtoehtoisia tapoja tehdä sama asia – Kuinka monella eri tavalla voit Windowsissa avata Wordasiakirjan? – Ovatko kaikki tavat varmasti testattu olevan turvallisia? – How to break software security -kirjan kirjoittajat löysivät tietoturva-aukon Windows XP:stä seuraavasti: Ohjelmistotekniikka Ohjelmistojen testaus, 2015 454(504) Esimerkkihyökkäyksiä sovelluksille 7/7 • Koska Windows Exploreria voi käyttää moneen samaan tarkoitukseen kuin Internet Exploreria, luetaan MS Exchange Serverin Outlook Web Access –rajapintaa käyttäen ensin sähköpostit IE:llä siten, että käynnistetään IE WE:n kautta • Session jälkeen suljetaan sekä WE- että IE-ikkunat • Seuraavaksi otetaan yhteyttä WE:llä sähköpostipalvelimeen ja kas kummaa, päästään sisään ilman salasanan kyselyä! • Kun yritetään lukea yksittäisiä posteja erillisestä ikkunasta, salasanaa kysytään, mutta käyttämällä Outlookin esikatselua salasanaa ei kysyä • Opetus: tietoturva saatiin murrettua kun käytettiin vaihtoehtoista tapaa tehdä sama asia: – Korvattiin Internet Explorer Windows Explorerilla – Korvattiin Outlookin posti-ikkuna esikatselulla • Huom! Tämä vika on sittemmin korjattu Ohjelmistotekniikka Ohjelmistojen testaus, 2015 455(504) Top 8 käytännöt tietoturvatestaukseen 1/2 1. Käytä apuna asiantuntijaa konsultoimaan tai/ja tekemään. Tämä on vaativa aihealue. – Neuvoja projektin alussa, vaativaa testausta myöhemmin. 2. Selvitä riskit – mitä tietoja pitää suojella luotettavasti. – Tietoturvapanostukset valitaan riskitason mukaan. – Muista olla sopivan vainoharhainen. – Riskianalyysi on yhteistyötä. 3. Analysoi tuotteen tekniikkaa – mitä kaikkia keinoja hyökkääjillä on päästä käsiksi tietoihin. – Selvitä käytettyjen teknologioiden sudenkuopat. – Kirjastot, protokollat, ohjelmointikielet, käyttöjärjestelmien heikkoudet… 4. Tutki ja testaa, miten suunnittelussa on varauduttu niihin. – Toiminnallisen testauksen tekniikat. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 456(504) Top 8 käytännöt tietoturvatestaukseen 2/2 5. Katselmoi ja tarkasta arkkitehtuuria, suunnittelua, toteutusta, turvamekanismeja. – Tietovarastot, komponentit, tietoliikenne, kryptauksen käyttö. 6. Testaa kaikki suojausmekanismit hyvin (salasanat, oikeustasot, kryptaus…). 7. Testaa, että systeemi on robusti eikä sitä saa esim. viallisilla tiedostoilla kaadettua palvelunestohyökkäystä tai murtautumista varten. – Fuzz-testaus on siihen yksi keino. – Vahva negatiivinen testaus. 8. Tutki käyttäjän toimintaa – inhimilliset virheet, tunnusten käsittelyn realismi. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 457(504) 14. Staattisen testauksen tekniikat Laadunvarmistajan ja testaajan työkalupakkiin kuuluu toisiaan täydentäviä tekniikoita. Seuraavassa tutustutaan hyväksi havaittuihin ryhmätyötekniikoihin sekä hieman myös automaattiseen koodin analysointiin. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 458(504) 14.1 Tarkastus • Koostettu mukaillen lähteestä: Ahtee, Haikala, Märijärvi: Tarkastukset (koulutusmateriaali) • Inspection – IEEE 610.12-1990 (Standard Glossary of Software Engineering Terminology): – A static analysis technique that relies on visual examination of development products to detect errors, violations of development standards, and other problems. Types include code inspection; design inspection. • Projektin sisäinen, 3-6 osallistujaa • Hyvin muodollinen verrattuna muihin ryhmätyötekniikoihin • Aikataulutus joustavaa, useita tarkastuksia projektin vaiheen aikana • Tarkastetaan kerralla pieniä kokonaisuuksia Ohjelmistotekniikka Ohjelmistojen testaus, 2015 459(504) Tausta ja tarkoitus • Tekniikan kehitti Fagan IBM:llä 1970-luvulla • Tarkastuksia pidetään tehokkaimpana tunnettuna laadunvarmistuskeinona • Tukee prosessia ja projektia mm. – Pyrkimällä poistamaan virheet mahdollisimman varhaisessa vaiheessa – Tekemällä projektin etenemisen näkyväksi • hyväksytty tarkastus vastaa yhden etapin saavuttamista – Jakamalla tietoa useammalle henkilölle Ohjelmistotekniikka Ohjelmistojen testaus, 2015 460(504) Tarkastuksen kulku • Tarkastustilaisuus kestää n. 2 tuntia, jonka aikana voidaan tarkastaa enintään – 50 sivua dokumenttia tai – 500 riviä koodia • • • • Löydetään noin 50-80 % virheistä Tarkastukset kuluttavat noin 5-15 % työajasta Erittäin kustannustehokasta! Vaikka menettely ei lisääkään työmäärää kovin paljon, johdon sitoutuminen tarvitaan Ohjelmistotekniikka Ohjelmistojen testaus, 2015 461(504) Tarkastukset ohjelmistoprosessissa Kerrasta oikein? Spesifikaatio (Vaihetuote n-1) Ohjelmistotekniikka Tee Luonnos OK Tarkasta Vaihetuote n Työstä Ohjelmistojen testaus, 2015 462(504) Mitä kaikkea voidaan tarkastaa? • Tarkastaa voidaan mm. – – – – – – – Tarjous, sopimus Määrittelydokumentti Projektisuunnitelma Suunnitteludokumentti Testaussuunnitelma Koodi Käyttäjälle menevä dokumentaatio – Koulutusmateriaali Ohjelmistotekniikka Ohjelmistojen testaus, 2015 463(504) Tarkastustilaisuuden roolijako • • • • • Puheenjohtaja Tarkastettavan vaihetuotteen tekijä Sihteeri = usein tekijä Tarkastaja = kaikki Esittelijä – Voi olla tekijä – Vain kooditarkastuksissa • Sovellusalueen tms. asiantuntija, kieliasun tarkastaja, käyttäjänäkökulman edustaja, testausasiantuntija jne. – Joku voi keskittyä muistinhallinnan tarkastamiseen, toinen silmukoihin, kolmas algoritmeihin, neljäs rajapintoihin jne. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 464(504) Nyrkkisääntöjä • Mikäli ei voida tarkastaa kaikkea, keskitytään tärkeimpiin osiin • Huolellinen valmistautuminen on erittäin tärkeää – Tarkastettava materiaali jakoon vähintään 3 vrk etukäteen – Tarkastustilaisuus kannattaa peruuttaa, jos sen onnistumiselle ei ole riittäviä edellytyksiä • Esim. liian keskeneräinen vaihetuote • Arvioidaan aina tuotetta, ei tekijää • Tavoitteena ongelmien löytäminen eikä niiden ratkaiseminen • Korjaukset kosmeettisiin virheisiin voi toimittaa sihteerille jälkikäteen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 465(504) Muuta • Kannattaa pohtia etukäteen sääntöjä, jotka helpottavat kohteen tarkastamista – Esim. “ottaako vaatimus huomioon asiakkaan todellisen tarpeen” • Säännöt kannattaa valita huolella kohteen, organisaation, prosessin, riskien yms. mukaan – Jo muutamalla säännöllä päästään hyviin tuloksiin (Marko Komssi, EuroSTAR 2004) – Sääntöjen tarkkuutta voidaan kasvattaa prosessin edetessä • Tarkastuksista on kehitetty IBM:llä myös sellainen versio, joka ei edellytä etukäteisvalmistelua: E. Farchi, S. Ur: “Selective Homeworkless Reviews”, Proceedings of the 2008 International Conference on Software Testing, Verification, and Validation IEEE Computer Society Washington, DC, USA Ohjelmistotekniikka Ohjelmistojen testaus, 2015 466(504) Tarkastusten kypsyystasot • • • • • Tarkastuksia pidetään Tarkastuksista on jotakin hyötyä Tarkastukset ovat tehokkaita Tarkastuksista kerätään tilastotietoja Virheanalyysejä ja tarkastuslistoja tehdään kokemusten perusteella • Kerättyjä tietoja käytetään tarkastus- ja ohjelmistoprosessin parantamiseen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 Hyödyllinen projektille Hyödyllinen organisaatiolle 467(504) 14.2 Katselmointi • Review, technical review • IEEE 610.12-1990: – A process or meeting during which a work product, or set of work products, is presented to project personnel, managers, users, customers, or other interested parties for comment or approval. Types include code review, design review, formal qualification review, requirements review, test readiness review. • Käytetään vaiheen päättymisen toteamiseen – Esim. määrittely- ja suunnitteluvaihe • Katsotaan formaalisti, että kaikki vaiheen lopetusehdon vaatimukset on täytetty • Tavoitteena tehdä projektin eteneminen näkyväksi – Halutaan saavuttaa konsensus, ei niinkään löytää virheitä Ohjelmistotekniikka Ohjelmistojen testaus, 2015 468(504) Projektin katselmukset ja tarkastukset • [Haikala&Märijärvi 06]: esitutkimus& sopimus määrittely suunnittelu tarkastus katselmointi, toimittajan ohjelmointi ja moduulitestaus integrointi katselmointi, asiakas mukana järjestelmätestaus aika Ohjelmistotekniikka Ohjelmistojen testaus, 2015 469(504) Mistä kulloinkin puhutaan? • Huom! Termejä katselmointi ja tarkastaminen käytetään vaihtelevilla tavoilla. Usein puhutaan esim. koodikatselmoinnista, vaikka sen luonne on tarkastaminen • Koska kyse on kuitenkin tavoitteiltaan erilaisista tekniikoista, on syytä selvittää etukäteen, onko tarkoitus todella katselmoida vai tarkastaa • Yleinen periaate: On selvitettävä, mitä organisaatiossa tarkoitetaan erilaisilla termeillä, ettei tule väärinkäsityksiä. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 470(504) 14.3 Läpikäynti • Walkthrough • IEEE 610.12-1990: – A static analysis technique in which a designer or programmer leads members of the development team and other interested parties through a segment of documentation or code, and the participants ask questions and make comments about possible errors, violation of development standards, and other problems. • Tehdään yleensä vain koodille, tavoitteena virheiden löytäminen • Tekijä selittää mitä ohjelma hänen mielestään tekee Ohjelmistotekniikka Ohjelmistojen testaus, 2015 471(504) Läpikäynti vs. tarkastus • Tarkastukseen verrattuna läpikäynti – – – – – Korostaa tekijän roolia tilaisuudessa On epämuodollisempi Vaatii vähemmän koulutusta Löytää vähemmän virheitä Ei yleensä ole yhtä kustannustehokas Ohjelmistotekniikka Ohjelmistojen testaus, 2015 472(504) OTE 14.4 Lähdekoodin staattinen analyysi • Idea: analysoidaan lähdekoodia automaattisesti ilman sen suorittamista • Tarkoituksena – Löytää koodista virheitä – Huomata poikkeamia sovituista koodauskäytännöistä (tyylioppaat) – Generoida koodista dokumentaatiota – Laskea arvoja ohjelman pituutta, monimutkaisuutta yms. kuvaaville mittareille • Hyödynnettävät tekniikat perustuvat yleensä tieto- ja kontrollivuoanalyysiin, rajoitusten ratkaisemiseen (constraint solving) yms. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 473(504) Lint • Ensimmäinen suuren yleisön käyttöön tarkoitettu staattinen koodianalysaattori oli Unixin mukana levinnyt Lint • Lintin tarkoituksena oli löytää tiettyjä C-kielelle tyypillisiä virheitä, joita senaikaiset kääntäjän eivät havainneet • Tunnettu kaupallinen tuote C++:lle ja C:lle PC-Lint / Flexelint http://www.gimpel.com/html/products.htm – Edelleen löytää paljon ongelmia, joita kääntäjä ei huomaa Ohjelmistotekniikka Ohjelmistojen testaus, 2015 474(504) Minkä tyyppisiä virheitä voidaan löytää? OTE • Esim. – Syntaksivirheet – Samaa koodia useammassa kuin yhdessä paikassa, kuollut koodi (ei suoriteta ikinä) – Koodin ylläpidettävyys ja siirrettävyysongelmia – Alustamattomat muuttujat – Käyttämättömät paluuarvot – Virheellinen osoitinten käyttö – Puskurin ylivuodot yms. tietoturvaongelmat Ohjelmistotekniikka Ohjelmistojen testaus, 2015 475(504) Eräitä työkaluja • PC-Lint, Coverity, PolySpace, KlocWork, FindBugs • Kaupalliset työkalut tyypillisesti kalliita, mutta myös joitakin ilmaisia avoimen lähdekoodin työkaluja löytyy • Skaalautuvuus voi osoittautua ongelmaksi • Väärien hälytysten määrä voi nousta suureksi • Potentiaalisesti maksavat itsensä takaisin hyvinkin nopeasti löytämällä arvokkaita virheitä turvallisuuskriittisestä koodista Ohjelmistotekniikka Ohjelmistojen testaus, 2015 476(504) Mitä apua dokumentointiin? • Esim: – Javadoc-tyyppinen API-dokumentaatio – Doxygen-tyyppinen graafinen malli (UML) ohjelmistosta • www.doxygen.org – Kutsuhierarkia bar1() foo() bar2() Ohjelmistotekniikka Ohjelmistojen testaus, 2015 477(504) 15. Testauksen parantaminen Seuraavaksi käsitellään testauksen parantamista. Kaiken toiminnan jatkuva parantaminen on tärkeää, koska muuten se rapautuu. Ja joskus herätään tarpeeseen kokonaisvaltaisesti arvioida ja parantaa toimintaa kertaluonteisella kehittämisprojektilla. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 478(504) Yleistä • Testaustoimintaa yrityksessä pitää aktiivisesti parantaa. – Jokainen yritys oppii vähitellen tekemään asioitaan paremmin. – Liiketoiminnan, tuotteiden laajuuden ja yrityksen koon kasvaessa pitää testausta pystyä tekemään paremmin ja tehokkaammin. – On aina vaarana jumittua tekemään asioita niin kuin ennenkin. – Siksi tarvitaan kehittämistä. • Kolmenlaista kehittämistä: 1. 2. 3. Jatkuva parantaminen – kun huomataan, että jokin asia ei toimi hyvin, parannetaan sitä. Esimerkiksi testien suorittaminen on pullonkaula projekteissa -> tehdään asialle jotain. Parantamisprojekti, jossa tarkastellaan koko testaustoimintaa ja mietitään sen kokonaisvaltaista kehittämistä. Kehittäminen vastaamaan pakollisia vaatimuksia, esim. alan standardeja. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 479(504) 15.1 Jatkuva parantaminen • Projektien kokouksissa, katselmoinneissa ja jokapäiväisessä työssä tunnistetaan parantamisen mahdollisuuksia. • Jutellaan niistä kollegoiden ja päälliköiden kanssa ja suunnitellaan, miten asia voidaan parantaa. • Siirretään parannukset sitten muihinkin projekteihin ja muihinkin tiimeihin. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 480(504) 15.2 Parantamisprojekti • Tehdään toiminnan arviointi, tunnistetaan vahvuudet ja heikkoudet, valitaan parannuskohteet ja käynnistetään parannuksia. • Joko: – Konsultti tekee arvioinnin ja parannustoimet jyvitetään omalle henkilöstölle. Kootaan työryhmä ja esim. laatupäällikkö seuraa niiden toteutusta. – Kootaan sisäinen työryhmä ja siinä arvioidaan tilannetta ja aloitetaan parannukset. • Toimintatapoina yleensä eri ammattiryhmien haastattelut ja yhteiset keskustelut. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 481(504) Parantamisen motiivi • Organisaatio ryhtyy parantamisprojektiin jostain syystä: – – – – – – – – Organisaatio kasvaa. Tuoteliiketoiminta laajenee. Huomataan, että tuotteiden laatu ei ole riittävää. Testaus on pullonkaula. Tuntuu, että testaus ei ole riittävän hyvää. Päämies vaatii parantamista. Laatujärjestelmän auditoinnissa nousee esille puutteita testauksessa. Jne… • Olennaista onkin, että on yhteinen vahva tunne, että toimintaa pitää parantaa ja johdon tuki muutoksille. Silloin saadaan muutoksia aikaan. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 482(504) Lähtökohtana tärkeimpien kipupisteiden paljastaminen • Ei ole olemassa ”parhaita käytäntöjä”, joten on hyvä selvittää, kyseisen yrityksen tilanne ja pohtia, millaiset parannukset todella auttavat eteenpäin. Ks. esimerkki tällaisesta menettelystä (sisältää myös paljon täydentävää tietoa): • http://www.mattivuori.net/julkaisuluettelo/liitteet/testaustoi minnan_arvioinnista.pdf • Joskus analyysin pohjana on kuitenkin jonkin kypsyysmallin tms. antama rakenne. – TPI tai TMMi ovat tunnettuja tällaisia. – TPI:n aihealueista on myöhemmin listaus esimerkkinä. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 483(504) Ammattilaiset tuntevat ongelmat • Kehittämisessä kannattaa yleensä luottaa organisaation ammattilaisiin: – He tietävät todelliset ongelmat. – Heillä on käsitys parantamisen mahdollisuuksista. – Heitä pitää kuunnella ja tukea, jotta parannuksia voidaan toteuttaa. • Miksi he eivät kehitä asioita, jos tietävät ratkaisuja? – Olo kiinni arjessa – osana kulttuuria, joka ”sitoo kädet”. – Puutteet kertyvät vähitellen (sammakko vesikattilassa…). – Tarvitaan joku, joka osaa kehittämistä katalysaattoriksi ja experttinä, jota johto kuuntelee. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 484(504) Parantamisprojektin vaiheet 1/2 • Selvitä testausprosessin (koko prosessi tai jokin osa-alue) tämän hetkinen taso • Aseta tavoitteet • Selvitä vaatimukset tavoitteiden saavuttamiseksi – Vaatimusten pitäisi olla realistisia, täsmällisiä ja mitattavia – Priorisoi vaatimukset • Aloita prosessinparannusprojekti samoin kuin mikä tahansa ohjelmistokehitysprojekti – Tavoitteena on riittävien resurssien varmistaminen • Laadi suunnitelma, jossa kuvataan askeleet tavoitteiden saavuttamiseksi – Suunnitelmaan kuuluu aikataulu, budjetti, riskit yms. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 485(504) Parantamisprojektin vaiheet 2/2 • Toteuta muutokset vähitellen – Resursseja ei tarvita kerralla niin paljon – Tulosten analysointi helpompaa – Käytä pilotointia • Mittaa tulokset – Vertaa mittaustuloksia suunnitelmaan • Mikäli tarpeen, aloita jälleen ensimmäisestä askeleesta • Mikäli prosessia aiotaan kehittää, on syytä huolehtia siitä, että tarvittaville toimenpiteille saadaan kaikkien osapuolten hyväksyntä – Hyväksyntä voidaan saavuttaa esim. mittareiden avulla, palautetta keräämällä ja hyödyntämällä, koulutuksella sekä organisaation sisäisillä ”sponsoreilla” Ohjelmistotekniikka Ohjelmistojen testaus, 2015 486(504) 15.3 Testaustoiminnan avainalueet – esimerkkinä TPI • TPI, Test Process Improvement on yksi testauksen kehittämismalli. • Emme käy sitä menetelmänä läpi, mutta esitämme tässä sen jäsennyksen testaustoiminnalle. – Se toimii runkona ja tarkistuslistana sille, mitä kaikkia osa-alueita kannattaa tarkastella. – Onko niille toimintatavat kunnossa ja sopivasti vakiintuneet, riittääkö ihmisten osaaminen, ovatko välineet hyvät? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 487(504) Avainalueiden luettelo 1/6 • Avainalueet (20 kpl) – Testausstrategia • Strategian täytyy keskittyä löytämään tärkeimmät virheet mahdollisimman aikaisin ja halvalla • Määrittelee mitkä testit kattavat vaatimukset ja laaturiskit • Kokonaisstrategian laatuun vaikuttaa eri testaustasojen strategioiden laatu ja yhteensopivuus – Testausprosessin elinkaarimalli • Suunnittelu, valmistelu, määrittely, suoritus ja viimeistely • Parantaa ennustettavuutta • Mahdollistaa testausprosessin säätämisen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 488(504) Avainalueiden luettelo 2/6 – Testauksen aikainen mukaantulo ohjelmistokehitykseen • Vaikka testit ajettaisiin vasta kehitysvaiheen lopulla, testausprosessin täytyy alkaa jo paljon aikaisemmin – Estimointi ja suunnittelu • Mitä pitää tehdä, koska ja millä resursseilla (ihmiset) • Perusta resurssien allokoinnille – Testien spesifiointitekniikat • Testitapausten laadun ja ”syvyyden” arviointi • Testitapausten uudelleenkäytettävyys – Staattisen testauksen tekniikat • Esim. tarkistuslistojen käyttö Ohjelmistotekniikka Ohjelmistojen testaus, 2015 489(504) Avainalueiden luettelo 3/6 – Mittarit • Testausprosessin kannalta tärkeät mittarit kuvaavat prosessin etenemistä ja testikohteen laatua • Kun prosessia parannetaan, mittareita käytetään arvioimaan toimenpiteiden vaikutusta – Testaustyökalut • Mm. parempi motivaatio testaajilla vs. manuaalinen testaus – Testiympäristö – Testaajien työympäristö • Motivaatio, kommunikaatio, työn tehokkuus – Sitoutuminen ja motivaatio • Sekä johto- että suoritusporras (resurssien allokointi yms.) Ohjelmistotekniikka Ohjelmistojen testaus, 2015 490(504) Avainalueiden luettelo 4/6 – Tietotaito ja koulutus • Testaustiimin koostuminen ihmisistä joiden tiedot ja taidot täydentävät toisiaan, esim. sovellusalueen ja organisaation tuntemus, ohjelmointi- ja sosiaaliset taidot • Kouluttaminen paikkaa puutteita – Menetelmien laajuus • Käytettyjen menetelmien pitäisi olla toisaalta riittävän laajoja kattamaan kaikki käyttötarpeet ja toisaalta tarpeeksi yksityiskohtaisia ettei samoja asioita joudu miettimään aina kun menetelmää sovelletaan – Kommunikaatio • Sekä testiryhmän sisällä, että sidosryhmiin sen ulkopuolella kuten kehittäjät, asiakkaat, käyttäjät • Mm. edistymisestä ja laadusta tiedottaminen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 491(504) Avainalueiden luettelo 5/6 – Raportointi • Testaus on laadun mittaamista ja tietoa laadusta täytyy välittää eteenpäin – Virheiden hallinnointi • Johdolle pitää tarjoa keinot virheen elinkaaren selvittämiseen • Laatutrendien selvittäminen ja analysointi, jonka avulla voidaan antaa perusteltuja neuvoja laadun parantamiseksi – Testwaren hallinnointi • Ylläpidettävyyden ja uudelleenkäytettävyyden varmistaminen vaativat hallinnointia • Testwaren versionhallinta – Testausprosessin johtaminen Ohjelmistotekniikka Ohjelmistojen testaus, 2015 492(504) Avainalueiden luettelo 6/6 – Arviointi (katselmoinnit yms.) • Arvioidaan kaikkia vaihetuotteita kuten vaatimuksia ja toiminnallista suunnittelua • Tarkoituksena löytää virheet ennen varsinaista testausta – Matalan tason testaus (yksikkö- ja integrointitestaus) • Tavoitteena virheiden löytäminen mahdollisimman aikaisin • Virheen tekee, löytää ja korjaa yleensä sama ihminen – tehokasta, koska kommunikointia ei tarvita paljon Ohjelmistotekniikka Ohjelmistojen testaus, 2015 493(504) 15.4 Parantaminen vastaamaan standardien vaatimuksia • Varsinkin turvallisuuskriittisten järjestelmien kehittämisessä on markkinoilla toimimisen edellytys se, että tuotekehitys ja siinä testaus noudattaa tiettyjä turvallisuusstandardeja. • Standardit vaihtelevat toimialoittain ja maittain. • Sovellettavan standardin valinnassa on joskus valinnanvaraa, eli kannattaa tarkkaan harkita, mihin sitoutuu. • Yksi hyvä esimerkki sellaisesta standardista on IEC 61508-3 • Functional safety of electrical/electronic/programmable electronic safety-related systems - Part 3: Software requirements Ohjelmistotekniikka Ohjelmistojen testaus, 2015 494(504) IEC 61508-3:n vaatimuksia testaukselle • Se asettaa vaatimuksia mm. seuraaville alueille: – – – – – – Vikaantumisten mallintaminen. Testaustekniikat. Testikattavuus. Mallipohjaisen testauksen käyttö kriittisimmissä järjestelmissä. Suorituskykytestaus. Staattinen analyysi, katselmoinnit. • Ks. ”Testing of safety-critical software – some principles” • https://noppa.oulu.fi/noppa/kurssi/811601s/luennot/811601S_l ecture_11__vuori.pdf Ohjelmistotekniikka Ohjelmistojen testaus, 2015 495(504) 15.5 Testaajien sertifiointi – ISTQB • Ks. www.istqb.org, Suomessa http://www.fistb.fi/ • Henkilökohtainen sertifikaatti, jolla "todistetaan" tietty osaaminen – Kolme tasoa: perustaso (foundation), advanced, expert • Korvaa aiemman ISEB-sertifikaatin • Perustason sertifikaatti hankitaan usein monivalintakokeella kolmen päivän kurssin jälkeen • Osaamissisällöt (syllabus) julkisia, pyrkivät kuvaamaan globaalin konsensuksen hyvästä testauksesta • ISTQB julkaissut myös laajan testaussanaston Ohjelmistotekniikka Ohjelmistojen testaus, 2015 496(504) Saanut kritiikkiä • Edistääkö parasta osaamista? • Ei ota erilaisia konteksteja huomioon • Sopiiko ketterään toimintaan? • Vaikka pitäisi olla voittoa tavoittelematon, onko se kuitenkin lähinnä rahantekokone koulutusyrityksille • Mitä monivalintakokeesta selviytyminen todistaa? Ohjelmistotekniikka Ohjelmistojen testaus, 2015 497(504) 16. Kurssin loppukaneetti 1/3 • Testauksen maailma on monimuotoinen ja laaja. • Tällaisella kurssilla ehditään tarkastella siitä vain tiettyä osaa. • Tämä kurssi on vain alkulaukaus ja mahdollistaa syvällisemmän perehtymisen testaukseen ja ainakin sen ymmärtämisen, miksi ja miten sitä tehdään ja millaisia asioita sen tekemiseen liittyy. • Monet löytävät testaamisen parista itselleen ammatin, jossa pääsevät toteuttamaan pyrkimyksiään motivoituneina • Ks. seuraavan sivun mindmappi. Ohjelmistotekniikka Ohjelmistojen testaus, 2015 498(504) Kurssin loppukaneetti 2/3 1. Tekniikan, laitteiden ja järjestelmien ymmärtäminen • Uteliaisuus, miten asiat toimivat ja mitä kaikkea ne sietävät • Laadun ymmärtäminen kokeellisesti, omin käsin ja aivoin • Kaikenlaisiin tuotteisiin tutustuminen • Intellektuaalinen harrastus, leikki • Suunnittelijan haastaminen – ja voittaminen 6. Menestymis- ja onnistumishalu • Olla hyvä jossain hyvä, paras, erottua muista • Rahan tekeminen • Liiketoiminnan parantaminen • Tuotteiden menestyminen • Liittyminen menestyvään tuotekehitykseen • Positiivisen jäljen jättäminen (vaikkei sitä huomaisikaan) Ohjelmistotekniikka 2. Maailman parantaminen • Parempia tuotteita ihmisille • Työturvallisuus ja tuoteturvallisuus (tietynlaisilla tuolleilla) • (Testavista asioista ja testauksen kohteista riippuvat erityisasiat) Testaus intohimona 5. Laadun estetiikka • Virheettömyyden estetiikka • Teknologian täydellistyminen • Tahto "maailman toimimiseen" • Oman maailman kontrollitahto Ohjelmistojen testaus, 2015 3. Edistystahto • Uuden teknologian turvallisuus (ydinvoima) • Missioiden onnistuminen (avaruuden valloitus; ilmaherruus) • Kompleksin teknologian hallinta • Teknologian edistäminen 4. Ammattimainen identiteetti • Vastuuntunto • Työn tekeminen, jolla on positiivisia vaikutuksia • Ohjelmistokehittäjien auttaminen • Asiakkaiden auttaminen • Loppukäyttäjien puolestapuhuja • Onnistuminen tiiminä, yhdessä • Perfektionismi (tekniikan) 499(504) Kurssin loppukaneetti 3/3 • Voisiko vain käyttää "parhaita käytäntöjä"? • Oikeasti ei ole olemassa "parhaita käytäntöjä", on olemassa vain yleisiä käytäntöjä. Ja jossain kohtaa alan paras tapa muuttuu aina vanhanaikaiseksi. • DI:n pitääkin pystyä arvioimaan, millaisia keinoja voisi käyttää jossain ympäristössä ja tilanteissa, jotta testaus täyttäisi tavoitteensa: tuottaisi oikeaan aikaan mahdollisimman hyvin sellaista tietoa, jota tarvitaan liiketoiminnassa, tuotteiden ja järjestelmien kehittämisessä, hankinnoissa jne... Ohjelmistotekniikka Ohjelmistojen testaus, 2015 500(504) Top 10 pointit 1. Testaus pitää ottaa vakavasti, mutta siitä pitää iloita 2. Testaus on normaali osa kypsän softakehityksen arkista toimintaa 3. Aloita testaus aikaisin ja tee sitä jatkuvasti 4. Testaukseen pitää olla aikaa – vasta testattu on "done" 5. Ymmärrä käyttöä ja tuotteen riskejä 6. Priorisoi testausta ja panosta tärkeimpien asioiden testaukseen 7. Kehittäjän ja käyttäjän ajattelumallit ovat aina erilaiset – hyväksymistestaus on asiakkaan asia ja haaste 8. Testauksessa ei ole hopealuoteja 9. Hyvä testaus on monimuotoista 10. Testaustavat pitää sovittaa kontekstiin, projektin kriittisyyteen ja tuotteen vaatimuksiin Ohjelmistotekniikka Ohjelmistojen testaus, 2015 501(504) Kirjallisuutta 1/3 • Testauksesta kertovien kirjojen määrä on erittäin suuri. Tässä listassa on muutamia, kalvosarjassa viitattuja yleiskäyttöisiä perusteoksia. Kaikenkattavia kirjoja ei ole, varsinkaan suomeksi. • [Broekman&Notenboom 02] B. Broekman, E. Notenboom: Testing Embedded Software (2002) – yksi näkökulma sulautettujen järjestelmien testaukseen, Multiple V -malli • [Craig&Jaskiel 02] R. Craig, S. Jaskiel: Systematic Software Testing (2002) – mukavasti kirjoitettu systemaatisen testauksen kirja • [Crispin&Cregory 09] Crispin, Lisa & Gregory, Janet. 2009. Agile Testing. A Practical Guide For Testers and Agile Teams. AddisonWesley. 554 p. – ketterän testauksen arvostettu teos • [Fewster&Graham 99] M. Fewster, D. Graham: Software Test Automation (1999) – testiautomaation perusteos Ohjelmistotekniikka Ohjelmistojen testaus, 2015 502(504) Kirjallisuutta 2/3 • [Haikala&Märijärvi 06] I. Haikala, J. Märijärvi: Ohjelmistotuotanto, 11. painos (2006) – vielä toistaiseksi ainoa suomenkielinen ohjelmistojen testausta käsittelevä kirja, jossa testaukselle on omistettu yksi luku • [Jorgensen 02] P.C. Jorgensen: Software Testing: A Craftsman’s Approach (second edition, 2002) – analyyttisen koulukunnan näkemys testaukseen • [Kaner et al. 02] C. Kaner, J. Bach, B. Pettichord: Lessons Learned in Software Testing: A Context-Driven Approach (2002) – kontekstiohjatun koulukunnan 293 pientä oppituntia kaikesta mikä liittyy testaukseen, korostaa tutkivaa testausta, ei kannata lukea ensimmäiseksi • [Myers et al. 04] G.J. Myers, T. Badgett , T.M. Thomas, C. Sandler: The Art of Software Testing (2004) – klassikon uudistettu painos Ohjelmistotekniikka Ohjelmistojen testaus, 2015 503(504) Kirjallisuutta 3/3 • [Pezzè&Young 07] M. Pezzè, M. Young: Software Testing and Analysis: Process, Principles, and Techniques – yhdistää testauksen kansanperinnettä ja formaalimpia lähestymistapoja • [Rothman 07] J. Rothman. 2007. Manage It! Your Guide to Modern, Pragmatic Project Management – hieno kirja ohjelmistoprojektien hallinnasta • [Utting&Legeard 07] M. Utting, B. Legeard: Practical Model-Based Testing – A Tools Approach (2007) – ensimmäinen mallipohjaisen testauksen käytännönläheinen oppikirja • [Whittaker&Thompson 03] J. Whittaker, H. Thompson: How to Break Software Security (2003) – ”avaimet käteen” -paketti tietoturvatestauksen aloittamiseksi Ohjelmistotekniikka Ohjelmistojen testaus, 2015 504(504)
© Copyright 2024