TIE-21200 Ohjelmistojen testaus Harjoitustyön esittely osa 1: Yleisinfo ja vaiheet 1 & 2 Antti Jääskeläinen Matti Vuori
Yleinen byrokratia 1.9.2014 2
Kurssihenkilökunta Antti Jääskeläinen vastuu harjoitustyön rakenteesta ja yleisistä järjestelyistä ohjaa osaa ryhmistä vastaanotto: tiistaisin 11:30-12:30, huone TE204 antti.m.jaaskelainen@tut.fi Matti Vuori ohjaa osaa ryhmistä huone TE204, http://www.cs.tut.fi/~vuori5 matti.p.vuori@tut.fi Ryhmien oma assistentti vastaa työn yksittäisiin vaiheisiin liittyviin kysymyksiin, kyselyt koko harjoitustyön järjestelyistä Antille 1.9.2014 3
Harjoitustyöhön valmistautuminen Rekisteröidy IDLEen kurssille Muodosta ryhmä etsi pari luokaa ryhmä IDLEen ryhmät jaetaan ohjaajille (lähes) automaattisesti Lue harjoitustyön nettisivu yleinen ohjeistus, aikataulu http://www.cs.tut.fi/~testaus/s2013/project/ Lue päätestaussuunnitelma (Master Test Plan, MTP) eri vaiheiden tehtävät, työkalut http://www.cs.tut.fi/~testaus/s2013/project/master_test_plan.pdf 1.9.2014 4
Kurssin läpäisy Harjoitustyössä on neljä vaihetta kustakin tarjolla 0-4 pistettä nollan pisteen palautus ei ole hylätty, vaan kurssilla voi edelleen jatkaa Maksimipisteet harjoitustyöstä 16 puolet koko kurssin pisteistä Voidaksesi osallistua tenttiin sinun on saatava harjoitustyöstä vähintään 5 pistettä tehtävä hyväksytty palautus kaikissa työn vaiheissa Läpäistäksesi kurssin sinun on saatava vähintään 5 pistettä tentistä noin puolet kaikista saatavilla olevista pisteistä (~16/32) 1.9.2014 5
Harjoitustyö 1.9.2014 6
Työn vaiheet Työssä on neljä vaihetta 1. yksikkötestauksen suunnittelu 2. yksikkötestauksen suoritus ja raportointi 3. järjestelmätestauksen suunnittelu 4. järjestelmätestauksen suoritus ja raportointi Testikohde yksikkötestauksessa on URI Resolver URI-merkkijonojen jäsenninmoduuli Testikohde järjestelmätestauksessa on jedit ohjelmoijan tekstieditori http://www.jedit.org/ 1.9.2014 7
Palautukset 1/2 Vaihe 1: yksikkötestaussuunnitelma Vaihe 2: yksikkötestausraportti korjattu suunnitelma yksikkötestit Vaihe 3: järjestelmätestaussuunnitelma Vaihe 4: järjestelmätestausraportti korjattu suunnitelma muut tiedostot lähestymistavan mukaan 1.9.2014 8
Palautukset 2/2 Palautukset tehdään IDLEssä Kaikki suunnitelmat ja raportit palautetaan PDF-muodossa Vaiheessa 2 palautetaan yksikkötestit testit suoritetaan automaattisesti palautuspaketin on oltava oikean muotoinen! 1.9.2014 9
Välinäytöt ja palautetilaisuudet Välinäytöt viikko ennen vaiheiden 1 ja 3 palautuksia tilaisuus esittää kysymyksiä ja esitellä siihenastisia tuotoksia vapaaehtoisia 20 minuuttia per ryhmä Palautetilaisuudet viikko vaiheiden 1 ja 3 palautusten jälkeen palaute suunnitelmasta ja tilaisuus saada ohjausta seuraavaan vaiheeseen pakollisia: kummassakin tilaisuudessa ainakin toisen ryhmän jäsenen oltava paikalla, kummankin ryhmän jäsenen käytävä ainakin toisessa tilaisuudessa 15 minuuttia per ryhmä 1.9.2014 10
Aikataulu Yksikkötestaussuunnitelma viikko 38: välinäytöt viikko 39: palautus viikot 40-41: palautetilaisuudet Yksikkötestausraportti viikko 43: palautus Järjestelmätestaussuunnitelma viikko 45: välinäytöt viikko 46: palautus viikko 47: palautetilaisuudet Järjestelmätestausraportti viikko 49: palautus 1.9.2014 11
Vaiheet 1 & 2: Yksikkötestaus 1.9.2014 12
Päämäärä URI Resolver -moduulin yksikkötestaus Tarkoitus on kehittää testijoukko, joka testaa, toimiiko luokka riittävän hyvin käyttöönottoa varten toimii regressiotestijoukkona luokan myöhemmille versioille Testaus suoritetaan käyttäen JUnit-yksikkötestauskehystä Vaihe 1: suunnittele testijoukon rakenne aloita testijoukon toteutus Vaihe 2: viimeistele testijoukon toteutus suorita testit raportoi tulokset 1.9.2014 13
Testikohde URI Resolver Java-moduuli URIen (Uniform Resource Identifier) jäsentämiseen Löytyy Lintulasta /share/ohjcourses/testaus/packages/uriresolver.tar.gz Pakkaus uriresolver sisältää 6 luokkaa, joista varsinaisesti testattavana ovat Parser ja Resolver Dokumentaatio URIn rakenteen määrittelee RFC 3986 (http://tools.ietf.org/html/rfc3986) Koodissa joitakin kommentteja Muilta osin oikea toiminnallisuus on pääteltävä itse 1.9.2014 14
Suunnitelman teko Mitä testataan? Testitapausten kehittäminen mihin ominaisuuksiin pitäisi keskittyä? millaisilla syötteillä niitä pitäisi testata? Testauksen logistiikka: miten testitapaukset on paras jakaa luokkiin ja testijoukkoihin? Milloin on testattu tarpeeksi? koodikattavuutta voi käyttää apuvälineenä, mutta siihen ei parane luottaa liikaa Milloin testikohde läpäisee testauksen? 1.9.2014 15
Testitapauksen rakenne Alustus luo tarvittavat oliot ja saata ne sopivaan tilaan Suoritus suorita testiaskeleet Tarkastus varmista, että paluuarvot ja olioiden tilat ovat oikein tärkein askel! Siivous vapauta varatut resurssit (oliot, tiedostokahvat yms.) 1.9.2014 16
Raportin teko Mitä on testattu? Poikettiinko suunnitelmista? Jos, niin miten? kaikki sujuu harvoin täsmälleen suunnitelman mukaan, poikkeamia voi tehdä tarpeen vaatiessa Kuinka kattava testaus oli? Millaisessa kunnossa testikohde testauksen perusteella on? Läpäiseekö testikohde testauksen? Mitä virheitä on löydetty? virheraportit kirjoitetaan löydetyistä virheistä, ei epäonnistuneista testeistä: usealle samaan ongelmaan törmänneelle testille yhteinen raportti 1.9.2014 17
Virheraportin rakenne Kerro, mikä testikohteessa on vialla pitäisi näkyä jo otsikossa, jotta vikaluettelosta saisi yleiskuvan testikohteen kunnosta Missä ja miten vika ilmenee testiympäristö syötteet odotetut ja saadut tulokset jne. Motivoi ihmisiä korjaamaan vika vaikutukset käyttäjään vaikutukset kehitykseen ja testaukseen 1.9.2014 18
Työkalut: Java, JUnit ja Eclipse 1.9.2014 19
Java: Tyypit Primitiivityypit toimivat C++:n tapaan byte, short, int, long, float, double, boolean, char Kaikille on vastaava luokka, jota on käytettävä esim. säiliöiden kanssa; nimi sama mutta isolla alkukirjaimella, paitsi Integer ja Character Konversiot primitiiveistä olioiksi ja takaisin tapahtuvat implisiittisesti Merkkijonot ovat olioita mutta niille on erityistukea syntaksissa String str = abc + toinenstr; Sama pätee taulukoihin int[] taulukko1 = new int[] {2, 3, 5}; int[] taulukko2 = new int[koko]; 1.9.2014 20
Java: Oliot ja viitteet Tila olioille varataan aina keosta StringBuilder s = new StringBuilder( abc ); Olioita käsitellään aina viitteinä StringBuilder t = s; s.append( def ); t.tostring(); // palauttaa abcdef Olioiden yhtäsuuruus s == t // ovatko s ja t sama olio? s.equals(t) // ovatko s ja t ekvivalentit? null on viite ei mihinkään (tai oikeasti ei, mutta sinne päin) Ei eksplisiittistä olioiden tuhoamista tai purkajia, roskienkeruu siivoaa oliot kun niihin ei enää viitata s = null; t = null; 1.9.2014 21
Java: Rakenteet Tiedostot ryhmitellään pakkauksiin pakkaus.alipakkaus.luokka Muiden pakkausten (julkinen) sisältö liitettävä mukaan import-lauseella protected-kenttiin pääsee käsiksi saman pakkauksen sisältä Määre final muuttujan määrittelyssä estää primitiivimuuttujan arvon muuttamisen estää olioviitteen kääntämisen viittaamaan toiseen olioon (muttei viitatun olion tilan muuttamista) Useimmat metodin heittämät poikkeukset on kirjattava sen otsikkoon public void avaatiedosto(string nimi) throws IOException { } @-merkillä alkavilla annotaatioilla voidaan lisätä koodiin metadataa @Override public void perittymetodi() { } JUnit käyttää näitä mm. tunnistamaan testimetodit 1.9.2014 22
Java: Materiaalia Javan APIn kuvaus http://docs.oracle.com/javase/7/docs/api/ Kannattaa katsastaa erityisesti säännöllisiä lausekkeita käsittelevät APIn luokat Pattern ja Matcher pakkauksesta java.util.regex Lisätietoja saatavilla osoitteista http://www.cprogramming.com/tutorial/java/syntax-differences-javac++.html http://www.programmersheaven.com/2/faq-java-differences- Between-JAVA-And-C-CPP http://en.wikipedia.org/wiki/comparison_of_java_and_c%2b%2b 1.9.2014 23
JUnit Yksikkötestikehys Java-ohjelmille Huolehtii testien alustamisesta, suorituksesta ja raportoinnista Testitapaukset esitetään rakenteisessa ja ylläpidettävässä muodossa Testitapaukset ovat JUnitin metodeita Useita testitapauksia voidaan koota samaan testiluokkaan kannattaa tehdä testitapauksille, jotka vaativat samanlaisen alustuksen Lisätietoja saatavilla sivulta http://www.junit.org Vastaavia xunit-kehyksiä on tarjolla myös muille ohjelmointikielille 1.9.2014 24
JUnit: Testiluokka public class TestiLuokka { // yhteinen alustus @Before public void alusta() { } // yhteinen siivous @After public void siivoa() { } } // testitapaukset @Test public void testi1() { } @Test public void testi2() { } 1.9.2014 25
JUnit: Testitapaukset 1/2 @Test public void helppouri() throws Exception { String uri = "http://www.tut.fi"; Components result = resolver_.resolveuriref(uri); } assertequals("scheme", "http", result.scheme_); assertequals("host", "www.tut.fi", result.host_); assertequals("host type", HostType.REG_NAME, result.hosttype_); assertarrayequals("path", new String[0], result.path_); 1.9.2014 26
JUnit: Testitapaukset 2/2 // laittoman merkin pitäisi aiheuttaa poikkeus @Test(expected=MalformedUriException.class) public void testhostillegalchar() throws Exception { String uri = "http://no{allowed"; resolver_.resolveuriref(uri); } 1.9.2014 27
Eclipse Ohjelmistokehitysympäristö ennen kaikkea Javalle tuki monille muille kielille tarjolla pluginien avulla Käytössä tällä kurssilla testien kirjoittamiseen ja ajamiseen käyttö vapaaehtoista Käytettävissä Lintulassa tai asennettavissa omalle tietokoneelle Lintulassa kurssin käyttöön oma versio johon on asennettu valmiiksi EclEmma-kattavuusmittausplugin, löytyy polusta /share/ohjcourses/testaus/eclipse/eclipse Ohjeet käyttöön päätestaussuunnitelmasta Lisätietoja sivulta http://www.eclipse.org 1.9.2014 28
Vinkkejä Eclipsen käyttöön Osittain kirjoitetun nimen voi täydentää painamalla Ctrl-Space Metodin kuvauksen saa esiin painamalla sen kohdalla F2 Nimen määrittelyyn voi hypätä sen kohdalta painamalla F3 Koodiin voi lisätä breakpointteja editorin vasemman reunan popup-menusta Breakpointteihin pysähdytään ainoastaan suoritettaessa ohjelmaa debug-moodissa Editorin vasemman reunan virhe- tai varoitusikonia klikkaamalla saa esiin ehdotuksia korjaukseksi 1.9.2014 29