Testivetoinen ohjelmistokehitys

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

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

Luokan sisällä on lista

Ohjelmoinnin jatkokurssi, kurssikoe

Olio-ohjelmointi Javalla

Eclipse ja JUnit-ohjelmoijatestit

Ohjelmointi 2 / 2010 Välikoe / 26.3

1 Tehtävän kuvaus ja analysointi

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

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

JUnit ja EasyMock (TilaustenKäsittely)

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

Listarakenne (ArrayList-luokka)

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

Ohjelmistojen mallintaminen, syksy 2011, laskuharjoitus 2

Java kahdessa tunnissa. Jyry Suvilehto

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

Metodien tekeminen Javalla

Interaktiivinen tarinankerronta

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

9. Periytyminen Javassa 9.1

Ohjelmointi 2, välikoe

Ohjelmistotekniikan menetelmät, koe

Jypelin käyttöohjeet» Ruutukentän luominen

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

Javan perusteita. Janne Käki

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

Ohjelmoinnin perusteet Y Python

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmoinnin perusteet, kurssikoe

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

ITKP102 Ohjelmointi 1 (6 op)

Rajapinta (interface)

Test-Driven Development

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Ohjelmoinnin perusteet Y Python

Web Services tietokantaohjelmoinnin perusteet

Mainosankkuri.fi-palvelun käyttöohjeita

Luokat ja oliot. Ville Sundberg

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

Ohjelmointi 2 / 2011 Välikoe / 25.3

Java-kielen perusteita

Mikä yhteyssuhde on?

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet, syksy 2006

Automaattitilausten hallinta. Automaattitilauksien uudistettu käsittely

Sisältö. 2. Taulukot. Yleistä. Yleistä

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

1. Taustatietoa näppäimistönkuuntelusta

Ohjelmoinnin perusteet Y Python

Ohjelmistojen mallintaminen. Luento 11, 7.12.

Pedacode Pikaopas. Web-sovelluksen luominen

Tietorakenteet, laskuharjoitus 7,

C# Windows ohjelmointi perusopas

1. Omat operaatiot 1.1

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

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Sisältö. 22. Taulukot. Yleistä. Yleistä

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

OHJE 1 (14) Peruskoulun ensimmäiselle luokalle ilmoittautuminen Wilmassa

Eclipse, SVN ja HelloWorld

Ohjelmoinnin perusteet Y Python

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

Java-kielen perusteet

3.3 Kurssin palauttaminen

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

7. Oliot ja viitteet 7.1

Johdatus ohjelmointiin

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

Kirkkopalvelut Office365, Opiskelijan ohje 1 / 17 IT Juha Nalli

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Ohjelmoinnin perusteet Y Python

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

Webmailin käyttöohje. Ohjeen sisältö. Sähköpostin peruskäyttö. Lomavastaajan asettaminen sähköpostiin. Sähköpostin salasanan vaihtaminen

7. Näytölle tulostaminen 7.1

Ohjelmoinnin perusteet Y Python

Javan GUI Scratchaajalle

Automaattitilausten hallinta

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

Taulukot. Jukka Harju, Jukka Juslin

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

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Test-Driven Development

13. Loogiset operaatiot 13.1

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

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

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

9. Periytyminen Javassa 9.1

Ohjelmoinnin peruskurssi Y1

11. Javan valintarakenteet 11.1

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

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

Javan GUI Scratchaajalle

WCONDES OHJEET ITÄRASTEILLE (tehty Condes versiolle 8)

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Transkriptio:

Testivetoinen ohjelmistokehitys

Ohjelman luominen pienin askelin 1. Kirjoita testi, joka testaa ohjelmalle myöhemmin lisättävää toiminnallisuutta. 2. Suorita testi. Testin ei tule mennä läpi. Mikäli testi menee läpi, siirry kohtaan 1. 3. Kirjoita ohjelmaan testin läpäisemiseen tarvittava toiminnallisuus. 4. Suorita testit. 5. Refaktoroi. Mikäli testit eivät mene läpi, siirry kohtaan 3 ja täydennä toiminnallisuutta. Mikäli ohjelma on valmis, lopeta. Muuten, siirry kohtaan 1.

Ohjelman luominen pienin askelin 1. Kirjoita testi, joka testaa ohjelmalle myöhemmin lisättävää toiminnallisuutta. 2. Suorita testi. Testin ei tule mennä läpi. Mikäli testi menee läpi, siirry kohtaan 1. 3. Kirjoita ohjelmaan testin läpäisemiseen tarvittava toiminnallisuus. 4. Suorita testit. 5. Refaktoroi. Mikäli testit eivät mene läpi, siirry kohtaan 3 ja täydennä toiminnallisuutta. Mikäli ohjelma on valmis, lopeta. Muuten, siirry kohtaan 1. Refaktoroinnissa koodia siistitään säilyttäen samalla ohjelman toiminnallisuus. Siistiminen sisältää mm. luettavuuden parantamista sekä esimerkiksi ohjelman pilkkomista pienempiin metodeihin ja luokkiin.

alku Kirjoita testi Suorita testi Refaktoroi ohjelmaa Kirjoita tarvittu toiminnallisuus Suorita testit

Hyötyjä Pakottaa miettimään toiminnallisuutta ennen ohjelman koodausta. Johtaa ylläpidettävään rakenteeseen, sillä ohjelmaa tehdään pienissä osissa refaktoroiden. Lopputuotoksessa testit, jonka ansiosta ohjelman jatkokehitys helpompaa: muutoksen yhteydessä voi tarkastaa menikö aiempi toiminnallisuus rikki. Vähemmän bugeja tuotannossa.

Esimerkki: tehtävienhallinta

Osa 1. Projektin luominen ja JUnit-kirjaston käyttöönotto

Tarkastellaan testivetoista ohjelmistokehitystä tehtävien hallintaan tarkoitetun sovelluksen kannalta. Tehtävien hallintasovellukseen halutaan mahdollisuus tehtävien listaamiseen, lisäämiseen, tehdyksi merkkaamiseen sekä poistamiseen. Aloitetaan sovelluksen kehitys luomalla tyhjä projekti. Tämä tapahtuu valitsemalla NetBeansissa File -> New Project. Valitaan projektin kategoriaksi Maven ja projektin tyypiksi Java Application.

Tämän jälkeen täytetään uuden projektin tiedot. Asetetaan projektin nimeksi tehtavienhallinta. Projektin sijainti kertoo missä päin tiedostojärjestelmää projektin tiedostot sijaitsevat. Pidetään kohdassa Package-oleva kenttä tyhjänä.

Kun painamme Finish, uusi projekti on luotu. Projekti näkyy NetBeansissa vasemmalla laidalla.

Kun painamme Finish, uusi projekti on luotu. Projekti näkyy NetBeansissa vasemmalla laidalla. Lisätään seuraavaksi yksikkötestien kirjoittamiseen käytetty JUnit-kirjasto (tämä on valmiina TMC:stä ladattavissa tehtäväpohjissa). Klikataan kansio Project Files auki ja tuplaklikataan tiedostoa pom.xml. Tiedosto pom.xml kertoo projektimme rakenteesta sekä sen käyttämistä kirjastoista -- tähän tutustutaan tarkemmin Ohjelmoinnin jatkokurssilla.

Kopioidaan JUnit-kirjasto ennen riviä </project>: <dependencies> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> Kun yllä oleva sisältö on kopioitu pom.xml-tiedostoon (ennen riviä </project>), tallennetaan tiedosto. Tämä tuo ohjelman käyttöön JUnit-kirjaston ja mahdollistaa yksikkötestien kirjoittamisen.

Osa 2. Yksikkötestiluokan luominen

Luodaan ensimmäinen yksikkötesti. Yksikkötestien luominen onnistuu klikkaamalla projektia oikealla hiirennapilla ja valitsemalla new -> Other. Tämä avaa näkyville uuden tiedoston luomiseen käytetyn valikon. Valitse kategoriaksi Unit Tests ja luotavan tiedoston tyypiksi JUnit Test. Paina tämän jälkeen Next.

Eteen aukeaa yksikkötestitiedoston luomiseen käytettävä apuri. Asetetaan luokan nimeksi TehtavienhallintaTest ja valitaan ettei testiluokkaan tehdä koodia. Huom! Varmista, että luokan nimi päättyy sanalla Test. Paina lopulta Finish.

Nyt projektin kansioon Test Packages on ilmestynyt luokka TehtavienhallintaTest.

Osa 3. Ensimmäinen yksikkötesti

Luodaan ensimmäinen testi. Testissä määritellään luokka Tehtavienhallinta, ja oletetaan, että luokalla on metodi tehtavalista, joka palauttaa tehtävälistan. Testimetodi assertequals saa parametrinaan kaksi arvoa -- ensimmäinen on odotettu arvo ja toinen on ohjelman palauttama arvo. import static org.junit.assert.assertequals; import org.junit.test; public class TehtavienhallintaTest { @Test public void tehtavalistaalussatyhja() { Tehtavienhallinta hallinta = new Tehtavienhallinta(); assertequals(0, hallinta.tehtavalista().size()); Tässä metodia käytetään tehtävälistan koon tarkastamiseen uuden tehtävälistan luomisen yhteydessä: uuden listan tulee olla tyhjä.

Testi on luokassa TehtavienhallintaTest. Kun testi on luotu, nähdään suoraan ettei se mene läpi sillä testin testaama luokka Tehtavienhallinta puuttuu. Suoritetaan testit silti. Tämä tapahtuu klikkaamalla projektia hiiren oikealla napilla ja valitsemalla Test Näemme virheen Failed to execute

Osa 4. Yksikkötestin vaatimusten täyttävän toiminnallisuuden toteutus

Luodaan luokka Tehtavienhallinta (luokka lisätään kansioon Source Packages) ja lisätään luokalle listan palauttava metodi tehtavalista. import java.util.arraylist; public class Tehtavienhallinta { public ArrayList<String> tehtavalista() { return new ArrayList<>();

Suoritetaan projektiin liittyvät testit klikkaamalla projektia hiiren oikealla napilla ja valitsemalla Test Projektiin liittyvät testit menevät läpi. Refaktoroitavaa ei ole, joten jatkamme seuraavan testin kirjoitukseen.

Osa 5. Toinen yksikkötesti ja siihen liittyvän toiminnallisuuden toteutus

Seuraavaksi luomme uuden testin, jossa tarkastellaan tehtävien lisäämiseen liittyvää toiminnallisuutta. import static org.junit.assert.assertequals; import org.junit.test; public class TehtavienhallintaTest { Testissä määritellään luokalle Tehtavienhallinta metodi lisaa, joka lisää tehtävälistalle uuden tehtävän. Tehtävän lisäämisen onnistuminen tarkastetaan tehtavalista-metodin koon kasvamisen kautta. Testi ei toimi lainkaan, sillä luokasta Tehtavienhallinta puuttuu lisaa-metodi. @Test public void tehtavalistaalussatyhja() { Tehtavienhallinta hallinta = new Tehtavienhallinta(); assertequals(0, hallinta.tehtavalista().size()); @Test public void tehtavanlisaaminenkasvattaalistankokoayhdella() { Tehtavienhallinta hallinta = new Tehtavienhallinta(); hallinta.lisaa("kirjoita testi"); assertequals(1, hallinta.tehtavalista().size());

Lisätään luokkaan Tehtavienhallinta metodi lisaa ja suoritetaan testit. Metodi ei tässä vaiheessa tee vielä mitään. Alussa lisäämämme testi menee läpi, mutta edellä lisätty testi ei. Virheilmoitus on Failed: expected: <1> but was: <0> eli testi odotti arvoa 1 mutta sai arvon 0. import java.util.arraylist; public class Tehtavienhallinta { public ArrayList<String> tehtavalista() { return new ArrayList<>(); public void lisaa(string tehtava) {

Muokataan luokan tehtävänhallinta toiminnallisuutta siten, että luokalle luodaan oliomuuttujaksi tehtävät sisältävä lista. Muokataan metodin lisaa-toiminnallisuutta vain niin, että se läpäisee testin, mutta ei tee todellisuudessa haluttua asiaa. Suoritetaan testit -- testit menevät läpi, joten voimme siirtyä seuraavan testin kirjoittamiseen. import java.util.arraylist; public class Tehtavienhallinta { private ArrayList<String> tehtavat; public Tehtavienhallinta() { this.tehtavat = new ArrayList<>(); public ArrayList<String> tehtavalista() { return this.tehtavat; public void lisaa(string tehtava) { this.tehtavat.add("uusi");

Osa 6. Kolmas yksikkötesti ja siihen liittyvän toiminnallisuuden toteutus

Täydennetään testejä siten, että ne vaativat, että lisätyn tehtävän tulee olla listalla. JUnit-kirjaston tarjoama metodi asserttrue vaatii, että sille parametrina annettu lauseke saa lopulta arvon true. Kun ohjelmaan on lisätty uusi testi, testit eivät taaskaan mene läpi. import static org.junit.assert.assertequals; import static org.junit.assert.asserttrue; import org.junit.test; public class TehtavienhallintaTest { @Test public void tehtavalistaalussatyhja() { Tehtavienhallinta hallinta = new Tehtavienhallinta(); assertequals(0, hallinta.tehtavalista().size()); @Test public void tehtavanlisaaminenkasvattaalistankokoayhdella() { Tehtavienhallinta hallinta = new Tehtavienhallinta(); hallinta.lisaa("kirjoita testi"); assertequals(1, hallinta.tehtavalista().size()); @Test public void lisattytehtavaloytyytehtavalistalta() { Tehtavienhallinta hallinta = new Tehtavienhallinta(); hallinta.lisaa("kirjoita testi"); asserttrue(hallinta.tehtavalista().contains("kirjoita testi"));

Noheva ohjelmoija muokkaisi luokan Tehtavienhallinta toimintaa siten, että metodissa lisaa lisättäisiin listalle aina merkkijono "Kirjoita testi". import java.util.arraylist; public class Tehtavienhallinta { Tämä johtaisi tilanteeseen, missä testit menisivät läpi, mutta sovellus ei vieläkään tarjoaisi toimivaa tehtävien lisäämistoiminnallisuutta. Muokataan luokkaa Tehtavienhallinta siten, että lisättävä tehtävä lisätään tehtävälistalle. private ArrayList<String> tehtavat; public Tehtavienhallinta() { this.tehtavat = new ArrayList<>(); public ArrayList<String> tehtavalista() { return this.tehtavat; public void lisaa(string tehtava) { this.tehtavat.add(tehtava);

Huomaamme, että testiluokassa on toistoa -- hyvä hetki refaktoroinnille. Siirretään Tehtavienhallinta testiluokan oliomuuttujaksi, ja alustetaan se jokaisen testin alussa. Muuttujan alustaminen onnistuu luomalla testiluokkaan metodi alusta, missä muuttuja(t) alustetaan. Metodille alusta annetaan annotaatio @Before, joka määrää että metodi suoritetaan ennen kunkin testimetodin suoritusta. Testit menevät läpi refaktoroinnin jälkeenkin. import static org.junit.assert.assertequals; import static org.junit.assert.asserttrue; import org.junit.test; public class TehtavienhallintaTest { @Test public void tehtavalistaalussatyhja() { Tehtavienhallinta hallinta = new Tehtavienhallinta(); assertequals(0, hallinta.tehtavalista().size()); @Test public void tehtavanlisaaminenkasvattaalistankokoayhdella() { Tehtavienhallinta hallinta = new Tehtavienhallinta(); hallinta.lisaa("kirjoita testi"); assertequals(1, hallinta.tehtavalista().size()); @Test public void lisattytehtavaloytyytehtavalistalta() { Tehtavienhallinta hallinta = new Tehtavienhallinta(); hallinta.lisaa("kirjoita testi"); asserttrue(hallinta.tehtavalista().contains("kirjoita testi"));

Osa 7. Neljäs yksikkötesti ja siihen liittyvän toiminnallisuuden toteutus

Lisätään toiminnallisuus tehtävän tehdyksi merkkaamiseen. Kun ohjelmaan on lisätty uusi testi, testit eivät taaskaan mene läpi. //... @Test public void tehtavanvoimerkatatehdyksi() { hallinta.lisaa("uusi tehtävä"); hallinta.merkkaatehdyksi("uusi tehtävä"); asserttrue(hallinta.ontehty("uusi tehtävä")); //...

Toiminnallisuutta varten tulee lisätä luokkaan Tehtavienhallinta metodit merkkaatehdyksi ja ontehty. Testit eivät tarkasta metodien toimintaa tarkemmin, joten lisätään toiminnallisuus aluksi hyvin kevyenä. //... public void merkkaatehdyksi(string tehtava) { public boolean ontehty(string tehtava) { return true; //... Testit menevät läpi.

Osa 8. Viides yksikkötesti ja siihen liittyvän toiminnallisuuden toteutus

Olemme tähän mennessä tarkistaneet, että haluttu toiminnallisuus on olemassa, mutta emme ole juurikaan tarkastaneet epätoivotun toiminnan poissaoloa. Mikäli testejä kirjoitettaessa keskitytään halutun toiminnallisuuden olemassaoloon, testit saattavat jäädä ohjelman toiminnallisuutta hyvin vähän tarkastelevaksi. //... @Test public void tehdyksimerkkaamatoneioletehty() { hallinta.lisaa("uusi tehtava"); hallinta.merkkaatehdyksi("uusi tehtava"); assertfalse(hallinta.ontehty("joku tehtava")); //... Kirjoitetaan seuraavaksi testi, joka tarkastaa, että tehdyksi merkkaamaton testi ei ole tehty. Testit eivät mene läpi.

import java.util.arraylist; Toteutetaan taas testit täyttävä toiminnallisuus. Joudumme tekemään hieman isomman muutoksen ohjelmaan: lisätään luokkaan erillinen lista tehtäville, jotka on merkattu tehdyiksi. public class Tehtavienhallinta { private ArrayList<String> tehtavat; private ArrayList<String> tehdyttehtavat; public Tehtavienhallinta() { this.tehtavat = new ArrayList<>(); this.tehdyttehtavat = new ArrayList<>(); Testit menevät taas läpi. Sovelluksessa on kuitenkin muutamia kysymysmerkkejä. Pitäisikö tehtävälistauksessa palautetut tehtävät merkitä jollain tavalla tehdyksi? Voiko tehtävän, joka ei ole tehtävälistalla tosiaankin merkata tehdyksi? public List<String> tehtavalista() { return this.tehtavat; public void lisaa(string tehtava) { this.tehtavat.add(tehtava); public void merkkaatehdyksi(string tehtava) { this.tehdyttehtavat.add(tehtava); public boolean ontehty(string tehtava) { return this.tehdyttehtavat.contains(tehtava);

Tehdään ensimmäinen hieman laajempi ohjelman sisäisen rakenteen korjaus. Tehtävä on selkeästi käsite, joten sille kannattanee luoda oma erillinen luokka. Luodaan luokka Tehtava. Luokalla Tehtava on nimi sekä tieto siitä, onko tehtävä tehty. public class Tehtava { private String nimi; private boolean tehty; public Tehtava(String nimi) { this.nimi = nimi; this.tehty = false; public String getnimi() { return nimi; public void settehty(boolean tehty) { this.tehty = tehty; public boolean ontehty() { return tehty;

import java.util.arraylist; public class Tehtavienhallinta { Muokataan tämän jälkeen luokan Tehtavienhallinta rakennetta siten, että luokka tallentaa tehtävät merkkijonojen sijaan Tehtava-olioina. Huomaa, että luokan metodien määrittelyt eivät muutu, mutta niiden sisäinen toteutus muuttuu. Vaikka tehty muutos muutti luokan Tehtavienhallinta sisäistä toimintaa merkittävästi, testit toimivat yhä. Testivetoinen ohjelmistokehitys jatkuisi samalla tavalla kunnes toivottu perustoiminnallisuus olisi paikallaan private ArrayList<Tehtava> tehtavat; public Tehtavienhallinta() { this.tehtavat = new ArrayList<>(); public ArrayList<String> tehtavalista() { ArrayList<String> palautettavat = new ArrayList<>(); for (Tehtava tehtava: tehtavat) { palautettavat.add(tehtava.getnimi()); return palautettavat; public void lisaa(string tehtava) { this.tehtavat.add(new Tehtava(tehtava)); public void merkkaatehdyksi(string tehdyksimerkattavatehtava) { for (Tehtava tehtava: tehtavat) { if (tehtava.getnimi().equals(tehdyksimerkattavatehtava)) { tehtava.settehty(true); public boolean ontehty(string tarkistettavatehtava) { for (Tehtava tehtava: tehtavat) { if (tehtava.getnimi().equals(tarkistettavatehtava)) { return tehtava.ontehty(); return false;

Yhteenveto Testivetoisessa ohjelmistokehitysmenetelmässä ohjelman toiminnallisuus rakennetaan pieninä askelina siten, että ohjelmoija kirjoittaa aina ensin uutta toiminnallisuutta tarkastelevan testin, jota seuraa testin läpäisevän ohjelmakoodin kirjoitus.