Yksikkötestaus on ohjelmistokehityksen menetelmä, jossa testataan ohjelman yksittäisiä osia eli "yksiköitä". Yksikkö voi olla esimerkiksi funktio, metodi tai luokka. Tavoitteena on varmistaa, että jokainen yksikkö toimii odotetulla tavalla erikseen, ennen kuin ne yhdistetään laajempaan järjestelmään.
Yksikkötestauksen ytimessä on ajatus siitä, että jokainen testattava yksikkö tulisi eristää muista järjestelmän osista. Tämä tarkoittaa sitä, että yksikkö testataan vain sen omilla lähtöarvoilla ja odotetuilla lopputuloksilla ilman riippuvuuksia ulkoisiin järjestelmiin, kuten tietokantoihin tai käyttöliittymiin.
Yksikkötestit määritellään usein etukäteen käyttämällä testikehyksiä, kuten JUnit (Java), QTest (Qt/C++) tai unittest (Python). Testit koostuvat tyypillisesti seuraavista vaiheista:
Yksikkötestaus tarjoaa monia hyötyjä, kuten parannetun koodin laadun, helpomman virheenkorjauksen ja jatkuvan integraation edistämisen. Yksikkötestauksen haasteena voi olla kuitenkin kattavien testien kirjoittaminen ja ylläpito, erityisesti suurissa projekteissa.
Yksikkötestaus on keskeinen osa Test Driven Development (TDD) -prosessia, jossa testit kirjoitetaan ennen varsinaista koodia. TDD auttaa kehittäjiä suunnittelemaan ja kirjoittamaan selkeämpää, virheettömämpää koodia.
Seuraavassa on muutamia suosittuja yksikkötestauskehyksiä C++-koodille:
Google Test on laajasti käytetty ja hyvin dokumentoitu kehys, joka tarjoaa monipuoliset ominaisuudet yksikkötestaukseen ja testitapauksien suorittamiseen. Se tukee myös testien ryhmittelyä ja väitteiden (asserts) käyttöä.
Catch2 on yksinkertainen ja moderni testauskehys, joka keskittyy siihen, että testien kirjoittaminen olisi mahdollisimman helppoa. Catch2 on tunnettu yksirivisistä testitapauksista ja mukautuvista makroista.
Boost.Test on osa Boost-kirjastoa ja se tarjoaa monipuoliset työkalut C++-koodin testaamiseen. Boost.Test on erityisen hyödyllinen, jos projekti käyttää jo Boost-kirjastoa.
Qt Test on osa Qt-kehystä ja se on erityisen hyödyllinen Qt-sovellusten yksikkötestauksessa. Se integroituu hyvin Qt:n signaali- ja slot-järjestelmään, ja sitä käytetään yleensä Qt-käyttöliittymien ja logiikan testaukseen.
Tein esimerkin, jossa loin yksikkötestin käyttäen QTest-frameworkkiä. Esimerkin koodi löytyy GitHubista https://github.com/olio-kurssi/unit_test ja sen esittelyvideo https://youtu.be/fpifiuiG_VM
Nämä kehykset tarjoavat eritasoisia ominaisuuksia riippuen projektin koosta ja tarpeista.