Skip to content
Joni Salmi edited this page Mar 22, 2015 · 9 revisions

Huom: ohjausta tehtävien tekoon ma klo 18-20 (doge), ke 10-12 (Pihla UMT) ja pe klo 12-14 (Pihla UMT) sekä 16-18 (doge) salissa B221

Tehtävien palautuksen deadline su 29.3. klo 23.59

palautetaan GitHubin kautta

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

1. lisää mavenia: koodin staattinen analyysi

mene nyt johonkin valmiiseen projektiisi, esim. viikon 2 verkkokauppaan

  • kokeile suorittaa mvn jxr:jxr checkstyle:checkstyle
  • avaa raportti selaimella polulta /target/site/checkstyle.html
    • tutki raporttia
  • oletusarvoisesti raportoidaan paljon kaikenlaista ja oleellinen uhkaa hukkua detaljien joukkoon

checkstylen tarkkailemien virheiden joukko on konfiguroitavissa erillisen koniguraatiotiedoston avulla

  • hae repositiorion https://github.com/mluukkai/ohtu2015/ hakemistosta viikko3 konfiguraatiotiedoston pohja my_checks.xml, talleta se sopivaan paikkaan, kokeile: mvn jxr:jxr checkstyle:checkstyle -Dcheckstyle.config.location=my_checks.xml
  • komennossa oleva polku olettaa että konfiguraatiotiedosto sijaitsee projektihakemiston juuressa
    • saattaa olla, että windowsissa komentoon on lisättävä pari hipsua: mvn jxr:jxr checkstyle:checkstyle -D"checkstyle.config.location=my_checks.xml"
    • huom: saattaa olla, että komento ei toimi windowsilla, ongelma ehkä vaan win 8:ssa. jos näin käy, konfiguraatiotiedoston sijainnin voi määritellä pom.xml-tiedostossa seuraavasti:
<plugins>
  <!-- muut mahdolliset pluginit -->
 
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>2.10</version>
    <configuration>
      <configLocation>my_checks.xml</configLocation>
    </configuration>
  </plugin>
</plugins>

eli lisää uusi plugin-määrittely plugins-määrittelyjen sisälle. Jos plugins:eja ei ole, joudut lisäämään myös <plugins>...</plugins>-tägit.

  • tee alkuperäisestä konfiguraatiotiedostosta kopio, ja poista kopiosta kaikki elementin tree walker sisällä olevat tarkistukset
  • määrittele tiedostoon seuraavat säännöt (ks. available checks ja standard checks checkstylen sivuilta):
    • metodien pituus max 10 riviä (tämä ja seuraavat säännöt määritellään moduulin tree walker sisälle)
    • ei yli yhtä sisäkkäisiä if:iä
    • ei sisäkkäisiä for:eja
    • koodi on oikein sisennettyä
    • syklomaattinen koodikompleksisuus korkeinaan 3 (selvitä mitä tarkoittaa!)
    • ei yli 5 rivin copy-pasteja, huom: tätä tarkastusta ei tule laittaa tree-walkerin sisälle vaan "samalle tasolle" walkerin kanssa. Tätä ei löydy enää checkstylen dokumentaatiosta, mutta se on :
<module name="StrictDuplicateCode">
    <property name="min" value="tähän suurin rivimäärä joka hyväksytään"/>
</module>
  • tee koodiin muutoksia, jolla testaat että rikkoutuvat ehdot huomataan

2. Sonar

Sonar on ohjelma, joka kokoaa erilaisia koodin laatua mittaavien työkalujen (mm. staattisen analyysin työkalut kuten checkstyle ja testikattavuus kuten cobertura) yhdeksi raportiksi. Sonar tallettaa generoidut raportit tietokantaan, ja näinollen koodin laadun kehitystä on mahdollista seurata projektin edetessä.

Tutkitaan nyt Sonarilla muutaman projektin koodia. HUOM Sonar toimii huonosti Mavenin version 2.* kanssa. Varmista komennolla mvn -v että käytössäsi on Mavenista versio 3.*.

Käynnistetään ensin Sonar

  • lataa Sonar osoitteesta http://www.sonarsource.org/downloads/
  • OS X:llä toimii brew install Sonar
  • pura zip-paketti esim. kotihakemistoosi ja mene hakemistoon sonar-3.5/bin/linux-x86-32 (tai koneesi tyyppiä vastaavaan hakemistoon)
  • käynnistä Sonar. Linuxissa tämä tapahtuu komennolla ./sonar.sh start
  • Sonarin raportit ovat näkyvissä selaimessa osoitteessa http://localhost:9000, avaa sivu
    • HUOM: laitoksen koneilla Sonar vaikuttaa käynnistyvän hitaasti. Jos niin käy, sammuta Sonar komennolla ./sonar.sh stop, uudelleenkäynnistä ja uudelleenlataa sivua... ja Sonar toivonmukaan herää

Generoidaan raportti muutamalle projektille

  • maven-muotoisille projekteille raportti generoidaan antamalla projektin hakemistossa komento mvn clean test sonar:sonar
  • generoi raportti viikon 2 laskarien verkkokaupalle ja repositiorion https://github.com/mluukkai/ohtu2015/ viikon 3 hakemistostosta löytyvälle KumpulaBiershop olutverkkokaupalle
    • huomaa, että Sonar pitää olla käynnistettynä raportin generointihetkellä!
  • tutki raportteja
    • katso erityisesti mitä löytyy kohdan Tools alta
    • mieti miten korjaisit sonarin raportoimat koodin ongelmat

Sivulta http://nemo.sonarsource.org löytyy useiden open source -projektien Sonar-raportteja.

3. tutustuminen easyB:hen

Lue seuraava https://github.com/mluukkai/ohtu2015/blob/master/web/easyb.md

tutustu linkin takana olevan ohjelman rakenteeseen ja aja siihen liittyvään testit.

  • käynnistä ohjelma mvn exec ... -komennolla (ks. viikon 1 laskarit)
  • ohjelman tuntemat komennot ovat login ja new

4. Kirjautumisen testit

tee User storyn User can log in with valid username/password-combination kaikista testeistä ajettavia

5. Uuden käyttäjän rekisteröitymisen testit

tee User storyn A new user account can be created if a proper unused username and a proper password are given kaikista testeistä ajattavia.

  • käyttäjätunnuksen on oltava merkeistä a-z koostuva vähintään 3 merkin pituinen merkkijono, joka ei ole vielä käytössä
  • salasanan on oltava pituudeltaan vähintään 8 merkkiä ja sen tulee sisältää vähintään yksi numero tai erikoismerkki
  • Täydennä ohjelmaa siten että testit menevät läpi

Testejä kannattaa tehdä yksi kerrallaan, laittaen samalla vastaava ominaisuus ohjelmasta kuntoon.

HUOM voit vähentää testikoodisi copypastea määrittelemällä testeille apumetodeja. Ohjeita metodien määrittelemiseen ym. täällä

6. Spring jälleen kerran

Ennen kuin sovellus päästään käynnistämään, on se konfiguroitava:

public static void main(String[] args) {
    UserDao dao = new InMemoryUserDao();
    IO io = new ConsoleIO();
    AuthenticationService auth = new AuthenticationService(dao);
    new App(io, auth).run();
}

Muuta ohjelmaa siten, että sovelluksen konfigurointi hoidetaan Springin avulla (joko xml- tai annotaatioperustaisesti), ja main:iksi riittää:

public static void main(String[] args) {
    ApplicationContext ctx = new FileSystemXmlApplicationContext("src/main/resources/spring-context.xml");
 
    App application = ctx.getBean(App.class);
    application.run();
}

Ohjeita löytyy viikon 2 laskareiden lisämateriaalista

7. FileUserDAO

Laita ohjelma tallettamaan käyttäjätiedot tiedostoon. Hoida asia siten, että teet luokan FileUserDAO, joka toteuttaa rajapinnan UserDAO. Anna FileUserDAO:lle sen käyttämä tiedosto konstruktorin parametrina. Testatessa on edelleen mielekästä käyttää InMemoryUserDAO:a.

  • Jos tiedostojen käsittely on päässyt unohtumaan, ohjeita esim. Ohjelmoinnin jatkokurssin viikoilta 9 ja 11
    • jos salasanatiedosto sijaitsee projektihakemiston juuressa, sen luettavaksi avaaminen onnistuu komennolla new Scanner(new File("salasanat.txt"));
    • päätä itse mitä tapahtuu tilanteessa, jossa parametrina annettua tiedostoa ei ole olemassa

Jos teit edellisen tehtävän, muokkaa Spring-konfiguraatiosi ottamaan huomioon uusi tilanne. Huom: joutunet konfiguroimaan FileUserDAO:n xml:ssä, sillä merkkijonomuotoista konstruktoriparametria ei pysty injektoimaan @Autowired-annotaatiolla. Ohje String-tyyppisen arvon injektointiin xml-konfiguraatiossa täällä

tehtävien kirjaaminen palautetuksi

tehtävien kirjaus:

  • Kirjaa tekemäsi tehtävät tänne
    • huom: tehtävien palautuksen deadline on su 29.3. klo 23.59

palaute tehtävistä:

  • Lisää viikon 1 tehtävässä 11 forkaamasi repositorion omalla nimelläsi olevaan hakemistoon tiedosto nimeltä viikko3
  • 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