Skip to end of metadata
Go to start of metadata

tehtävien 1-10 palautus aiempien viikkojen tapaan, deadline su 15.4. klo 23.59

  • palautusta varten yksityinen repositorio jolla collaboratorina käyttäjä mluukkai
    • kannattaa käyttää samaa repoa kuin viikon 2 ja 3 tehtävissä
  • palautusrepositorion nimi ilmoitetaan tehtävien lopussa olevalla palautuslomakkeella

1 SpringWebMVC

Tarkastellaan edelliseltä viikolta tutun toiminnallisuuden tarjoamaa esimerkkiprojektia joka löytyy repositorion https://github.com/mluukkai/ohtu2012 hakemistossa laskari4/LoginWeb2

Hae projekti ja käynnistä se komennolla

Jetty on keyvt HTTP-palvelin ja Servlettien ajoympäristö. Projektiin on konfiguroitu Jetty Maven-pluginiksi. Jos kaikki menee hyvin, on sovellus nyt käynnissä ja voit käyttää sitä web-selaimella osoitteesta _http://localhost:8080_ eli paikalliselta koneeltasi portista 8080.

Jos koneellasi on jo jotain muuta portissa 8080, voit konfiguroida sovelluksen käynnistymään johonkin muuhun porttiin esim. 9999:n seuraavasti:

SpringWebMVC:stä tällä kurssilla ei tarvitse ymmärtää. Kannattaa kuitenkin vilkaista tiedostoa ohtu.OhtuController.java joka sisältää koodin joka hoitaa sovelluksen eri osoitteisiin tulevat kutsut. Kontrolleri käyttää AuthenticationService-luokkaa toteuttamaan kirjautumisen tarkastuksen ja uusien käyttäjien luomisen. Kontrolleri delegoi www-sivujen renderöinnin hakemiston WebPages/WEB-INF-views alla olevien jsp-sivujen avulla.

Eli tutustu nyt sovelluksen rakenteeseen ja toiminnallisuuteen. Saat sammutettua sovelluksen painamalla ctrl+d konsolissa.

2 Selenium, eli web-selaimen simulointi ohjelmakoodista

Web-selaimen simulointi onnistuu mukavasti Selenium WebDriver -kirjaston avulla. Edellisessä tehtävässä olevassa projektissa on luokassa ohtu.Tester.java pääohjelma, jossa on seuraava koodi:

Käynnistä sovellus edellisen tehtävän tapaan. Varmista selaimella että sovellus on päällä.

Aja Tester.java:ssa oleva ohjelma. Esim. NetBeansilla tämä onnistuu valitsemalla tiedoston nimen kohdalta oikealla hiiren napilla "Run file".

Katso mitä ohjelma tulostaa.

Tester-ohjelmassa luodaan alussa selainta simuloiva olio WebDriver driver. Tämän jälkeen "mennään" selaimella osoitteeseen localhost:8080 ja tulostetaan sivun lähdekoodi. Tämän jälkeen
haetaan sivulta elementti jossa on linkkiteksti login: eli

Linkkielementtiä klikataan ja jälleen tulostetaan sivun lähdekoodi. Seuraavaksi etsitään sivulta jonne päädyttiin elementti jossa teksti nimi, kyseessä on lomakkeen input-kenttä, ja ohjelma "kirjoittaa" kenttään komennolla sendKeys() nimen "pekka".

Tämän jälkeen täytetään vielä salasanakenttä ja painetaan lomakkeessa olevaa nappia. Lopuksi tulostetaan vielä sivun lähdekoodi.

Ohjelma siis simuloi selaimen käyttöskenaarion jossa kirjaudutaan sovellukseen.

Muuta koodia siten että läpikäyt seuraavat skenaariot:

  • epäonnistunut kirjautuminen: oikea käyttäjätunnus, väärä salasana
  • epäonnistunut kirjautuminen: eiolemassaoleva käyttäjätunnus
  • uuden käyttäjätunnuksen luominen
  • uuden käyttäjätunnuksen luominen ja luodulla käyttäjätunnuksella kirjautuminen

3 Web-sovelluksen testaaminen: easyB+Selenium

Pääsemme jälleen käyttämään viime viikolta tuttua easyB:tä. Hakemistosta Other Test Sources/easyb löytyy valmiina User Storyn User can log in with valid username/password-combination määrittelevä story. Yksi skenaarioista on valmiiksi mäpätty koodiin. Täydennä kaksi muuta skenaariota.

4 Web-sovelluksen testaaminen osa 2

Kuten viimeviikolta muistamme, toinen järjestelmän toimintaa määrittelevä User Story on A new user account can be created if a proper unused username and a proper password are given

Löydät tämän Storyn easyB-pohjan viimeviikon tehtävistä. Kopioi story projektiisi ja tee skenaarioista suoritettavia kirjottamalla niihin sopivaa seleniumin avulla (edellisen tehtävän tyyliin) sovellusta testaavaa koodia. Kuten viimeviikolla, joudut laajentamaan AuthenticationService-luokkaa jotta saat kaikki skenaariot toimimaan.

Huom: voit tehdä Tester.java:n tapaisen pääohjelman sisältävän luokan jos haluat/joudut debuggaamaan AuthenticationService:ä.

5 lisää mavenia: pom.xml

Maven-projekti konfiguroidaan projektin juuressa olevassa pom.xml-tiedostossa.

Tutkitaan hieman edellisten tehtävien pom.xml:in sisältöä.

Alussa määritellään projektin tiedot (nimi, versio.)

Kohdassa properties määritellään mm. alempana käytettäviä vakioita

Maven osaa ladata riippuvuuksia (eli käytännössä jar-tiedostoja) automaattisesti oletusrepositorioista. Kaikki riippuvuudet eivät kuitenkaan löydy oletusrepositorioista ja tälläisiä tilanteita varten osaan repositories voi määritellä vaihtoehtoisia repositorioita joista maven voi etsiä riippuvuuksia.

Riippuvuudet määritellään osassa dependencies

  • alussa olevien riippuvuuksien (mm. easyb, junit) scope on test, tämä tarkoittaa että ne ovat käytössä vain testeissä
  • selenium-riippuvuuden scope on compile, tällöin selenium on käytössä testeissä ja normaalissa koodissa
  • jos ohjelmassa tarvitaan jar:eja, tulee niitä vastaavat maven-riippuvuudet kirjata dependencies-osaan, riippuvuuksia voi etsiä mm. seuraavista: http://search.maven.org tai http://mvnrepository.com/

Osassa build määritellään kääntämiseen liittyvien pluginien toimintaa

  • kääntämisessä määritellään käytettävän javan versiota 1.6, tämä tapahtuu maven-compiler-plugin:ia konfiguroimalla
    • jos tätä konfiguraatiota ei tehdä käyttää compiler-plugin oletusarvoista javan versiota. maven 3:ssa se on 1.6 mutta maven 2.*:ssa versio 1.3
  • jetty-pluginiin liittyy enemmänkin konfiguraatioita
    • kohdan executions-alla määritellään, että jetty käynnistetään pre-integration-test ja sammutetaan post-integration-test, tämä saa aikaan sen, että kun ajetaan integraatiotestejä, eli mvn integration-test, on jetty päällä testien ajamisen aikana
  • easyb-pluginin määritellään ajavan testit integration-test-vaiheessa

6 lisää mavenia: riippuvuuksien lisääminen

Hae repositorion https://github.com/mluukkai/ohtu2012 hakemistossa laskari4/TyhjaProjekti lähes tyhjän maven-projektin runko.

  • mukana on kaksi kohta tarvitsemaasi luokkaa: Palautus ja Palautukset

Tehdään ohjelma jonka avulla voit lukea kurssilla palauttamiesi tehtävien statistiikan http://ohtustats.herokuapp.com/-palvelimelta

Omat palautukset palauttava sivu on http://ohtustats.herokuapp.com/opiskelija/12345678.json, missä 12345678 siis opiskelijanumerosi. Palvelin palauttaa tietosi json-muodossa

Tavoitteena on tehdä ohjelma joka ottaa komentoriviparametrina opiskelijanumeron ja tulostaa palautettujen tehtävien statistiikan ihmisystävällisessä muodossa.

Ohjelmassa tarvitaan muutamaa kirjastoa:

Liitä projektisi pom.xml:n seuraavat riippuvuudet

  • commons-httpclient, Commons IO, gson
  • löydät riippuvuuksien tiedot seuraavista http://search.maven.org http://mvnrepository.com/
  • Ainakin seuraavat versiot on todettu yhteensopiviksi ja toimivaksi projektin koodin kanssa: commons-httpclient 3.1, Commons IO 2.0, gson 2.1

Ota mallia edellisen tehtävän projektista ja määrittele maven-compiler-plugin käyttämään javan versiota 1.6

Voit ottaa projektisi pohjaksi seuraavan tiedoston:

HUOM: jos teet koodia NetBeansilla, kirjastoja ei ehkä tunnisteta ennenkiun teet clean and buildin ja NB lataa ne mavenin repositoriosta koneellesi.

Tee kuitenkin ohjelmastasi tulostusasultaan miellyttävämpi, esim. seuraavaan tyyliin:

7 lisää mavenia: jar joka sisältää kaikki riippuvuudet

  • tehdään äskeisen tehtävän projektista jar-tiedosto komennolla mvn install
  • suoritetaan ohjelma komennolla java -cp tiedostonNimi.jar ohtu.Main
  • mutta ohjelma ei toimikaan, tulostuu:
  • Mistä on kyse?
  • ohjelman riippuvuuksia eli projekteja commons-httpclient, Commons IO ja gson vastaavat jar-tiedostot eivät ole käytettävissä, joten ohjelma ei toimi
  • saamme generoitua ohjelmasta jar-tiedoston joka sisältää myös riippuvuudet mavenin assembly-pluginin avulla
  • lisää pom.xml:n plugineihin seuraava:
  • komennolla mvn assembly:assembly syntyy koko ohjelman sisältävä "standalone"-jar-tiedosto:

Riippuvuudet sisältävä jar-voidaan myös tehdä käyttämällä mavenin shade-pluginia. Shade-pluginin avulla saadaan itseasiassa aikaan "helppokäyttöisempi" jar, joka voidaan käynnistää määrittelemättä main-metodin sisältävää luokkaa.

Määrittele shade-pluginille mainClassin sijainti lisäämällä pom.xml:ääsi seuraava:

Saat luotua jar:in komennolla mvn package, ja ohjelman suoritus tapahtuu komennolla java -jar tiedostonnimi.jar

8 Yksikkötestaus ja riippuvuudet: Mockito, osa 1

Useimmilla luokilla on riippuvuuksia toisiin luokkiin. Esim. viikon 2 verkkokauppaesimerkin luokka Kauppa riippui Pankista, Varastosta ja Viitegeneraattorista. Riippuvuuksien injektoinnilla ja rajapinnoilla saimme mukavasti purettua riippuvuudet konreettisten luokkien väliltä.

Vaikka luokilla ei olisikaan riippuvuuksia toisiin konkreettisiin luokkiin, on tilanne edelleen se, että luokan oliot käyttävät joidenkin toisten luokkien olioiden palveluita. Tämä tekee joskus yksikkötestauksesta hankalaa. Miten esim. luokkaa Kauppa tulisi testata? Tuleeko Kaupan testeissä olla mukana toimivat versiot kaikista sen riippuvuuksista?

Olemme jo muutamaan otteeseen (esim. Nhl-Statsreader-tehtävässä viikolla 2) ratkaisseet asian ohjelmoimalla riippuvuuden korvaavan "tynkäkomponentin". Javalle (niinkuin kaikille muillekin kielille) on tarjolla myös valmiita kirjastoja tynkäkomponettien toiselta nimeltään "mock-olioiden" luomiseen.

Tutustumme nyt Mockito-nimiseen mock-kirjastoon. Muita vaihtoehtoja esim.

Hae repositorion https://github.com/mluukkai/ohtu2012 hakemistossa laskari4/MockitoDemo oleva projekti. Kyseessä on yksinkertaistettu versio Verkkokauppaesimerkistä.

Projektiin on kirjoitettu 6 Mockitoa hyödyntävää testiä. Kaikissa testeissä testataan luokkaa Kauppa ja sen riippuvuudet (Pankki ja Viitegeneraattori) on annettu testeissä mock-olioina.

Tutustu projektiin ja sen testeihin.

Kuten huomaamme, mock-oliot eivät ole pelkkiä "tynkäolioita", mockien avulla voi myös varmistaa että testattava luokka kutsuu olioiden metodeja asiaankuuluvalla tavalla.

Mockiton dokumentaatio: http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html

9 Yksikkötestaus ja riippuvuudet: Mockito, osa 2

Viikolla 2 NhlStatsReader-ohjelmassa verkon kanssa kommunikoiva luokka PlayerReader eristettiin rajapinnan taakse ja injektoitiin varsinaisen tilastopalvelun tarjoavalle luokalle Statistics.

Luokkaa Statistics testattiin siten, että testissä sille injektoitiin itse toteutettu tynkäversio PlayerReader:ista. Korvaa itse ohjelmoitu tynkä Mockitolla tehdyllä Mock-oliolla. Luokkaa Player ei kannattane mockata vaan sitä voi käyttää sellaisenaan tehtävässä. Testit itsessään säilyvät (lähes) samoina kuin laskari2:n versiossa, ainoastaan stubi korvautuu mock-oliolla.

Muista lisätä pom.xml-tiedoston riippuvuuksiin mockito:

Lisää testitiedostoosi import:

10 Yksikkötestaus ja riippuvuudet: Mockito, osa 3

Testataan viikolta 2 tutun Verkkokaupan Kauppa-luokkaa

  • Spring-versio löytyy https://github.com/mluukkai/ohtu2012 hakemistossa laskari2/Verkkokauppa3 (xml:llä konfiguroitu) ja laskari2/Verkkokauppa4 (annotaatioilla konfiguroitu)
  • ota edellisistä jompi kumpi pohjaksi jos ei tehnyt tehtävää

Kaupalle injektoidaan konstruktorissa Pankki, Viitelaskuri ja Varasto.

Tehdään näistä testissä mockitolla mockatut versiot.

Tee seuraavat testit:

  • aloitataan asiointi, koriin lisätään koriin tuote jota varastossa on ja suoritetaan ostos (eli kutsutaan metodia kaupan tilimaksu()). varmistettava että kutsutaan pankin metodia tilisiirto oikealla asiakkaalla, tilinumerolla ja summalla
  • aloitataan asiointi, koriin lisätään koriin kaksi eri tuotetta joita varastossa on ja suoritetaan ostos. varmistettava että kutsutaan pankin metodia tilisiirto oikealla asiakkaalla, tilinumerolla ja summalla
  • aloitataan asiointi, koriin lisätään koriin kaksi samaa tuotetta jota on varastossa tarpeeksi ja suoritetaan ostos. varmistettava että kutsutaan pankin metodia tilisiirto oikealla asiakkaalla, tilinumerolla ja summalla
  • aloitataan asiointi.koriin lisätään koriin tuote jota on varastossa tarpeeksi ja tuote joka on loppu ja suoritetaan ostos. varmistettava että kutsutaan pankin metodia tilisiirto oikealla asiakkaalla, tilinumerolla ja summalla
  • varmistettava että metodin aloita asiointi kutsuminen nollaa edellisen ostoksen tiedot
  • varmistettava että kauppa pyytää uuden viitenumeron jokaiselle maksutapahtumalle

Kaikkien testien tarkastukset onnistuvat mockiton verify-komennolla.

Tarkasta vanhan ystävämme coberturan avulla mikä on luokan Kauppa testauskattavuus. Jotain taitaa puuttua. Lisää testi joka nostaa kattavuuden sataan prosenttiin!

11 Tehtävän 7 yksikkötestaus

Muokkaa tehtävän 7 ohjelman rakenne sellaiseksi, että ohjelma on mahdollisimman pitkälti yksikkötestattavissa ja kirjoita ohjelmalle testit.

palautus

  • Kirjaa tekemäsi tehtävät tänne
    • huom: tehtävien palautuksen deadline on su 15.4. klo 23.59
  • Kirjauksen onnistumisen ja aiemmat kirjauksesi voit tarkistaa täältä

palaute tehtävistä:

  • Lisää viikon 1 tehtävässä 8 forkaamaasi repositorion omalla nimelläsi olevaan repositorioon hakemistoon tiedosto nimeltä viikko4
  • tee viime viikon tehtävän tapaan pull-request
    • anna tehtävistä palautetta avautuvaan lomakkeeseen
    • huom: jos teet tehtävät alkuviikosta, voi olla, että edellistä pull-requestiasi ei ole vielä ehditty hyväksyä ja et pääse vielä tekemään uutta requestia

ei normaaleja paikanpäällä tehtäviä laskareita

miniprojekti

  • to 12.4. ja pe 13.4. ensimmäisen sprintin review ja toisen sprintin suunnittelu
  • jokainen ryhmä tapaa asiakkaan, ajanvaraus ilmestyy tänne myöhemmin
Labels
  • None