Yksikkötestaus (unit testing)

Yksikkötestien tarkoitus on varmistaa, että ohjelmointikoodi tekee haluamasi asiat. Jos ohjelmointikoodia muutetaan, voidaan yksikkötestin perusteella todentaa, että koodi toimii vielä muutoksienkin jälkeen kuten on tarkoitus. Yksikkötestauksen tarkoitus ei ole pelkästään löytää ohjelmointivirheitä eli bugeja, vaan tarkoitus on myös saavuttaa laadukkaampaa koodia. Parhaassa tapauksessa valtavat koodirimpsut muuttuvat yksikkötestauksen myötä pienempiin kokonaisuuksiin (unit), jotta niitä on helpompi testata (unit testing). Näin ollen myös koko projektin ohjelmointi paranee kokonaisuutena.

Visual Studiossa testitapauksia kirjoitettaessa ja itse testejä ajattaessa ohjelmoija saa välittömästi palautteen koodin toimivuudesta. Testitapauksia kirjoitettaessa ohjelmoija joutuu miettimään miten toimintojen pitäisi toimia, jotta osaa testata niitä myös oikein. Tällöin omaa ohjelmointia joutuu oikeasti miettimään.

Testauksen myötä ohjelmoija voi siis myös kehittyä!

Visual Studio ja testaus

Visual Studiosta löytyy erillinen Test Explorer -työkalu, joka tarjoaa joustavan ja tehokkaan tavan kirjoittaa ja suorittaa yksikkötestejä. Yksikkötestien tulokset voidaan käsitellä erilaisten raporttien kautta. (kuvakaappaus). Yksikkötestaukseen liittyvä projekti on varsinaiseen projektiin nähden erillinen projekti, joka voidaan tehdä käsin testitapauksia myöten, tai sitten se voidaan generoida jo valmiista koodista. Hyvä tyyli on aina uuden toiminnallisuuden lisäämisen jälkeen toteuttaa toiminnolle myös testaus.

Opintojakson tavoitteet

Käsitteenä ja kokonaisuutena testaaminen on erittäin iso juttu. Tällä opintojaksolla keskitytään siihen, että jokainen osaa kirjoittaa testitapauksia ja suorittaa oman ohjelmointikoodinsa testaamista Visual Studiosta käsin. JAMK/IT tarjoaa eri opintojaksoja, joissa testaamiseen paneudutaan syvällisemmin.

Esimerkki: laskukone

Toteutetaan pienimuotoinen laskin, joka osaa plus- ja kertolaskuja.

ICalculator-rajapinta

Toteutetaan ensin ICalculator-rajapinta, joka määrittelee laskimen toiminnot.



    

Calculator-luokka

Toteutetaan seuraavaksi Calculator-luokka, joka toteuttaa ICalculator-rajapinnan määräämät Add- ja Multiply-metodit.


    

Tässä vaiheessa tarkkasilmäisimmät ovat varmaan huomanneet, että ohjelmoija on kopioinut Multiple-metodin Add-metodista ja unohtanut muuttaa laskutoimituksen rivillä 10. Tässä vaiheessa virhe on tarkoitus jättää ohjelmointikoodiin ja testauksen kautta löytää tämä virhe ja korjata.

Calculator-luokan testaaminen

Testiprojektin luominen

Nyt laskimen toiminnot on tehty valmiiksi ja on aika aloittaa laskimen testaaminen. Projektin sisältämään solutioniin täytyy tehdä uusi Unit Testing -projekti ja määrittää sieltä referenssi varsinaiseen projektiin, jotta testaus onnistuu. Tämä voidaan tehdä uuden projektin valinnan kautta tai yksinkertaisesti valitsemalla halutun luokan näkymästä oikealla hiiren painikkeella "Create Unit Tests".

announcement Älä valitse metodien sisältä, vaan niiden ulkopuolelta, jotta luokan kaikista metodeista tehdään testitapaukset testiprojektiin. Myöhemmin uudet toteutetut metodit voidaan erikseen lisätä testiprojektiin valitsemalla lisäys metodin sisältä.
announcement Lisättävä luokka ja metodit täytyy määritellä julkiseksi eli public.

Tämän jälkeen avautuu testiprojektiin liittyvä dialogi, josta voidaan nimetä luotava projekti ja yksikkötestit. Tässä vaiheessa voidaan hyväksyä oletusasetukset ja klikata OK-painiketta.

Tämän jälkeen projektin solutioniin generoituu uusi yksikkötesti-projekti, jolla voidaan testata varsinaisen projektin sisältämien luokkien toimintoja. Oletuksena testiprojektin nimeen on lisätty varsinaisen projektin nimi + "Tests". Calculator-luokkaa testaava metodi on nimetty CalculatorTests-metodiksi ja testimetodeina löytyvät laskimen Add- ja Multiply-metodit "Test"-päätteisinä. Tässä vaiheessa metodit ovat vielä tyhjiä ja odottavat testitapausten ohjelmointia.


    

Testien kirjoittaminen

Testien kirjoittamisessa käytetään ns. AAA-mallia:

Toteutetaan alla olevan ohjelmoinnin mukaiset testitapaukset CalculatorTest-luokan AddTest- ja MultiplyTest-metodeille. Huomaa, kuinka peruslaskutoimituksille määritellään käytettävät muuttujat ja odotetut tulokset. Kutsutaan testattavaa metodia ja vertaillaan palautettua tulosta odotettuun.


    

Testien suorittaminen

Tämän jälkeen olemme valmiit suorittamaan testauksen. Visual Studiossa on useita eri reittejä/valintoja, joista testit voidaan suorittaa. Tässä vaiheessa Test Explorer ei ole oletuksena näkyvissä, eikä vielä yhtään testikertaa ole suoritettu. Yksi helpoimmista tavoista on valita esim. testinäkymän ohjelmointikoodi hiiren oikealla painikkeella ja valita "Run Tests". Valinta on yhtä tarkka kuin testien generoiminenkin, eli valitse metodien ulkopuolelta, mutta kuitenkin luokan sisältä, jos haluat testata kaikkia metodeja.

Testitulokset

Visual Studio kääntää testiprojektin ja suorittaa määritellyt yksikkötestaukset. Tulokset ovat nähtävissä Test Explorerissa ja itse testauskoodissa. (kuvakaappaus). Tuloksista nähdään, että Add-metodi toimii oikein, mutta Multiply-metodissa on virhe. Metodi palauttaa testiarvoilla tuloksen 12, vaikka oikea tulos olisi 35.

Virheen korjaaminen

Nyt on tiedossa, että Calculator-luokan Multiply-metodi toimii virheellisesti. Avaa ohjelmointikoodi ja tutki sitä. Huomaa, että Add-metodin toteutukseen on vahingossa kopioinut myös Multiply-metodin laskutoimitus (yhteenlasku).

Korjaa virhe ja tallenna Calculator-luokka.


    

Uudelleen testaaminen

Testi voidaan uusia ajamalla testit uudelleen tai ajamalla vain haluttu testi Test Explorerin tai koodinäkymän kautta, klikkaamalla hiirellä metodin yläpuolella näkyvää punaista ruksia.

Virheet korjattu

Tässä vaiheessa kaikki virheet tulisi olla korjattu Calculator-luokasta.

Yhteenveto

Ohjelmointikoodin testaaminen on erittäin tärkeää, jatta virheitä ei pääse jäämään toteutettuihin ratkaisuihin. Edellä esitetty demo on yksinkertainen ja tälläkin saralla on vielä paljon itsenäistä oppimista ja kehittymistä. Alla on linkkejä testaukseen liittyvään materiaaliin - kannattaa tutustua!

Lisätietoa

Unit Test Basics
Create and run unit tests for a Store app in Visual Studio
Walkthrough: Creating and Running Unit Tests for Managed Code
Top 12 Reasons to Write Unit Tests