četvrtak, 26 decembra, 2024
Kako da...?

Unit tests i JUnit

Autor: Dejan Čugalj

Komparacijom industrijske revolucije izazvane parnom mašinom 18. veka (1781, James Watt) i informacionih tehnologija 20. i 21. veka primećujemo bitnu razliku. Neke od osnovnih su neopipljivost i apstrakcija 21. veka – virtuelizacija i cloud. Iako po pitanju energetske skalabilnosti, upotrebe i iskorišćenja nismo daleko odmakli, kako kaže Michio Kaku, „od TIP*0 civilizacije”, (https://www.youtube.com/watch?v=JdILmgJGuvw), nekako se može videti ta strukturna razlika napredaka u samoj informacionoj tehnologiji.

Iako postoji razlika, problemi isplivavaju sami po sebi. Trenutna situacija u IT-ju je ta da vlada potpuni raskol, nesrazmera u razvoju hardvera i softvera koji bi trebalo da ga prati. Naime, hardver je toliko napredovao da softver nikako ne može da isprati taj eksponencijalni razvoj hardverskih komponenti, tako da su programeri došli na „metu”, i to sagledavajući kroz filozofsku prizmu, stiče se utisak kao da ljudski rod još uvek nije spreman na tako nagli razvoj.

Da bude još gore, uvideli smo još veći problem koji se odnosi na količinu podataka napravljenih u jedinici vremena, globalno gledajući. Nekako kao da smo ostali sami, nepripremljeni za sve što možemo da stvorimo. Svi ti podaci koji čekaju na obradu i koji nisu procesuirani, moraju da prođu kroz neku vrstu algoritma i da budu obrađeni, svrstani i postavljeni zavisno od važnosti u neki cloud ili medijum za skladištenje. Upravo ti algoritmi su od izuzetne važnosti jer jedan pogrešan parametar prosleđen algoritmu može da prouzrokuje totalno neočekivane rezultate gde bi krajnji rezultat bio skladištenje nekih medicinskih informacija u npr. katastar za zemljište.

Sa programerske tačke gledišta i tačke gde čovek kao individua ima udela u celom sistemu, greške su neminovne, jer ipak smo samo ljudi, a poznato je svima da svaki čovek greši dok računar sledi instrukcije dobijene upravo od istih, tih „koji greše”. Programerska borba protiv ovih tipova grešaka vodi se od samog početka, početka komuniciranja sa računarom, od prvih programskih jezika (1842-1843, Ada Lovelace). Jedna od danas najviše korišćenih tehnika za proveru i najzastupljenijih jeste Unit testing, a pošto ćemo primer implementirati u Java programskom jeziku, koristićemo JUnit.

Unit Testing

 

To je deo kôda, namenski napisan od strane programera, koji izvršava specifičan deo aplikacije i proverava dobijeni (vraćeni) rezultat sa sigurno očekivanim podacima ili ponašanjem.( http://www.vogella.com/tutorials/JUnit/article.html)

Laički rečeno, tokom razvoja aplikacije, jedna od osnovnih stvari je da se sa vremena na vreme napisani kôd prevodi u mašinski kôd, izvršava i proverava očekivan rezultat. Ovakvo testiranje je uglavnom i dovoljno, jer se greške odmah mogu uvideti i mnogi programeri upravo to i rade. Iako ova metoda uzima dosta vremena, pogotovo ako se radi o razvoju modula neke aplikacije koja ima veze sa bazom podataka, napišete query, pokrenete, proverite bazu i proverite da li je upisan takozvani „hard coded” podatak, pa nastavite. Međutim, zamislite situaciju da svako prevođenje na mašinski jezik nekog modula koji razvijate, traje i po nekoliko sati, kakav bi vaš učinak bio u nekoj kompaniji (prim.aut.)?

Ukoliko iole razmišljate na duže staze i vidite sebe kao programera koji radi na nekim većim projektima, trebalo bi da nas ispratite do kraja. U većim softverskim kompanijama testiranje je jedan od krucijalnih delova razvoja određenog softvera. Neki ga vole, a neki ne, to je činjenica, a dok određeni deo napisane aplikacije ne prođe testove, koji opet neki drugi tim sprovodi, napisani modul ne može nikako da uđe u produkciono okruženje, ma koliko on bio dobro implementiran.

JUnit

 

Kent Beck i Erich Gamma uvideli su ovu važnost i napisali su open source framework 1997. godine za Java-u poznat kao JUnit. Važnost spomenutih imena ne bismo ovde „proširivali”, dok više informacija o JUnitframework-u možete naći na adresi: (http://www.junit.org). JUnit je objavljen pod IBM’s Common Public License Version 1.0 i postavljen je na GitHub repozitorijum. Ubrzo nakon objavljivanja postaje standard za skoro sve jezike pod nazivom xUnit i podržava: ASP, C++, C#, Eiffel, Delphi, Perl, PHP, Python, REBOL, Smalltalk i Visual Basic.

Ne ulazeći u „dubinu” mogućnosti ovog framework-a, primer testiranja ćemo pokazati malim Java primerom. Testiranje se implementira anotacijom određene metode, klase i potpuno je zaseban pod-modul-aplikativno izvršni program. Zamislimo da imamo prostu klasu CalculatorTest i u njoj metodu sabiranja:

publicclass Calculator {publicdouble add(double number1, double number2){return number1 + number2;}}

Testiranje JUnit framework-om :

importstatic org.junit.Assert.*;importorg.junit.Test;   publicclass CalculatorTest { @Test publicvoid testAdd(){ Calculator calculator =new Calculator();double result = calculator.add(10, 50); assertEquals(60, result, 0);}}

Možda ovo trenutno ne izgleda kao neka velika pomoć, međutim, razvojem aplikacije i sve većim brojem implementiranih modula, ovo je od krucijalne važnosti kako za tim, tako i za individualne programere.

Korisni linkovi: