петак, 19 априла, 2024
Како да...?

Unit tests и JUnit

Аутор: Дејан Чугаљ

Компарацијом индустријске револуције изазване парном машином 18. века (1781, James Watt) и информационих технологија 20. и 21. века примећујемо битну разлику. Неке од основних су неопипљивост и апстракција 21. века – виртуелизација и cloud. Иако по питању енергетске скалабилности, употребе и искоришћења нисмо далеко одмакли, како каже Michio Kaku, „од ТИП*0 цивилизације”, (https://www.youtube.com/watch?v=JdILmgJGuvw), некако се може видети та структурна разлика напредака у самој информационој технологији.

Иако постоји разлика, проблеми испливавају сами по себи. Тренутна ситуација у IT-ју је та да влада потпуни раскол, несразмера у развоју хардвера и софтвера који би требало да га прати. Наиме, хардвер је толико напредовао да софтвер никако не може да испрати тај експоненцијални развој хардверских компоненти, тако да су програмери дошли на „мету”, и то сагледавајући кроз филозофску призму, стиче се утисак као да људски род још увек није спреман на тако нагли развој.

Да буде још горе, увидели смо још већи проблем који се односи на количину података направљених у јединици времена, глобално гледајући. Некако као да смо остали сами, неприпремљени за све што можемо да створимо. Сви ти подаци који чекају на обраду и који нису процесуирани, морају да прођу кроз неку врсту алгоритма и да буду обрађени, сврстани и постављени зависно од важности у неки cloud или медијум за складиштење. Управо ти алгоритми су од изузетне важности јер један погрешан параметар прослеђен алгоритму може да проузрокује тотално неочекиване резултате где би крајњи резултат био складиштење неких медицинских информација у нпр. катастар за земљиште.

Са програмерске тачке гледишта и тачке где човек као индивидуа има удела у целом систему, грешке су неминовне, јер ипак смо само људи, а познато је свима да сваки човек греши док рачунар следи инструкције добијене управо од истих, тих „који греше”. Програмерска борба против ових типова грешака води се од самог почетка, почетка комуницирања са рачунаром, од првих програмских језика (1842-1843, Ada Lovelace). Једна од данас највише коришћених техника за проверу и најзаступљенијих јесте Unit testing, а пошто ћемо пример имплементирати у Java програмском језику, користићемо JUnit.

Unit Testing

 

То је део кôда, наменски написан од стране програмера, који извршава специфичан део апликације и проверава добијени (враћени) резултат са сигурно очекиваним подацима или понашањем.( http://www.vogella.com/tutorials/JUnit/article.html)

Лаички речено, током развоја апликације, једна од основних ствари је да се са времена на време написани кôд преводи у машински кôд, извршава и проверава очекиван резултат. Овакво тестирање је углавном и довољно, јер се грешке одмах могу увидети и многи програмери управо то и раде. Иако ова метода узима доста времена, поготово ако се ради о развоју модула неке апликације која има везе са базом података, напишете query, покренете, проверите базу и проверите да ли је уписан такозвани „hard coded” податак, па наставите. Међутим, замислите ситуацију да свако превођење на машински језик неког модула који развијате, траје и по неколико сати, какав би ваш учинак био у некој компанији (прим.аут.)?

Уколико иоле размишљате на дуже стазе и видите себе као програмера који ради на неким већим пројектима, требало би да нас испратите до краја. У већим софтверским компанијама тестирање је један од круцијалних делова развоја одређеног софтвера. Неки га воле, а неки не, то је чињеница, а док одређени део написане апликације не прође тестове, који опет неки други тим спроводи, написани модул не може никако да уђе у продукционо окружење, ма колико он био добро имплементиран.

JUnit

 

Kent Beck и Erich Gamma увидели су ову важност и написали су open source framework 1997. године за Java-у познат као JUnit. Важност споменутих имена не бисмо овде „проширивали”, док више информација о JUnit framework-у можете наћи на адреси: (http://www.junit.org). JUnit је објављен под IBM’s Common Public License Version 1.0 и постављен је на GitHub репозиторијум. Убрзо након објављивања постаје стандард за скоро све језике под називом xUnit и подржава: ASP, C++, C#, Eiffel, Delphi, Perl, PHP, Python, REBOL, Smalltalk и Visual Basic.

Не улазећи у „дубину” могућности овог framework-а, пример тестирања ћемо показати малим Java примером. Тестирање се имплементира анотацијом одређене методе, класе и потпуно је засебан под-модул-апликативно извршни програм. Замислимо да имамо просту класу CalculatorTest и у њој методу сабирања:

public class Calculator {
   public double add(double number1, double number2) {
     return number1 + number2;
   }
}

Тестирање ЈUnit framework-ом :

import static org.junit.Assert.*;
import org.junit.Test;
 
public class CalculatorTest {
   @Test
   public void testAdd() {
     Calculator calculator = new Calculator();
     double result = calculator.add(10, 50);
     assertEquals(60, result, 0);
  }
}

Можда ово тренутно не изгледа као нека велика помоћ, међутим, развојем апликације и све већим бројем имплементираних модула, ово је од круцијалне важности како за тим, тако и за индивидуалне програмере.

Корисни линкови: