Врсте, алати и најбоље праксе

Prilikom razvoja softvera, neminovno je da će se greške pojaviti u vašem kodu. Te greške mogu biti različitih oblika, od sintaksnih i logičkih grešaka, preko problema sa performansama i podacima, do ozbiljnijih propusta.

S obzirom na to da su greške praktično neizbežne pri pisanju softvera, testiranje postaje ključni deo procesa razvoja. Pravilno i efikasno testiranje ne samo da obezbeđuje visok kvalitet softvera koji zadovoljava potrebe korisnika, već i softver koji je usklađen sa propisima i ima minimalan broj ranjivosti koje bi napadači mogli iskoristiti.

Testiranje softvera može se odvijati kroz različite oblike, kao što su automatsko testiranje, testiranje jedinica, integraciono testiranje, ili testiranje kompletnog softvera kroz sistemsko testiranje.

Međutim, jedno od ključnih pitanja koje se postavlja tokom testiranja jeste kako utvrditi da li je vaš softver temeljno testiran. Da li su testovi koje ste sproveli bili dovoljni? Da li ste obuhvatili sve delove svog softvera ili postoje delovi koda koji nisu testirani?

Ovakva pitanja se neminovno pojavljuju tokom procesa testiranja softvera, i upravo zbog toga je pokrivenost koda od izuzetnog značaja.

Pokrivenost koda je metrika u testiranju softvera koja pokazuje koliko je vašeg koda izvršeno i, samim tim, testirano testovima koje ste pokrenuli. Rezultati pokrivenosti koda se izražavaju u procentima.

Ovaj procenat pokazuje koliki deo vašeg koda je obuhvaćen testovima. Na primer, ako pokrenete test i dobijete pokrivenost koda od 60%, to znači da 40% vašeg koda nije testirano, što može dovesti do neotkrivenih grešaka i ranjivosti.

Iz tog razloga, pokrivenost koda vam omogućava da analizirate efikasnost i potpunost testova koje ste primenili na softver. To je od velike koristi jer osigurava da je softver propisno i temeljno testiran pre nego što se pusti u upotrebu, smanjujući potencijalne greške koje bi mogle negativno uticati na korisničko iskustvo.

Iako 100% pokrivenost koda ne garantuje da je softver potpuno bez grešaka, težnja ka visokoj pokrivenosti je ključna za efikasno testiranje softvera.

U kritičnim industrijama, kao što su vazduhoplovstvo i medicina, gde softverske greške mogu imati fatalne posledice, propisi često zahtevaju 100% pokrivenost koda tokom testiranja.

Vrste Metrika Pokrivenosti Koda

Postoji nekoliko vrsta metrika pokrivenosti koda koje se mogu meriti tokom testiranja softvera. Neke od njih uključuju:

  • Pokrivenost iskaza – meri procenat izvršnih linija koda koje su izvršene tokom testiranja.
  • Pokrivenost funkcija – meri procenat definisanih funkcija koje su pozvane tokom testiranja.
  • Pokrivenost grana – meri procenat grananja ili mogućih puteva koji su izvršeni od svih tačaka odlučivanja u izvornom kodu. Koristi se da osigura da su sve grane koje proizlaze iz kontrolnih struktura, kao što su if, switch i if-else izjave, potpuno testirane.
  • Pokrivenost uslova – meri procenat logičkih izraza koji su testirani za istinite i lažne vrednosti.
  • Pokrivenost petlji – meri procenat petlji u izvornom kodu koje su izvršene tokom testiranja.
  • Pokrivenost putanja – meri procenat svih mogućih puteva izvršenja u izvornom kodu koji su testirani.

Navedene metrike su obično uključene u izveštaj o pokrivenosti koda.

Najbolje Prakse za Pokrivanje Koda

Postoje određene najbolje prakse koje se preporučuju tokom procesa pokrivanja koda kako bi se osigurala efikasnost i kvalitet pokrivenosti. Neke od njih su:

Postavite Jasne Ciljeve Pokrivenosti

Pre početka bilo kakvog testiranja softvera, postavite ciljne procente pokrivenosti za svaku relevantnu metriku. Ovo ne samo da pruža jasne ciljeve testiranja, već i pomaže u smanjenju softverskih grešaka usmeravanjem timskih napora na povećanje pokrivenosti koda. Takođe osigurava da se testiranju softvera posveti pažnja koju zaslužuje tokom razvoja.

Fokusirajte se na Kvalitet Testova

Važno je naglasiti da pokrivenost koda samo pokazuje procenat testiranog koda i ne garantuje da je testiranje ispravno ili da softver nema grešaka. Stoga, umesto da se fokusiramo samo na postizanje 100% pokrivenosti koda, naglasak treba da bude na pisanju kvalitetnih i efikasnih testova koji ispravno testiraju softver i dodaju vrednost.

Povećajte Pokrivenost Koda u Kodu koji se Često Menja

Iako može biti izazovno postići visok nivo pokrivenosti koda u velikim projektima, uvek treba nastojati da se vremenom poboljša pokrivenost koda.

Odličan način da se to uradi jeste da se zahteva visoka pokrivenost koda, preko 90%, u svakoj novoj izmeni u bazi koda projekta.

Primenjivanje pokrivenosti koda na nivou izmena je ne samo realno i izvodljivo, već osigurava da sve nove promene u softveru budu propraćene odgovarajućom pokrivenošću koda.

Merite i Analizirajte Podatke o Pokrivenosti Koda

Iskoristite rezultate pokrivenosti koda da identifikujete oblasti koje zahtevaju dodatno testiranje i usmerite buduće napore na testiranje, sa fokusom na oblasti sa niskom pokrivenošću.

Analizirajte podatke o pokrivenosti koda kako biste identifikovali kritične delove aplikacije koje tek treba testirati i usmerite svoje napore na potpuno testiranje ovih netestiranih delova. Korišćenje podataka o pokrivenosti koda za poboljšanje i određivanje prioriteta softvera dovodi do bolje testiranog softvera sa manje kvarova.

Pokrivenost Koda naspram Pokrivenosti Testom

Iako se obe koriste za utvrđivanje efikasnosti testova, pokrivenost koda i pokrivenost testom se suštinski razlikuju u načinu upotrebe i onome što mere.

Pokrivenost testom je metrika koja se koristi za određivanje stepena do kojeg pisani testovi pokrivaju zahteve softvera. To uključuje testiranje svakog softverskog zahteva i pomaže da se utvrdi koliko je softver testiran u pogledu ispunjavanja svojih zahteva.

Rezultati pokrivenosti testom pokazuju procenat softverskih zahteva koji su testirani. Pokrivenost testom obično sprovode stručnjaci za osiguranje kvaliteta.

Pokrivenost koda, sa druge strane, je metrika testiranja softvera koja se koristi za određivanje procenta izvornog koda koji je izvršen pisanim testovima.

Rezultati pokrivenosti koda pokazuju u kojoj meri su iskazi, funkcije, putanje, petlje, grane i uslovi u izvornom kodu izvršeni putem napisanih testova. Pokrivenost koda se koristi da se proceni koliko dobro napisani testovi pokrivaju izvorni kod i obično je sprovode programeri softvera.

Pokrivenost koda je važna metrika za merenje tokom testiranja softvera. Evo nekoliko alata koji vam mogu pomoći u procesu pokrivanja koda:

Clover

Clover je alat za pokrivanje koda otvorenog koda, prvobitno razvijen od strane kompanije Atlassian, australijske softverske kompanije koja razvija proizvode za timove za razvoj softvera. Alat je napisan isključivo u Javi i može raditi na bilo kom operativnom sistemu koji zadovoljava zahteve za Java Runtime Environment.

Clover se može koristiti za pokrivanje koda napisanog u programskim jezicima Java, Groovy ili AspectJ. Podržava test okvire kao što su JUnit, TestNG i Spock, a takođe se može integrisati sa IDE-ovima kao što su IntelliJ IDEA i Eclipse.

Clover se može koristiti za merenje metrika pokrivenosti koda, kao što su metoda, iskaz, grana, globalna pokrivenost i pokrivenost po testu.

Nakon procesa pokrivanja koda, Clover može generisati visoko konfigurabilne HTML izveštaje koji prikazuju rezultate pokrivenosti koda, ističući oblasti sa najvećim rizikom u softveru i mogu se koristiti u optimizaciji testova.

Izveštaji se takođe mogu generisati u PDF, XML, JSON ili običnom tekstualnom formatu. Ključne prednosti Clover-a su njegova sposobnost integracije sa mnogim različitim alatima i aktivan razvoj i unapređenje.

JaCoCo

JaCoCo je besplatna biblioteka za pokrivanje koda za programski jezik Java, koju je razvio tim EclEmma. Biblioteka je implementirana u EclEmma, besplatan alat za pokrivanje Java koda za Eclipse IDE.

JaCoCo pruža bogatu analizu pokrivenosti čiji se rezultati odmah sumiraju i prikazuju u editoru izvornog Java koda, omogućavajući korisnicima da detaljno analiziraju rezultate pokrivenosti do nivoa metode.

Rezultati su predstavljeni pomoću prilagodljivog kodiranja u boji, koje ističe linije koda koje su u potpunosti, delimično ili još uvek nisu pokrivene testovima. Omogućava kombinovanje i razmatranje različitih testova kako bi se dobila ukupna pokrivenost izvornog koda.

JaCoCo je lagan alat i ne zahteva modifikaciju vaših projekata ili dodatna podešavanja da bi se koristio za analizu pokrivenosti koda.

Cobertura

Cobertura je besplatan alat za pokrivanje Java koda otvorenog koda, koji je baziran na Jcoverage-u i može se koristiti samostalno, putem Ant skripte ili Maven dodatka. Korišćenje putem Maven dodatka je najčešći način upotrebe Coberture za pokrivanje koda.

Cobertura meri procenat linija ili grana koje su izvršene testovima pokrenutim na izvornom Java kodu. Pruža metrike kao što je pokrivenost linija, koja pokazuje procenat naredbi izvršenih tokom testova, kao i pokrivenost grana, koja pokazuje procenat grana pokrivenih tokom testova.

Takođe prikazuje faktor složenosti, koji se povećava sa brojem grana u vašem Java kodu.

Rezultati pokrivenosti koda su predstavljeni u HTML ili XML formatu, pokazujući koji delovi izvornog koda nisu testirani. Pored prikazivanja rezultata pokrivenosti testom, Cobertura se može koristiti i za lociranje netestiranog koda i grešaka, kao i za identifikaciju nedostupnog koda.

Istanbul

Istanbul je alat za pokrivanje koda za JavaScript kod, sa podrškom za ES6+. Ovaj alat se može instalirati u bilo koji JavaScript projekat kao razvojna zavisnost pomoću Node package manager-a.

Istanbul pruža metrike pokrivenosti koda, kao što su iskaz, grana, funkcija i pokrivenost linije. Takođe prikazuje linije u izvornom kodu koje nisu obuhvaćene testovima. To postiže dodavanjem brojača linija u vaš JavaScript kod, kako bi mogao da prati u kojoj meri testovi jedinice izvršavaju vaš izvorni kod.

Rezultati pokrivenosti koda u Istanbulu mogu se ispisati u terminalu ili u HTML formatu. Pored toga, Istanbul nudi podršku za aplikacije koje pokreću podprocese, pokrivenost mapiranih izvora Babel i TypeScript projekata.

Pytest-cov

Pytest-cov je besplatan Python dodatak koji se koristi za generisanje izveštaja o pokrivenosti koda za Python kod. Instalira se pomoću Python-ovog instalatora paketa Pip i njime se upravlja iz komandne linije.

Njegov izveštaj o pokrivenosti koda prikazuje iskaze u vašem Python projektu, one koji nisu pokriveni testovima, i pruža procenat pokrivenosti testom, koji pokazuje koliki procenat vašeg Python koda je obuhvaćen testovima.

Pytest-cov nudi podršku za podprocese, podršku za xdist i dosledno ponašanje pytest-a. Podrazumevano ponašanje Pytest-cov tokom sprovođenja testova je brisanje postojećih datoteka sa podacima o pokrivenosti kako bi se obezbedili novi i čisti podaci za svako novo testiranje. Međutim, takođe omogućava korisnicima da kombinuju rezultate testa pokrivenosti koda iz prethodnih testiranja.

Coverage.py

Coverage.py je alat za pokrivanje koda za Python programe i instalira se u projekte pomoću pip-a.

Podrazumevano meri pokrivenost linija ili izraza i pruža rezultate koji pokazuju broj iskaza u programu, one koje su testovi propustili i procenat pokrivenosti testom. Takođe prikazuje linije u vašem Python izvornom kodu koje su testovi propustili. Međutim, može se konfigurisati da meri i pokrivenost grana u Python programima.

Coverage.py se takođe može koristiti da prikaže koji su testovi pokrenuli koje redove u izvornom kodu. Izveštaj o pokrivenosti koda može se predstaviti u terminalu, kao i u HTML, XML, JSON i LCOV formatima.

SimpleCov

SimpleCov je robustan alat za pokrivanje koda za programski jezik Ruby. Koristi ugrađenu Ruby biblioteku za pokrivanje kako bi prikupio relevantne podatke koji će se koristiti za određivanje pokrivenosti koda nakon pokretanja testova.

Najbolja stvar kod SimpleCov-a je njegova prezentacija rezultata pokrivenosti koda. Takođe objedinjuje rezultate različitih vrsta izvršenih testova, tako da generisani izveštaj prikazuje rezultate svih izvršenih testova, omogućavajući lakšu identifikaciju netestiranih delova koda.

Takođe formatira izvorni kod pomoću kodova boja koji se lako mogu koristiti za identifikaciju testiranih i neproverenih delova koda. SimpleCov podrazumevano meri i izveštava o pokrivenosti linija testova. Međutim, može se konfigurisati da meri i izveštava o pokrivenosti grana izvršenih testova.

Deep Cover

Deep Cover je precizan alat za pokrivanje koda za Ruby kod. Nudi tačnije izveštaje o pokrivenosti linija, osiguravajući da se linija smatra pokrivenom samo kada je izvršena u potpunosti, a ne delimično.

Pored toga, nudi podršku za pokrivenost čvorova i grana, koja se opcionalno može koristiti da se sazna da li postoje grane koje testovi nisu obuhvatili.

Deep Cover nije samo jednostavan za upotrebu, bez potrebe za konfiguracijom, već se može integrisati u projekte koji koriste druge alate za pokrivanje koda, kao što je Ruby-ova ugrađena biblioteka za pokrivanje koda ili SimpleCov. U takvim slučajevima, Deep Cover čini alate strožijim, tako što označava linije kao izvršene samo ako je ceo red koda u potpunosti izvršen.

Zaključak

Iako veća pokrivenost koda ne mora nužno rezultirati softverom bez grešaka, to je ključna metrika koju treba uzeti u obzir prilikom testiranja softvera. Pokrivenost koda je važna u proceni koliko testovi zaista testiraju izvorni kod softvera.

Pored toga, rad na poboljšanju pokrivenosti koda tokom testiranja rezultira bolje testiranim softverom koji je manje sklon greškama u produkciji. Da biste obavili pokrivanje koda tokom testiranja softvera, razmislite o korišćenju alata predloženih u ovom članku.

Takođe možete istražiti alate za testiranje opterećenja zasnovane na oblaku.