JUnit ja EasyMock (TilaustenKäsittely)



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

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

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

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

1 Tehtävän kuvaus ja analysointi

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Rajapinta (interface)

Metodien tekeminen Javalla

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Olio-ohjelmointi Javalla

Eclipse 3.2 pikku opas versio 1.0. Esittely Uuden projektin perustaminen Sovelluksen luominen Koodin siistiminen Vinkkejä

Mikä yhteyssuhde on?

Listarakenne (ArrayList-luokka)

Jypelin käyttöohjeet» Ruutukentän luominen

Testivetoinen ohjelmistokehitys

public static void main (String [] args)

Luokan sisällä on lista

ITKP102 Ohjelmointi 1 (6 op)

YHTEYSSUHDE (assosiation)

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Ohjelmointi 2 / 2010 Välikoe / 26.3

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

Interaktiivinen tarinankerronta

Web Services tietokantaohjelmoinnin perusteet

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Javan perusteita. Janne Käki

1. Omat operaatiot 1.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Test-Driven Development

Pakkauksen kokoaminen

GEOS 1. Ilmastodiagrammi Libre Office Calc ohjelmalla

Ohjelmistojen mallintaminen, syksy 2011, laskuharjoitus 2

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

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

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

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

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen:

Eclipse ja JUnit-ohjelmoijatestit

Osio 4: Tietovirrat. Properties- eli ominaisuustiedostot Logger: lokitietojen käsittely

Pakkauksen kokoaminen

Tietokannat II -kurssin harjoitustyö

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

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

Ohjelmoinnin jatkokurssi, kurssikoe

Verkkosivut perinteisesti. Tanja Välisalo

ITKP102 Ohjelmointi 1 (6 op)

Microsoft Visual Studio 2005

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

Operaattorin ylikuormitus ja käyttäjän muunnokset

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Java ja grafiikka. Ville Sundberg

Ohjelmoinnin perusteet, kurssikoe

Ohjelmointi 2 / 2011 Välikoe / 25.3

Test-Driven Development

Luokat ja oliot. Ville Sundberg

Pipfrog AS Tilausten hallinta

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

Java kahdessa tunnissa. Jyry Suvilehto

Yksikkötestaus. Kattava testaus. Moduulitestaus. Ohjelman testaus. yksikkotestaus/ Seija Lahtinen

Delegaatit ja tapahtumakäsittelijät

Periytyminen (inheritance)

Käyttö ohjeet kirpputorille

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

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

ITKP102 Ohjelmointi 1 (6 op)

Johdatus ohjelmointiin

ITKP102 Ohjelmointi 1 (6 op)

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

9. Periytyminen Javassa 9.1

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

9. Periytyminen Javassa 9.1

Avaa sovellus (PERUSAURORA)

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Käyttö ohjeet kirpputorille

Tietorakenteet (syksy 2013)

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

17. Javan omat luokat 17.1

Muistitikun liittäminen tietokoneeseen

Interaktiivinen tarinankerronta

1. Taustatietoa näppäimistönkuuntelusta

C# Windows ohjelmointi perusopas

Ohjelmointi 2, välikoe

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Käyttö ohjeet kirpputorille

Ohjelmistotekniikan menetelmät, koe

Metodien tekeminen Javalla

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

Moottorin kierrosnopeus Tämän harjoituksen jälkeen:

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

7. Oliot ja viitteet 7.1

Transkriptio:

OHJELMISTOJEN TESTAUS JA HALLINTA Syksy 2015 / Auvo Häkkinen JUnit ja EasyMock (TilaustenKäsittely) Tehtävässä tarvittava koodi löytyy osoitteella http://users.metropolia.fi/~hakka/oth/mockesimerkki.zip Kopioi koodi ja luo tehtävää varten projekti. Vie projekti versionhallintaan omaan repositorioosi. Tutustu aluksi annettuun koodiin. Tehtävässä käsitellään tuotetilauksia. Kuhunkin tilaukseen liittyy asiakas ja tuote. Tilaus yhdistää tuotteen ja asiakkaan. Tilausten käsittely laskee tuotteelle alennushinnan, ja vähentää sen asiakkaan saldosta. Hinnoittelija-luokan tilalla on vain tynkä (engl. stub). Näin koodi saadaan kääntymään. Ongelma: Miten testata TilaustenKäsittely-luokka, kun sen tarvitsema Hinnoittelija-luokka on vielä toteuttamatta? Jos yksikkötestattavana oleva luokka käyttää toisen luokan metodeja, eikä tuota luokkaa ole vielä toteutettu, voi luokan tilalla käyttää sijaista (engl. test double / fake). Sijaisen ulospäin näkyvä käyttäytyminen on sama kuin todellisella luokalla, mutta se voi tehdä tehtävänsä oikoen ja / tai paluuarvo voi olla kovakoodattu. Kun oikea luokka on aikanaan saatavilla, sillä korvataan testien aikana käytetty sijainen, ja testit ajetaan uudestaan. 1 Tynkä ja kovakoodatut paluuarvot Ensimmäinen testaustapa olisi laatia JUnit-testit siten, että kovakoodataan Hinnoittelijan tynkään kaikki testeissä tarvittava, mm. kiinteä alennusprosentti. 2 Jäljittelevän luokan käyttäminen Monipuolisempaa testausta varten voi Hinnoittelija-luokasta laatia jäljittelijän (engl. fake = jäljennös, huiputtaja). Varsinaisen sovelluksen sekaan ei tietenkään saa sotkea mitään testaamiseen liittyvää, joten luo Hinnoittelijaa jäljitteleväfakehinnoittelija -luokka Test Packages- osioon.

public class FakeHinnoittelija extends Hinnoittelija { private float alennus; public FakeHinnoittelija(float alennus) { this.alennus = alennus; public float getalennusprosentti(asiakas asiakas, Tuote tuote) { return alennus; Nyt alennusprosentti ei enää ole kovakoodattu, vaan sitä voidaan vaihdella tarpeen mukaan dynaamisesti testimetodeissa. Luo seuraavaksi JUnit-testiluokka, joka testaa tilausten käsittelyä käyttäen yllä olevaa Hinnoittelija-olion jäljittelijää. public class TilaustenKäsittelyFakeTest { @Test public void testaakäsittelijäwithfakehinnoittelija() { // arrange float alkusaldo = 100.0f; float listahinta = 30.0f; float alennus = 20.0f; float loppusaldo = alkusaldo - (listahinta * (1 - alennus / 100)); Asiakas asiakas = new Asiakas(alkuSaldo); Tuote tuote = new Tuote("TDD in Action", listahinta); Hinnoittelija hinnoittelija = new FakeHinnoittelija(alennus); // act TilaustenKäsittely käsittelijä = new TilaustenKäsittely(); käsittelijä.sethinnoittelija(hinnoittelija); käsittelijä.käsittele(new Tilaus(asiakas, tuote)); Aja testit. Vihreää. 3 Mock-olion käyttäminen Testaa seuraavaksi tilaustenkäsittelyn toimintaa käyttäen Mock-olioita. Tätä tapaa käytettäessä ei tarvitse luoda erikseen jäljittelijää luokasta Hinnoittelija, vaan Mock-ympäristö matkii Hinnoittelija-luokan ulospäin näkyvää käyttäytymistä. Mock-toteutuksia on tarjolla useita, esim. EasyMock, JMock, Mockito, jne.. Tässä harjoituksessa käytetään EasyMock-kehikkoa (engl. framework). Luo uusi JUnit-testiluokka ja kopioi siihen tämä koodi

public class TilaustenKäsittelyEasymockTest { @Test public void testaakäsittelijäwitheasymockhinnoittelija() { // arrange float alkusaldo = 100.0f; float listahinta = 30.0f; float alennus = 20.0f; float loppusaldo = alkusaldo - (listahinta * (1 - alennus / 100)); Asiakas asiakas = new Asiakas(alkuSaldo); Tuote tuote = new Tuote("TDD in Action", listahinta); Hinnoittelija hinnoittelija = createmock(hinnoittelija.class); // record expect(hinnoittelija.getalennusprosentti(asiakas, tuote)).andreturn(alennus); replay(hinnoittelija); // act TilaustenKäsittely käsittelijä = new TilaustenKäsittely(); käsittelijä.sethinnoittelija(hinnoittelija); käsittelijä.käsittele(new Tilaus(asiakas, tuote)); verify(hinnoittelija); Koodi ei käänny. Mukaan tarvitaan EasyMock-kehyksen käyttämät kirjastot. Tee ensin sovelluksesi hakemistoon lisäkirjastoja varten alihakemisto lib. Näin ne säilyvät sovelluksen muun koodin mukana. Etsi viereisessä kuvassa näkyvät jar-pakkaukset wwwhaulla ja talleta ne luomaasi hakemistoon. Liitä kirjastot sitten sovellukseen klikkaamalla projektin nimeä hiiren oikealla painikkeella, ja valitse Properties. Klikkaa avautuvassa ikkunassa Libraries ja sen jälkeen Add JAR/Folder. Jos Fix Imports ei osaa ottaa tarvittavia kirjastoja käyttöön, lisää käsin seuraavat rivit import static org.easymock.easymock.expect; import static org.easymock.easymock.createmock; import static org.easymock.easymock.replay; import static org.easymock.easymock.verify; Kun saat koodin kääntymään, aja testit. Vihreää.

Tutki koodia. Koodi poikkeaa aiemmasta tavasta muutamassa kohdassa. Nyt testaajan ei tarvitse koodata erikseen jäljittelevän luokan toimintaa, vaan toiminta kuvataan EasyMockkehikkoa käyttäen.... Hinnoittelija hinnoittelija = createmock(hinnoittelija.class); // record expect(hinnoittelija.getalennusprosentti(asiakas, tuote)).andreturn(alennus); replay(hinnoittelija);... verify(hinnoittelija); Matkittavan luokan nimi annetaan createmock()-kutsun parametrina. Record-vaiheessa rekisteröidään ("opetetaan") 1) minkä nimisiä metodeja tullaan kutsumaan testattavasta luokasta, ja 2) mitä arvoja kutsuista oletetaan saatavan. Tätä kohtaa ohjelmoitaessa on kurkistettu testattavaan TilaustenKäsittely-luokkaan. Sieltä näkyy mitä Hinnoittelija-luokan palveluja se käyttää (ja missä järjestyksessä). Kutsuttavat metodit ja odotetut paluuarvot rekisteröidään Mock-oliolle. Jos jotain metodia kutsutaan useita kertoja, on se myös rekisteröitävä yhtä monta kertaa. "Opettamisen" jälkeen toimintaa matkiva Mock-olio siirretään replay()-kutsulla tilaan, jossa se on valmis matkimaan puuttuvalle oliolle meneviä kutsuja. reset()-kutsulla voi tyhjentää aiemmat nauhoitukset, ja sen jälkeen voi opettaa uudet. Testin lopussa oleva verify()-kutsu varmistaa, että kaikkia Mock-oliolle nauhoitettuja metodeja on todella myös kutsuttu testin aikana. TEHTÄVÄ Laita TilaustenKäsittely-luokan käsittele()-metodi kommentin sisään ja kopioi sen tilalle alla oleva koodi public void käsittele(tilaus tilaus) { Asiakas asiakas = tilaus.getasiakas(); Tuote tuote = tilaus.gettuote(); hinnoittelija.aloita(); float prosentti = hinnoittelija.getalennusprosentti(asiakas, tuote); if (tuote.gethinta() >= 100) { hinnoittelija.setalennusprosentti(asiakas, prosentti + 5); prosentti = hinnoittelija.getalennusprosentti(asiakas, tuote); float alennushinta = tuote.gethinta() * (1 - (prosentti / 100)); asiakas.setsaldo(asiakas.getsaldo() - alennushinta); hinnoittelija.lopeta();

Tässä käytetään muutamaa uutta Hinnoittelija-luokan metodia. Lisää näiden tyhjät rungot Hinnoittelija-luokkaan, jotta koodi kääntyy. Laadi sitten Mock-olioita käyttäen JUnit-testit, joilla testaat, että tilauksen käsittely toimii oikein. Nyt se toimii hieman eri tavalla, kun hinta < 100 tai hinta >= 100. Kumpikin tilanne on testattava. Kun kutsuttava metodi ei palauta mitään, se rekisteröidään EasyMockissa ilman expect ja andreturn avainsanoja, esim. hinnoittelija.aloita(); Aja testit. Kun vihreää, niin tehtävä on valmis. o-o-o Lue ja opettele lisää: http://easymock.org/ ja sieltä välilehti Documentation.