: Yksikkötestaus - JUnit

Testaus

Testit ovat koodia, jotka testaavat ohjelman toimintoja.  Esimerkiksi yksinkertainen testi summametodille tehtäisiin seuraavasti:

if ( summa(2,3) != 5 ) {
    System.out.println("Summametodi ei toimi oikein!");
}

Jos kaikille metodeille löytyy yksinkertainenkin testi, niin metodin toteutusta voidaan muuttaa ja kokeilla testien avulla toimivatko ne vielä oikein.  Tämä nopeuttaa kehitystyötä huomattavasti ja parantaa ohjelman laatua.

Testaus JUnitilla

Käytännössä edellä näytetty testi pitäisi pitää ohjelman main-metodissa tai muualla ja kommentoida ulos aina, kun testejä ei haluta ajaa.  Testit on järkevämpää kirjoittaatestauskirjastolla.  Eräs yleisesti käytetty testauskirjasto Javalle on JUnit.  Testit kirjoitetaan metodeiksi omaan testiluokkaan, jossa on käytössä apukirjastoja.  Netbeans osaa ajaa nämä testit suoraan näistä luokista.  Seuraavilla ohjeilla pääset alkuun testien kirjoittamisesssa.

Netbeans ja JUnit

Avaa Ilmoittautumisjärjestelmä-projekti

  1. Klikkaa hiiren oikealla napilla projektia ja valitse New -> Other.. -> JUnit (Categories) -> JUnit Test
  2. Anna testiluokalle nimi "IlmoittautumisTest" (huomaa, että luokan nimen lopussa on oltava Test)
    1. Jos projektisi on packagessa (ei siis default package), niin luo saman niminen pakkaus Test packages -kohtaan ja valitse se myös testiluokalle.
  3. Valitse versio JUnit 4.x
  4. Test Packages -kansioon ilmestyy nyt IlmoittautumisTest.java
  5. Testit ajetaan valitsemalla Run-valikosta Test "Projektinnimi" - Aja testit
  6. Koska testejä ei ole, saat virheilmoituksen FAILED ja klikkaamalla tämän ilmoituksen auki näet syyn:
    "No runnable methods", eli testejä ei vielä ole.

 

Ensimmäinen testi

Testiluokassa on muutamia rivejä valmiina, nämä esitellään myöhemmin tarkemmin.  Tiedoston lopussa on testi nimeltä hello. Tee testistä seuraavanlainen:

@Test
public void hello() {
   assertTrue(4+2 == 5);   
}

Aja testi (ohje yllä).  Testi ei mene läpi, virhe on "AssertationFailedError".  Assert tarkoittaa suunnilleen "vakuuttaa" tai "vaatia".  Koodissa metodi assertTrue vaatii, että parametreissä olevan totuusarvon on oltava totta.  Testeissä voi olla mitä tahansa koodia, mutta asserteilla vaadimme, että tietyt ehdot ovat voimassa.

Tehtävä 1: Korjaa testi siten, että se menee läpi.

Testiluokan template-rakenne on seuraava.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ilmo; pakkaus, jonka sisällä olemme

import org.junit.After; JUnitin kirjastoja..
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

/**
 *
 * @author paksula
 */
public class IlmoittautumisTest {

    public IlmoittautumisTest() {
    }

    @BeforeClass Ajetaan ennen kaikkia testejä.  Tänne voi laittaa alustukset, jotka ovat kaikille testeille yhteiset
    public static void setUpClass() throws Exception {
    }

    @AfterClass Ajetaan kaikkien testien jälkeen
    public static void tearDownClass() throws Exception {
    }

    @Before Ajetaan ennen jokaista testiä
    public void setUp() {
    }

    @After Ajetaan jokaisen testin jälkeen
    public void tearDown() {
    }

    // TODO add test methods here. 
    // The methods must be annotated with annotation @Test. For example:
    //
    // @Test Ensimmäinen varsinainen testi
    // public void hello() {}

}

Voit lisätä testejä tähän testiluokkaan niin monta kuin vain haluat.

Tehtävä 2: Tee testi, joka testaa ovatko kahden String-olion sisällöt samoja.  Eli luo kaksi oliota ja tee niiden vertailu käyttäen assertTrue(boolean) -metodia

Tehtävä 3: Tee tehtävän 2 testi, mutta vertaa oliota käyttäen assertEquals(Object obj1, Object obj2)

Nyt testiluokassasi pitäisi olla kolme testiä, joista kaikki menevät läpi.

Oman koodin testaus

Edellä otimme JUnitin haltuun.  Seuraavaksi testaamme omaa aikaisemmin kirjoitettua koodia. Testaamme laskareiden 5 ilmottautumisjärjestelmää (linkit http://www.cs.helsinki.fi/group/java/k10/ohja/tehtavat5.html ja http://www.cs.helsinki.fi/group/java/k10/ohja/esimerkkivastaukset/viikko5/ilmo/ ) 


Käyttäjän lisäämisen testaus

Ilmoittautuminen vaatii, että meillä on käyttäjä ja kurssi.  Tässä tapauksessa kannattanee aloittaa testien kirjoittaminen Kayttajatietokanta-luokan testaamisesta.  Ensimmäinen askel on tietysti lisätä käyttäjä tietokantaan.  Tehdään testi lisaaKayttaja, joka testaa, että käyttäjän lisäys onnistuu.

@Test
public void lisaaKayttaja() {
    Kayttajatietokanta kt = new Kayttajatietokanta();
    kt.lisaaKayttaja("Testi-teppo", "donerkebap");
}

Testissä ei ole yhtään asserttia - koska vanha lisaaKayttaja-metodi on void.   Mistä tiedämme, onko käyttäjä lisätty?  Yksi tapa olisi testata tämän jälkeen boolean metodia kirjaudu.  Tällöin testimme nimi lisaaKayttaja ei olisi enää hyvä.  Lisätään Kayttajatietokanta-oliolle metodi getKayttajienLkm(), joka palauttaa nykyisten käyttäjien lukumäärän.  Tämän jälkeen testissä voidaan verrata lukumäärää ja tiedämme, että käyttäjän lisäys on onnistunut.

@Test
public void lisaaKayttaja() {
    Kayttajatietokanta kt = new Kayttajatietokanta();
    kt.lisaaKayttaja("Testi-teppo", "donerkebap");
        
    assertTrue(kt.getKayttajienLkm() == 1);
}

Tehtävä 4: Tee testi ja toteuta tarvittava metodi.

Kirjautumisen testaus

Seuraavaksi testaamme toimiiko metodi kirjaudu oikein.  Testissä luomme aluksi käyttäjän "Testi-Teppo" ja kirjaudumme sisään.  Kun aloitamme tekemään testiä, huomaamme, että Kayttajatietokannan olion kt luonti on täysin sama, kuin edellisessä testissä.  Siirretään olion luonti JUnitin metodiin setUp(), joka ajetaan ennen jokaista testiä automaattisesti.  Voimme vaihtoehtoisesti luoda olion myös setUpClass-metodissa, jolloin tietokanta luodaan vain kerran.  Tällöin kuitenkin tietokannan tila on testien välillä jaettu.  On usein helpompaa, että jokainen testi toimii omana itsenäisenä yksikkönään.

@Before
public void setUp() {
    this.kt = new Kayttajatietokanta();
}

Testiluokalla ei ole attribuuttia kt, vielä.

Tehtävä 5: Tee testi, joka testaa kirjautumisen ja lisää attribuutti kt ja alusta uusi tietokanta setUp()-metodissa.  Koska kirjaudu-metodi palauttaa totuusarvon, voit tehdä varsinaisen assertin näin: assertTrue(kt.kirjaudu("Testi-teppo", "donerkebap"));  Muista myös lisätä käyttäjä tietokantaan joko setUp-metodissa tai vasta testissä.