Yksikkötestaus Kattava testaus Moduulitestaus Ohjelman testaus 1
Kattava testaus Testauksen perimmäinen tarkoitus on LÖYTÄÄ VIRHEITÄ Testaus pitäisi olla täydellinen: - Jokainen pyydetty arvo pitäisi testata täydellisesti eli olisi kokeiltava jokainen ko. tietotyypin arvo Mahdotonta täydellistä testaus ei ole - Mutta lähelle päästään, kun kokeillaan == rajarvot < raja-arvo > raja-arvo - esim. int arvo = input.nextint(); if (arvo >= 0 && arvo <=10) -- tämä lause pitäisi testata esim. arvoilla -1, 0, 1, 10, 11 2
Kattava testaus jatkuu Esim. String nimi = input.next(); // nimi, joka sisältää täsmälleen 5 merkkiä ja alkaa // R-kirjaimelle hyväksytään if ( nimi.length() == 5 && nimi.charat(0)== R ) testiaineisto: - nimen pituus < 5 tai > 5 - nimen pituus == 5, mutta nimen ensimmäinen merkki ei ole R - nimen pituus == 5 ja nimi alkaa R-kirjaimella 3
Kattava testaus jatkuu esim int vuosi = input.nextint(); // hyväksytään vain vuosi, joka on karkausvuosi, eli // vuosi on tasan jaollinen 400:lla tai vuosi on tasan jaollinen // 4:llä vaan ei 100:lla if (vuosi % 400 == 0 (vuosi % 4 == 0 && vuosi % 100!= 0) ) Testiaineisto: vuosi % 400 == 0 vuosi % 400!= 0, vuosi % 4!= 0, vuosi % 100 == 0 vuosi % 400!= 0, vuosi % 4 == 0, vuosi % 100 == 0 vuosi % 400!= 0, vuosi % 4!= 0, vuosi % 100!= 0 vuosi % 400!= 0, vuosi % 4 == 0, vuosi % 100!= 0 4
Kattava testaus jatkuu Miksi? Ennen kuin ohjelma viedään tuotantoon, pitää olla varma: Mahdolliset ohjelmointivirheet on löydetty testauksen kautta ja virheet korjattu Mahdolliset loogiset virheet on löydetty testauksen kautta ja virheet korjattu Onko ohjelmoitu sitä, mitä on tilattu? pitää testata ja korjata 5
Kattava testaus jatkuu.. Jotta testaus olisi kattava se jaetaan kahteen osaan Moduuli testaus Ohjelma testaus 6
Moduulitestaus Moduulitestaus Tarkoittaa, että jokaisen luokan jokainen metodi on testattava Tämä tehdään yleensä erillisillä ns. testipenkeillä Ohjelmoija, joka on koodannut luokan, vastaa sen toimivuudesta eli testaa sen jokaisen metodin, ennen kuin sitä voidaan käyttää ohjelmassa Testipenkki voi olla vaikkapa erillinen ohjelma tai main-metodi ko. luokassa Jos testipenkki on main-metodissa, se kannattaa testin jälkeen kommentoida, jotta se voidaan uuusia 7
Moduulitestaus jatkuu public class Tuote { private int numero; private String nimi; private double hinta; public Tuote() { this.numero =0; this.nimi = null; this.hinta = 0; public Tuote( int koodi, String tuotenimi, double hinta) { setnumero( koodi); setnimi ( tuotenimi); sethinta ( hinta); public int getnumero() { return numero; public void setnumero( int koodi) { this.numero =0; if (koodi > 0) this.numero = koodi; public String getnimi() { return nimi; 8
Moduulitestaus jatkuu //nimessä vähintään 3 kirjainta, muutetaan alkukirjain suureksi ja loput // pieniksi public void setnimi( String nimi) { this.nimi = null; if (nimi!= null && nimi.trim().length()>2){ nimi = nimi.trim(); this.nimi = nimi.substring(0,1).touppercase()+ public double gethinta() { return hinta; nimi.substring(1).tolowercase(); public void sethinta( double hinta) { this.hinta = 0; if (hinta > 0) this.hinta = hinta; // tostring -metodi public String tostring() { String paluu; paluu = numero + ", " + nimi + ", " + hinta + " eur"; return paluu; 9
Moduulitestaus jatkuu public static void main(string [] args) { Tuote tuote = new Tuote(); System.out.println(tuote.toString()); // odotusarvo: 0, null, 0.0 eur tuote.setnumero(-1); // odotusarvo: 0 System.out.println("tuote.setNumero(-1): " + tuote.getnumero()); tuote.setnumero(0); // odotusarvo: 0 System.out.println("tuote.setNumero(0): " + tuote.getnumero()); tuote.setnumero(1); // odotusarvo: 1 System.out.println("tuote.setNumero(1): " + tuote.getnumero()); tuote.setnimi(null); // odotusarvo: null System.out.println("tuote.setNimi(null);" + tuote.getnimi()); 10
Moduulitestaus jatkuu tuote.setnimi(" ka "); // odotusarvo: null System.out.println("tuote.setNimi(' ka ');" + tuote.getnimi()); tuote.setnimi(" sei "); // odotusarvo Sei System.out.println("tuote.setNimi(' sei ');" + tuote.getnimi()); tuote.sethinta(-0.5); // oodotusarvo 0.0 System.out.println("tuote.setHinta(-0.5); " + tuote.gethinta()); tuote.sethinta(0); // oodotusarvo 0.0 System.out.println("tuote.setHinta(0); " + tuote.gethinta()); tuote.sethinta(0.6); // oodotusarvo 0.6 System.out.println("tuote.setHinta(0.6); " + tuote.gethinta()); tuote = new Tuote (100, " kolme pientä porsasta ", 23.45); // odotusarvo: 100, Kolme pientä porsasta, 23.45 eur System.out.println(tuote); 11
Ohjelmatestaus Ohjelmatestaus on Laaja on usittava tarvittaessa testitietokanta, eli tietokannan sisältö on tietty Kannan sisältö pitää voida palauttaa testikannan sisällöksi Testikantaa perustuen tehdään testitapaukset: Joiden pitää sisältää kaikki ohjelman virheelliset ja virheettömät tilanteet eli jokaisen virheilmoituksen pitää näkyä jossain testitapauksessa Testitapaukset tehdään ilman ohjelmakoodia, käyttätään testitietokannan sisältöä ja ohjelman määrityksiä 12
Ohjelmatestaus jatkuu Testitapauslomakeen rakenne: Käyttötapaus: kerrotaan mitä testataan Testaaja: kerrotaan kuka testaa Pvm: milloin testi on suoritettu Jokasesta testitapauksesta kerrotaan: Testitapauksen kuvaus: Kuvataan tarkasti mitä käyttäjä tekee esim. kirjoittaa ohjelman kyselyyn tai ohjelman lomakkeeseen Odotettu tulos: kerrotaan tarkasti mitä ohjelma tekee seuraavaksi esim. tulostaa tietyn arvon tms. Poikkeamat: testaajaan havaitsema poikkeus odotetun tuloksen ja todellisen tuloksen välillä 13
Ohjelmatestaus jatkuu Esim. Tietyn opintojakson haku tietokannasta: Testitietokannan sisältö: tunnus nimi opintopisteet ICT1TN002 Työasemat ja tietoverkot 9 ICT1TN005 Tiedonhallinta ja tietokannat 6 ICT2TN007 Ohjelmistokehitys 12 ICT2TN009 Tietohallinto 3 ICT1TN006 Ohjelmointi 9 14
Ohjelmatestaus jatkuu Käyttötapaus: tietyn opintojakson haku tietokannasta Testaaja: Pvm: 1. Testitapaus: Käyttäjä käynnistää ohjelman Odotettu tulos: konsolliin tulee rivit: 1) hae kaikki opintojaksot 2) hae tietty opintojakso 0) lopeta valitse: 2. Testitapaus: Käyttäjä kirjoittaa numeron 2 ja painaa enter Odotettu tulos: konsoliin tulostuu:anna opintojakson tunnus: Käyttäjä kirjoittaa tunnuksen ICT1TN006 Odotettu tulos: ICT1TN006, Ohjelmointi, 9 op 1) hae kaikki opintojaksot 2) hae tietty opintojakso 0) lopeta Huom! Testitapauksen etenevät kronologisesti eli kun edellinen testitapaus jää tiettyyn tilaan, seuraava testitapaus jatkaa tästä tilasta jne valitse: 15
Ohjelmatestaus jatkuu 3. Testitapaus: Käyttäjä kirjoittaa luvun -1 Odotettu tulos: tulostuu ilmoitus: Anna luku väliltä 0-2 1) hae kaikki opintojaksot 2) hae tietty opintojakso 0) lopeta valitse: 4. Testitapaus: Käyttäjä kirjoittaa luvun 3 Odotettu tulos: tulostuu ilmoitus: Anna luku väliltä 0-2 1) hae kaikki opintojaksot 2) hae tietty opintojakso 0) lopeta valitse: 5. Testitapaus: Käyttäjä kirjoittaa teksin kolme Odotettu tulos: tulostuu ilmoitus: Anna luku väliltä 0-2 1) hae kaikki opintojaksot 2) hae tietty opintojakso 0) lopeta valitse: 16
Ohjelmatestaus jatkuu 6. Testitapaus: Käyttäjä kirjoittaa numeron 2 ja painaa enter Odotettu tulos: konsoliin tulostuu:anna opintojakson tunnus: Käyttäjä kirjoittaa tunnuksen ICT3TN006 Odotettu tulos: tulostuu ilmoitus: ICT3TN006 opintojakso ei löytynyt 1) hae kaikki opintojaksot 2) hae tietty opintojakso 0) lopeta valitse: 17
Ohjelmatestaus jatkuu 7. Testitapaus: Normaali Puttyn avulla tehty tunnelointi tietokantaan ei ole päällä Käyttäjä kirjoittaa numeron 2 ja painaa enter Odotettu tulos: konsoliin tulostuu:anna opintojakson tunnus: Käyttäjä kirjoittaa tunnuksen ICT1TN006 Odotettu tulos: Tietokantaan ei saada yhteyttä, korjaamme vian tuotapikaa 1) hae kaikki opintojaksot 2) hae tietty opintojakso 0) lopeta valitse: 18
Ohjelmatestaus jatkuu Kun testaaja testaa testitapaukset ja kirjaa onko todellinen tulos vastannut odotettua tulosta, testaaja kirjoittaa myös mitä ohjelma tekee poikkeustilanteessa Testaaja saattaa saada parannusideoita ohjelman käyttöliittymään tai ohjelman toimintaa. Nämä kannatta huomioida ja mahdollisesti muutta ohjelmaa Esim. edellinen ohjelma. 7.Testitapaus, kun tietokantaan ei saada yhteyttä. Herää kysymys: Kannattaako ohjelmaa pitää edelleen käynnissä vai kannttaisiko lopettaa ohjelman toiminta tähän? 19