Automatizacija – najpouzdaniji sustav ranog upozorenja u razvoju softvera

Autor: Matija Huremović, KING ICT, Tester softvera – Sektor razvoja softverskih rješenja

Iako se tako čini, automatizacija u razvoju softvera, pa tako i u njegovom testiranju nije novi koncept. Ova tehnologija, koja zvuči pomalo futuristički, zapravo postoji u nekom obliku oko trideset godina. No zašto onda tek u posljednjih deset godina ili manje čujemo izraze „automatizacija će biti kraj ručnog testiranja“, „automatizacija je jedini potreban način testiranja“ i slično?

Prvo (iznimno) kratka povijest

Stvarna priča je da su se takvi izrazi koristili vrlo često na samom začetku tehnologije, vjerojatno češće nego danas. Naravno, oni koji su ih najviše ponavljali su bili oni koji su razvijali i sam automatizacijski softver te oni koji vole biti ukorak sa svakom novom tehnologijom. U svakom slučaju, bili su jako uspješni oko širenja svijesti o automatizaciji softvera i ubrzo je svaka tvrtka primijetila prednosti automatskog testiranja u odnosu na „staromodno“ ručno testiranje. Oni koji su radili na testiranju softvera vjerojatno nisi bili presretni čuti kako će im nova tehnologija oteti posao. Barem u tome se možemo poistovjetiti s njima, jer tko danas nije čuo da će ChatGPT zamijeniti programere?

Stručnjaci su se obučavali za rad s novim alatima, počeli ih uvoditi u svakodnevni tok razvoja softvera pa čak i sami razvijati poboljšanja dizajnirana za njihovu situaciju kako bi si olakšali život. No vrlo brzo je došlo do pojavljivanja prvih problema.

Oni koji se sjećaju kako su funkcionirala računala prije više od dvadeset godina će odmah razumjeti tehnološka ograničenja koja su dolazila s njima. Sam razvoj softvera tada je bio mnogo kompleksniji nego što je danas, a s time i razvoj automatizacije testiranja istog. Osim na iznimno specifičnim platformama, danas nitko neće prigovarati ako aplikacija zauzima 12 megabajta umjesto 10. No u to vrijeme je to značilo jedan floppy disk manje kojeg je potrebno nositi sa sobom.

Uz tehnološka ograničenja glavni problem je bio omjer dobivene vrijednosti i utrošenog vremena. Današnji alati su mnogo više user-friendly nego što su bili prije deset, dvadeset ili više godina. No u začecima automatizacije korištenje tih alata iziskivalo je znatno tehničko znanje i edukaciju za rad s njima. Izrađivanje jednog automatskog testa bi utrošilo višestruko više vremena nego izvršavanje tog istog testa ručnim testiranjem, ponekad i nekoliko desetaka puta više. A čak i kada bi taj test i bio uspješno kreiran prestao bi vrijediti istog trenutka kada bi se aplikacija izmijenila, i evo nas opet na početku. Naravno, s obzirom na to da se većina testiranja odvija tijekom izrade aplikacije ona se ponekad mijenjala i na dnevnoj bazi.

I tako je automatizacija testiranja ispala s radara. Barem do u nazad nekoliko godina.

Povratak

Kao i James Cameron s prvim Avatar filmom, i mi koji radimo na automatizaciji testiranja softvera napokon smo dočekali da tehnologija sustigne našu viziju. S vremenom su se počeli pojavljivati novi, znatno bolji alati, tehnološka ograničenja su se smanjivala i proces razvoja je unaprijeđen. No ovaj put nije bilo straha oko otimanja poslova ili želje da se ručno testiranje potpuno zaboravi. Kako to?

Jedan od glavnih razloga je što smo naučili ne srljati pred rudo. Samo zato što je tehnologija nova ili bolja u nekom pogledu ne znači da će i opstati ili prevladati nad lošijom. VHS je pobijedio Betamax, a danas rijetko tko zna što je Zune dok svi znamo za iPod.

Srećom, izgleda da smo mnogo toga naučili u godinama između prve pojave automatizacije i njezinog povratka. Današnji alati, poput Seleniuma, Cypressa, k6 i ostalih su znatno pristupačniji korisnicima nego njihovi prethodnici. Iako i dalje zahtijevaju određeno poznavanje tehnologije, taj prag je osjetno niži nego što je bio prije. Jedna od glavnih prednosti je i vrijeme potrebno kako bi naučili koristiti alate. Dok su prije stručnjaci prolazili kroz razne edukacije koje su znale trajati i do nekoliko mjeseci, danas ih većina može početi koristiti alat u osnovnom kapacitetu kroz nekoliko dana. Naravno, to što ih je jednostavno početi koristiti ne znači da je jednostavno i ovladati njima.

Jedna od velikih prednosti za automatizaciju testiranje je moderniziranje procesa razvoja softvera. Uz verzioniranje koda, razne virtualne okoline postavljanje okolina koje služe isključivo za testiranje te mogućnost izvršavanja skripti bez nadzora testerima je mnogo lakše dizajnirati i implementirati testove koji će donijeti najviše vrijednosti u najkraćem roku.

Naravno, najveća prednost su današnji tehnološki dosezi. Računala su nekoliko desetaka puta brža, konektivnost putem interneta je dostupačnija i zajednice sa sličnim interesima znatno veće nego što su bile prije. Sve su to faktori koji omogućavaju brzi napredak ne samo kreiranja alata za automatizaciju nego i obrazovanja oko njihovog korištenja.

Mogućnosti moderne automatizacije testiranja

Glavno pitanje sada je što sve zapravo ta moderna tehnologija može? Kratak odgovor bio bi – sve što i osoba može! Naravno, kratak odgovor ne bi bio nimalo zanimljiv, a nekima bi možda i stvorio krivu percepciju o automatizaciji i cjelokupnom testiranju.

Matija Huremović

Najčešća primjena automatizacijskih alata je funkcionalno testiranje preko UI-a. To znači da softver simulira korisnika koji koristi našu aplikaciju, bilo to klikanje po navigacijskim menijima, upisivanje pojmova u tražilicu, kupovina nekog proizvoda u online trgovini i slično. Kod ovakve vrste automatiziranja testiranja aplikacija zapravo ne vidi razliku između pravog korisnika i našeg testa te se zbog toga ponaša identično kako bi i u stvarnom scenariju. To je izrazito bitno jer jedna od glavnih svrha testiranja je vidjeti kako će se krajnji proizvod ponašati jednom kada ga predamo korisnicima.

Ono gdje je automatski test ima prednost nad manualnim, to jest da tester sjedi za računalom i koristi aplikaciju, je to što će automatski test svakog puta zadane radnje izvršiti identično. Testeru ili korisniku će ponekad neki od scenarija izvršiti drugim slijedom, ili će pričekati nekoliko sekundi ili minuta prije nego što prijeđe na sljedeći korak, a ponekad će jednostavno i napraviti grešku prilikom unosa. Nerealno je očekivati od bilo koje osobe da u više stotina prolazaka kroz neku aplikaciju ne pogriješi prilikom unosa lozinke, no automatski test će ju uvijek ispravno upisati.

Još jedna prednost koju automatizacija ima kod ovakve vrste testiranja je njezina brzina. Zamislite da testirate online trgovinu i imate scenarij koji kaže „pretraži trgovinu za proizvod X, dodaj ga u košaricu i dovrši kupovinu.“ Primjer je jednostavan i zasigurno vam ne bi bilo potrebno više od nekoliko minuta da ga izvršite. No koliko bi vam vremena bilo potrebno kad umjesto jednog scenarija imate stotinjak ili više, svaki s različitim proizvodom? Vjerojatno bi jako brzo postali frustrirani repetitivnom radnjom te bi vam bilo potrebno nekoliko sati. Srećom, automatski test nema ugrađeni modul umjetne inteligencije koji mu dozvoljava osjećaj frustracije, dosade ili neugode zbog sjedenja pred računalom toliko dugo pa bi u ovakvoj situaciji premašio stvarnu osobu i brzinom i konzistentnošću.

Ovi hvalospjevi oko brzine automatizacije lijepo zvuče, ali kako bi se prikazali ispravni podatke smo za ovaj članak odlučili provesti nekoliko testova putem automatizacije i ručnim testiranjem. Korišten je primjer spomenut ranije s pretragom i kupovinom određenog proizvoda u online trgovini.

Scenarij je ručno izvršen dvadesetak puta kako bi se dobilo prosječno vrijeme. Nakon dvadeset iteracija testiranja najbrže vrijeme bilo je 1 minuta i 22 sekunde, a najsporije 1 minuta i 39 sekundi. Prosječno vrijeme potrebno za izvršenje jednog testa bilo je 1 minuta i 29 sekundi, što znači da je manualno testiranje trajalo nešto manje od pola sata.

Za isti scenarij izrađen je i automatizirani test koji je izvršen dvadeset puta. Njegovi rezultati su znatno drugačiji, s najkraćim vremenom izvršavanja od 12 sekundi a najduljim od 17 sekundi. Prosječno vrijeme izvršavanja bilo je 14.5 sekundi, što znači da je automatizirano testiranje trajalo 4 minute i 50 sekundi.

Iz ovog primjera vidimo da će u sličnim testovima automatizacija odraditi svoj posao otprilike 6 puta brže nego osoba, a važno je napomenuti da je prilikom manualnog testiranja u jednom slučaju napravljena greška prilikom upisivanja naziva proizvoda što je produžilo vrijeme testiranja. Naravno, automatizirani test nije napravio pogrešku.

Što se događa iza kulisa

Zašto onda ne koristimo isključivo automatske testove s obzirom na to da njihova brzina i konzistentnost ostavljaju ovoliki dojam? Odgovor na to je jednostavan: ne postoji čarobni gumb ni na jednoj tipkovnici (a tražili smo) koji bi taj test isprogramirao umjesto nas.

Automatizacija zahtjeva određeno znanje od testera koji radi s njom, to je jedna od stvari koja se nije promijenila u posljednjih trideset godina, ali isto tako zahtjeva i određeno vrijeme. Koliko god se automatski testovi brže izvršavaju od manualnih, toliko više vremena je potrebno da ih se izradi. Za izradu automatskog testa za gore navedeni primjer bilo je potrebno oko 40 minuta.

Problem kod izrade automatiziranih testova je isti kao generalni problem s računalima; potrebno je sve specificirati do najsitnijeg detalja. Ako osobi kažemo „pretraži trgovinu za proizvod X“ ona će to odmah razumjeti, no računalu, a time i automatskom testu, potrebno je reći gdje se točno nalazi funkcionalnost za pretraživanje, kako ju odabrati, što upisati u formu te kako pokrenuti pretragu.

U tome leži glavna mana automatizacije: ponekad se njena izrada jednostavno ne isplati. Odluka oko automatizacije nekog od testova nije nešto što se donosi hirom, već se u obzir uzimaju razni faktori koji se raspravljaju unutar tima. Jedni od najvažnijih aspekata automatizacije koje treba razmotriti su koliki je omjer vremena potrebnog za izradu automatskog testa naspram koliko često će se taj test izvršavati. Ako je potrebno nekoliko sati za izradu testa koji će se do kraja razvoja aplikacije izvršiti samo nekoliko puta nažalost automatizacija tog testa neće donijeti dovoljnu vrijednost. Nasuprot, ako će se taj test izvršavati svaki dan, ili čak nekoliko puta dnevno, u narednih šest mjeseci automatizacija usprkos dugom razvoju ušteđuje mnogo više vremena i time izrazito doprinosi razvoju aplikacije.

Nadalje, najteža stvar kod donošenja odluke oko automatizacije je i ona najnepredvidljivija. Radi se o faktoru izmjene aplikacije tijekom razvoja. Bilo kakav softver u svom razvoju prolazi kroz razne stadije, od prototipa do konačnog proizvoda njegova funkcionalnost i izgled se mogu mijenjati nekoliko desetaka puta. Kod manualnog testiranja to ne stvara preveliki problem, najgore što se može dogoditi je da osobi treba neko vrijeme da otkrije gdje se traženi gumb pomaknuo ili u što se naslov na meniju promijenio. Kada jednom to sazna prilagodit će se i nastaviti neometano s radom. No kod pisanja automatskih testova priča je u potpunosti drugačija. Ako pomaknemo gumb s jednog mjesta na drugo ili promijenimo naslov, pa čak i ako napravimo promjenu koja nije vidljiva na sučelju aplikacije (kao što su klase zadane HTML elementima) riskiramo kvar našeg automatskog testa. Zbog toga je potrebno izrazito pomno razmotriti, pa čak i pokušati predvidjeti, hoće li ona verzija aplikacije za koju izrađujemo automatski test biti dovoljno slična njenoj krajnjoj verziji. Naravno, kod takvih izmjena nije potrebno cijeli test automatizirati ispočetka, no svako vrijeme utrošeno na njegovo prilagođavanje je faktor kod donošenja odluke.

Najmanji problem je onaj koji se rano pronađe

Preostaje nam još jedna velika prednost automatizacije – mogućnost ranog upozorenja.

U slučaju manualnog testiranja postoji jako određeno vrijeme kada će nas izvršavanje testa upozoriti na postojanje greške u aplikaciji, a to je kada osoba izvrši test i primijeti ju. Naravno, to može biti i nekoliko minuta nakon što je greška stvorena ako se nove funkcionalnosti odmah testiraju, ali može biti i nekoliko dana kasnije ako postoje drugačiji prioriteti testiranja.

Srećom, automatski testovi nemaju radno vrijeme pa se njihovo izvršavanje može podesiti na bilo koje doba dana ili noći. Ako to želimo, izvršavanje automatskih testova postavit ćemo u 7:00 sati ujutro kako bi nas izvještaj o njihovom prolasku ili padu dočekao kada dođemo na posao, ili ćemo ih izvršavati u 10:00 navečer kada su i najveći radoholičari otišli doma i tako izbjegli opterećenje servera koje bi im potencijalno smetalo u radu.

No ipak najčešće korištenje zakazivanja izvođenja automatskih testova je nakon što se napravi neka izmjena u aplikaciji. Točnije, čim programer primjeni novonapisani kod automatski testovi će se izvršiti i javiti da li su izmjene dovele do greške, bilo na dijelu aplikacije koji se trenutno nadograđuje ili onom već postojećem.

Nadalje, mi ljudi nismo toliko konzistentni i pedantni koliko bi voljeli vjerovati. Prilikom manualnog izvršavanja testova neka greška će se ponekad uspjeti i sakriti i ostati neprimijećena, pogotovo kada se radi o onima koje ne utječu na rad aplikacije kao su tipfeleri. Iako su to male greške i aplikacija je i dalje savršeno funkcionalna uz njih, one su i dalje greške. Automatiziranom testu tako nešto ne može promaći zato što je izrazito pedantan. Ipak je takav napravljen. Ako mu kažemo da traži pojam „računalo“ odbijat će prihvatiti bilo što osim tog izraza. Ako osoba pročita riječ „račnualo“ moći prepoznati na što se misli i nastaviti dalje s radom, no automatizirani testovi ne prihvaćaju ništa osim savršenstva. Zapravo su poput ekstremno strogog profesora koji inzistira da se za prolaz na ispitu mora dobiti maksimalan broj bodova.

Nema razloga za čekanje

Automatizacija testiranja je trenutno u izrazito zanimljivoj fazi s dalekim dosegom onoga što može napraviti i novim tehnologijama koje se pojavljuju svaki dan. Ako se do sad niste mogli odlučiti zaploviti ili ne automatizacijskim vodama ovo je savršeno vrijeme za to. Čak i ako ste jedan od onih koji nisu ni razmišljali o automatskim testovima isplati se barem ogrebati po površini, pogotovo s obzirom na to da su najbolji alati besplatni i open-source.

S obzirom na prednosti koje možete ostvariti i da tehnologija napreduje iz dana u dan, istraživanje mogućnosti automatskog testiranja osigurat će vam mjesto na samom rubu napretka u modernom razvoju softvera.