Testivetoinen kehittäminen tuo laatua ja vakautta

Julkaistu 5.11.2020 | Päivitetty 4.11.2022

Testivetoinen kehittäminen mahdollistaa uusien ohjelmistojen toteuttamisen ja tuomisen markkinoille nopealla tahdilla. Joskus, etenkin laajempien projektien kohdalla ja resurssien ollessa rajallisia, voi kuitenkin ilmaantua houkutusta tiivistää joistain ohjelmistokehityksen kannalta tärkeistä työvaiheista. 

Laadukkaaseen ohjelmistokehitykseen sisältyy monta oleellista vaihetta, joilla turvataan onnistunut lopputulos (ks. myös Onnistuneen ohjelmistoprojektin elementit). Yksi näistä ohjelmistokehityksen vaiheista on ohjelmiston testaaminen, joka tulee toteuttaa huolella. On äärimmäisen tärkeää estää mm. toimimattomien lopputuotteiden päätyminen loppukäyttäjien ihmeteltäväksi!

Me haluamme, että asiakkaidemme panostus ohjelmistopalveluihin kestää aikaa ja vastaa myös tulevaisuuden tarpeisiin. Tässä blogitekstissä korostamme testauksen merkitystä ja käsittelemme erityisesti testivetoista kehittämistä. Testivetoisen kehittämisen etuja ovat mm. toiminnallisuuksien vakaus ja lopputuotteen hyvä laatu.

Testivetoiseen kehittämiseen kannattaa tutustua, vaikkei aihe olisi itselle juuri nyt ajankohtainen: testivetoinen kehittäminen (engl. Test-driven development, TDD) on yksi ohjelmistokehityksen suosituista nk. Extreme Programming (XP) -menetelmistä ja noudattaa myös ketterän ohjelmistokehityksen teemoja.

Testivetoisen kehittämisen eteneminen

Testivetoinen kehittäminen
Kuva1. Toiminnallisuuden toteuttaminen testivetoisen kehittämisen avulla (nk. red-green-refactor pattern. Lähde). Testivetoisessa kehittämisessä työskennellään yksi toiminnallisuus kerrallaan.

Testivetoinen kehitys alkaa toiminnallisuutta testaavan testin kirjoittamisella, joten ulkopuolisen mielestä kehittäjien työ voi alkuvaiheessa näyttää käynnistyvän hitaasti ja väärästä suunnasta. Kehittäminen noudattaa silti selkeää kolmivaiheista prosessia, joka etenee systemaattisesti:

  1. Kirjoitetaan testi, joka testaa toiminnallisuutta: uusi toiminnallisuus kirjoitetaan ensin niin, että sen toimintaa testaava testi ei mene läpi. Näin varmistetaan, että testi ei ole virheellinen ja läpäise itseään automaattisesti. 
  2. Kirjoitetaan toiminnallisuus, joka läpäisee testin.
  3. Testin läpäissyt koodi siistitään eli refraktoroidaan ja testataan hyväksytysti.

Testivetoisessa kehittämisessä aikaa ei käytetä liioiteltuun testaamiseen, eli testejä ei tehdä turhaan tai ilman huolellista harkintaa. Siksi onkin tärkeää valita ja kirjoittaa työn alla oleviin toiminnallisuuksiin parhaiten soveltuvat sekä oikeisiin asioihin keskittyvät testitapaukset.

Hyväksymiskriteereillä on väliä

Ohjelmiston ja sen toiminnallisuuksien hyväksymiskriteerit ohjaavat testien rakentamista ja testivetoisen kehittämisen työnkulkua. Hyväksymiskriteereitä kerätään talteen ohjelmiston vaatimusmäärittelyistä, käyttäjätarinoista ja laatumittareista, jotka on mietitty projektin sidosryhmien välisellä yhteistyöllä.

Hyväksytyllä testillä voidaan osoittaa, että ohjelmisto täyttää sille asetetut vaatimukset ja on asiakkaan odotusten mukainen. Yksiselitteiset ja selkeät hyväksymiskriteerit helpottavat myös projektin etenemisen seurantaa ja sisäistä viestintää niin tilaajan kuin kehittäjänkin näkökulmasta.

Testivetoinen kehittäminen laajoissa ohjelmistoprojekteissa

Testivetoinen kehittäminen tukee erityisesti pitkäkestoista työskentelyä ja laajempia asiakasprojekteja. Koodin sisäisellä laadunvarmistuksella luodaan vahvat perustukset myöhempää kehittämistä silmällä pitäen. Näin asiakkaamme monipuolisesta ohjelmistosta rakentuu helpommin laajennettava ja ylläpidettävä.

Esimerkiksi uusia ominaisuuksia voidaan lisätä turvallisin mielin, koska uutuuttaan kiiltävää koodia rakennetaan vain valmiille, testatulle koodipohjalle. Lisätyt toiminnallisuudet eivät myöskään pääse tuomaan mukanaan bugeja tai rikkomaan aiempia osia toteutuksesta. Mahdolliset virheet on helpompi jäljittää ja korjata hyvissä ajoin. 

Testivetoisesti kehitetyn ohjelmiston ylläpito on usein helpompaa, kuin jälkikäteen testattujen tuotteiden kanssa. Ohjelmiston jatkuva testaaminen takaa laadukkaan ja vakaan perustan, jolla laajempikin ohjelmisto toimii moitteetta ja mukautuu käyttäjien muuttuviin tarpeisiin myös tulevaisuudessa. 

Testivetoinen kehittäminen sopii siis erityisesti laajoihin ja pitkäkestoisiin ohjelmistoprojekteihin, joiden elinkaaren aikana koodin parissa työskentelee useita kehittäjiä. Sen sijaan esimerkiksi pilotointivaiheessa ja erilaisten MVP-versioiden (ks. myös Matkalla ideasta ohjelmistoksi) kanssa on usein hyvä ottaa käyttöön jokin nopeampaa kehittämistä tukeva menetelmä.

Laadunvarmistus helpottaa ylläpitoa

Onnistuneen ohjelmistoprojektin tulos on toimiva ja käyttäjien tarpeita vastaava digitaalinen tuote tai palvelu, josta on iloa ja hyötyä pitkällä aikavälillä. Kertakäyttöinen, “kunhan nyt vaan toimii” -teemalla rakennettu ohjelmiston koodipohja on testivetoisesta näkökulmasta katsottuna menneen ajan haamu, jonka jatkokehittäminen ja ylläpito saattavat viedä tarpeettoman paljon resursseja myös asiakkaalta. 

Testivetoinen kehittäminen on laadunvarmistusta parhaimmillaan. Kun testit ja toiminnallisuudet kirjoitetaan vaatimusten mukaan ja hyvät testausrutiinit ovat kehittäjien hallussa, säilyy kehittämistyön tehokkuus parhaalla mahdollisella tasolla projektin kestosta ja laajuudesta riippumatta.

Laatuvarmistetun koodin tekeminen muistuttaa rahan laittamista pankkiin: alkusijoituksen merkitys tulee näkyväksi ajan myötä. Vaikka testivetoisen kehityksen omaksumiseen saattaa kulua kehitystiimiltä aikaa ja se vaatii projektitiimiltä vankempaa sitoutumista, on lopputuloksena luotettava, selkeä ja johdonmukainen toteutus. Eli ohjelmisto, josta asiakkaamme voi olla ylpeä.

Blogitekstin apuna käytimme soveltuvin osin seuraavia lähteitä:

https://builttoadapt.io/why-tdd-489fdcdda05e

https://ohjelmistotuotanto-hy.github.io/osa3/

Jätä yhteydenottopyyntö