JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä 6.11.2002



Samankaltaiset tiedostot
Test-Driven Development

Test-Driven Development

Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä.

Testilähtöinen ohjelmistokehitys. Testilähtöinen ohjelmistokehitys. TDD Testilähtöinen ohjelmistokehitys. Testi! Testi

Ohjelmistotekniikan menetelmät, toteutuksesta ja testauksesta

1 Tehtävän kuvaus ja analysointi

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

Java-API, rajapinnat, poikkeukset, UML,...

Ohjelmistotekniikan menetelmät, toteutuksesta ja testauksesta

Ohjelmien testaustyökalut

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

4. Luokan testaus ja käyttö olion kautta 4.1

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

Ohjelmistojen mallintaminen. Luento 11, 7.12.

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

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

JUnit ja EasyMock (TilaustenKäsittely)

Automaattinen yksikkötestaus

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Ohjelmointi 2 / 2010 Välikoe / 26.3

Olio-ohjelmointi Javalla

Eclipse ja JUnit-ohjelmoijatestit

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

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

Tech Conference Visual Studio 2015, C#6,.NET4.6. Heikki Raatikainen. #TechConfFI

Ohjelmoinnin peruskurssien laaja oppimäärä

Liite 1. Projektin tulokset (Semaforit Javassa) Jukka Hyvärinen Aleksanteri Aaltonen

Ohjelmoinnin jatkokurssi, kurssikoe

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Javan perusteita. Janne Käki

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Testaussuunnitelma. PUSU-ryhmä. Helsinki Ohjelmistotuotantoprojekti. HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

815338A Ohjelmointikielten periaatteet

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

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Testivetoinen ohjelmistokehitys

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Olio-ohjelmointi Virhetilanteiden käsittely

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Ohjelmoinnin perusteet Y Python

JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Olio-ohjelmointi Syntaksikokoelma

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

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

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Automaattinen regressiotestaus ilman testitapauksia. Pekka Aho, VTT Matias Suarez, F-Secure

A TIETORAKENTEET JA ALGORITMIT

7. Oliot ja viitteet 7.1

Harjoitustyön testaus. Juha Taina

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Java ja grafiikka. Ville Sundberg

T SEPA päiväkirja

ITKP102 Ohjelmointi 1 (6 op)

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Rajapinta (interface)

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

Poikkeustenkäsittely

Java kahdessa tunnissa. Jyry Suvilehto

16. Javan omat luokat 16.1

15. Ohjelmoinnin tekniikkaa 15.1

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmoinnin peruskurssien laaja oppimäärä

Operaattorin ylikuormitus ja käyttäjän muunnokset

Ohjelmoinnin peruskurssien laaja oppimäärä

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

TIE Ohjelmistojen testaus Harjoitustyön esittely osa 1: Yleisinfo ja vaiheet 1 & 2. Antti Jääskeläinen Matti Vuori

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

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

Luento 6. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

Testilähtöinen ohjelmistokehitys. Testilähtöinen ohjelmistokehitys. TDD Testilähtöinen ohjelmistokehitys. Testi! Testi. Test-Driven Development, TDD

17. Javan omat luokat 17.1

Listarakenne (ArrayList-luokka)

Harjoitustyö (TKO_2023)

Ohjelmointityö 65 Tekstinmuotoilu ohjelma. Dokumentaatio. Aki Heikkinen (155394)

9. Periytyminen Javassa 9.1

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

TIE Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely

Ohjelmistojen testaus ja hallinta. Gradle

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Java-kielen perusteet

Attribuutit. Copyright IT Press Tämän e-kirjan kopiointi, tulostaminen ja jakeleminen eteenpäin luvatta on kielletty.

Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

17. Javan omat luokat 17.1

2. Olio-ohjelmoinista lyhyesti 2.1

10 Lock Lock-lause

Transkriptio:

JReleaser Yksikkötestaus ja JUnit Mikko Mäkelä 6.11.2002

Sisältö Johdanto yksikkötestaukseen JUnit yleisesti JUnit Framework API (TestCase, TestSuite) Testien suorittaminen eri työkaluilla Teknisiä käytäntöjä testikeissien toteuttamiseen

Yksikkötestaus yleisesti Ideana suunnitella ja suorittaa testikeissejä ohjelmakoodin pienimmille yksiköille: yksittäiset luokat, metodit, proseduurit, funktiot ja moduulit Alunperin suunniteltu osaksi XP:n metodologiaa XPssä testikeissit koodataan ennen toiminnallisuutta ongelman ratkaisukeskeinen ajattelu testikeissien kirjoittaminen ei jää pakkopullaksi

Yksikkötestaus, jatkoa - Tavoitteena 100% testikattavuus - Jos komponentista puuttuu testikeissejä, se tulee olettaa ei-toimivaksi - Yhden testikeissin scope tulee olla riittävän pieni - jos et tiedä mitä testaisit, yrität testata kerralla liikaa - Riittävän pienillä testikeissellä ja sopivalla työkalulla (JUnit) päästään automatisoituun testaukseen

Yksikkötestaus käytännössä Alkuvaiheessa testien kirjoittaminen tuo merkittävää (häiritsevää) lisätyötä Yksikkötestauksen edut tulevat esiin, kun koodia joudutaan muokkamaan (mistä tahansa syystä)

JUnit yleisesti Ohjelmistokehikko Java-softan yksikkötestaukseen Open-source (IBM Common Public License 0.5) Coren muodostaa API ja valmiit työkalut Suuri käyttäjämäärä tuonut de-facto standardiksi Kevyt (binäärit 120kB) ja helppo käyttää Uusin Release on 3.8.1

JUnit, jatkoa JUnit ei poista testauksen suunnitteluun ja toteutukseen kuluvaa aikaa JUnit ei ymmärrä testattavan kohteen vaatimuksia eikä alkuperäistä ongelmaa Tarjoaa yhtenäisen APIn testitulosten välittämiseen ja hyvät työkalut testien ajamiseen/toistamiseen JUnit raportoi tulokset mustavalkoisesti (OK/FAIL)

Motivointi: JUnit vs. print-tulosteet JUnitilla testien toistaminen on merkittävästi tehokkampaa JUnitilla testien suorittajan ei tarvitse ymmärtää testauksen kohdetta ja sen toimintapaa vaatimukset on viety testikeissien sisälle alkuperäistä ohjelmoijaa ei tarvita

junit.framework.testcase Abstrakti kantaluokka, josta kaikki testikeissit periytetään Yksi testiluokka voi sisältää useita eri testejä, mutta niillä tulee olla yhteiset resurssit (instanssimuuttajat) Itse testit toteutetaan testxxx() -metodeissa Testien resussit initialisoidaan peittämällä setup() metodi ja vapautetaan peittämällä teardown()

TestCase, jatkoa Testauksen tulokset raportoidaan assertxxx() ja failxxx() metodeilla verrataan metodilta saatua paluuarvoa ja vaatimusten mukaista, oletettua paluuarvoa tarkastellaan poikkeusten esiintymistä siirretään päättely JUnitille tai tehdään se itse (fail)

TestCase, esimerkki (looginen XOR) public class MyTester extends TestCase { public void testbothtrue() { assertfalse(mylogic.xor(true, true); } public void testonetrue() { asserttrue(mylogic.xor(true, false); } public void testbothfalse() { assertfalse(mylogic.xor(false, false); } }

junit.framework.testsuite Abstrakti kantaluokka testikokoelmien toteuttamiseen Kukin kokoelma voi sisältää viittauksia 1. useisiin eri TestCase-luokkiin, jolloin kunkin TestCaseluokan kaikki testit (metodit) suoritetaan 2. vain valikoituihin testimetodeihin Testit lisätään kokoelmaan addxxx() -metodeilla

TestSuite, jatkoa Testien organisointi kokoelmiin voidaan tehdä useilla eri kriteereillä Moduuli-pohjainen organisointi (CoreSuite, UtilSuite, ViewSuite, DatabaseSuite) Vaatimusten prioriteetteihin perustuva organisointi (MinimalSuite, OptionalSuite, AllFeaturesSuite) Käyttötapauksiin perustuva organisointi

Poikkeukset ja niiden testaus 1/2 Jos poikkeuksia on määritelty, ne tulee myös testata osana implementaatiota Jos metodi ilmoittaa heittävänsä poikkeuksen tietyillä kriteereillä, testien tulee vaatia tätä Jos metodi ei APIn mukaan heitä poikkeuksia, niin sellaisia myöskään ei saa ilmetä

Poikkeukset ja niiden testaus 2/2 public void testindexoutofboundsexception() { Vector v= new Vector(10); try { Object o= v.elementat(v.size()); fail("should raise an } ArrayIndexOutOfBoundsException"); } catch (ArrayIndexOutOfBoundsException e) { }

Mitä testataan ja mitä ei? Periaatteessa kaikkeen tulisi kirjoittaa testikeissit Käytännön miniminä tulisi kattaa ainakin ulkopuolisille tarjottavien rajapintojen toteuttavat luokat ulkopuolinen käyttää rajapintaasi kuitenkin väärin core-luokat, kontrollerit, logiikkakomponentit laajassa käytössä olevat työkaluluokat util-luokassa oleva bugi voi näkyä useassa eri järjestelmässä

JUnit, tyypillisiä virheitä Perustapausta testaavien testikeissien kirjoittaminen on triviaalia, mutta tärkeää! Älä unohda tarkastella tapauksia, joissa argumentti on nolla tai null taulukko tai vektori on liian pieni/suuri kokoelma-luokka (java.util.iterator) sisältää väärän tyyppisiä objekteja (ClassCastException) Nimetty tiedosto tai resurssi puuttuu, ei toimi yms.

Testien suorittaminen, yleistä Testikeissejä ja niiden kokoelmia voidaan helposti ajaa eri työkaluilla junit.textui.testrunner (komentoriviltä) junit.awtui.testrunner (graafinen, AWT-pohjainen) junit.swingui.testrunner (graafinen, Swing-pohjainen) Ant:in kautta (käyttäen Taskia <junit>) IDE-kehittimen tarjoaman integraation kautta

Testien suorittaminen, Swing-GUI GUI käynnistetään komennolla ant test.gui Työkalu etsii automaattisesti kaikki luokkapolussa olevat testikeissit ja listaa ne Reload classes optiolla vältetään työkalun uudelleenkäynnistämisen tarve koodin muokkaamisen jälkeen

Testien suorittaminen Antin kautta Testit ajetaan komennolla ant test Ant paikallistaa kaikki luokkapolussa olevat testikeissit

Testiluokkien organisointi Testiluokat organisoinnissa huomioitavaa: testiluokkien selvä erottelu varsinaiseen koodiin nähden siten että nämä voidaan tarvittaessa erottaa yksinkertaisella regexp:llä testiluokan nimestä ja paketista tulisi ilmetä se luokka(t), johon testaaminen kohdistuu Esim. com.company.product.beans.mybean com.company.product.test.beans.mybeantester

Yksikkötestauksen nyrkkisääntö Jos edes harkitset lisääväsi koodiin print/debug tulostuksia määritteleväsi debugger-lausekkeita kirjoittavasi testiluokkia tai skriptejä KIRJOITA SEN SIJAAN TESTICASE!