Kaj je testiranje enot?
Preizkušanje enot je samoumevna beseda, če razumete, kaj pomeni enota. Enota je najmanjši možni del kode, ki ga je mogoče logično izolirati iz sistema. To pomeni, da lahko vsak del kode, ki lahko sprejme vhode, opravi nalogo in ustvari izhod, tudi če je neodvisen od celotnega sistema ali rešitve, označujemo kot enoto. Testiranje tega dela kode za ustvarjanje pričakovanega izida na določenem nizu vhodov se imenuje Unit Testing.
Vrste testiranja enot
Pogovorimo se o nekaterih vrstah enotnega testiranja.
1) Ročno testiranje
Ročno testiranje kode zahteva, da razvijalec ročno odstrani vsako vrstico kode in jo preizkusi za natančnost. Morda bo potrebna tudi navodila za korake po korakih, če je funkcionalnost zapletena.
2) Samodejno testiranje
Pri testiranju avtomatizacije razvijalec napiše kodo za preizkušanje. Pri tem se na splošno pomaga prek enotnih testnih okvirov, ki niso nameščeni v proizvodnji. Drugi čas se lahko razvijalec odloči, da napiše testno kodo brez ogrodja in jo pred uvedbo ročno komentira.
Ročno testiranje se v večini primerov očitno zdi zamudno. Toda v nekaterih primerih, ko pisanje avtomatskih testnih primerov za vsak scenarij ni mogoče, je ročna metoda najprimernejša metoda.
Zakaj je testiranje enot pomembno?
Da bi razumeli pomen enotnega testiranja, moramo pogledati širšo sliko. Je del življenjskega cikla razvoja programske opreme. Na kratko si oglejmo ostale dele, da bomo bolje razumeli vlogo enotnega testiranja.
Zgornja slika je preprost prikaz normalnega življenjskega cikla razvoja programske opreme in postopkov testiranja, ki so z njo povezani. Ni treba posebej poudarjati, da se odvisno od strukture projekta celoten postopek razlikuje z dodajanjem in odstranjevanjem določenih komponent. Vendar postopek testiranja zagotovo vključuje štiri vrste, kot je opisano spodaj:
- Preizkušanje enot - osnovna raven celotnega postopka testiranja. To izvede razvijalec komponente ali kateri koli od njegovih vrstnikov. V zadnjem primeru ga v svetu programske opreme pogosto imenujejo Peer Testing.
- Integration Testing - Testiranje komponente enote z neposrednim nadrejenim modulom. Cilj je preveriti, ali se komponenta enote dobro integrira z drugimi komponentami in ni povzročila okvare nobene druge komponente.
- Preizkušanje sistemov - Preizkus celotnega sistema, ko je komponenta postavljena na svoje mesto.
- Preizkušanje sprejemljivosti - Običajno ga opravijo podjetja / stranke in preveri, ali rezultat usklajuje s funkcionalnostjo, ki jo pričakuje končni uporabnik.
Tako se zelo dobro vidi, da se vsi postopki testiranja opirajo na osnovno raven testiranja. Če osnovna raven testiranja ne bo opravljena, so lahko vsa ostala testiranja nekoristna.
Zdaj recimo, da imate kodo, ki ima dva dela
- Izračunajte sestavljene obresti.
- Zneski glavnice dodajte obresti in izračunajte nadomestilo za zapadlost.
Predpostavimo, da niste preizkusili enot nobene od teh komponent in nadaljevali neposredno s sistemskim testiranjem. Pri testiranju sistema se pojavi napaka, da je vrednost zrelosti napačna. Zdaj kateri del kode ima napako?
- Lahko je pri izračunu obresti.
- Lahko je pri uporabi logike mešanja.
- Poleg zneska glavnice je lahko obresti.
Glej, kako zdaj povečuje napor. Vsemu temu bi se lahko izognili, če bi bili obe komponenti kode preizkušeni.
Zakaj je testiranje enot pomembno?
- Odpravlja napake samo v zgodnji fazi razvoja. To prihrani veliko časa, truda in stroškov. Predstavljajte si, da če ne bi bilo opravljenih enotnih preskusov, bi koda šla v ekipo za zagotavljanje kakovosti za zelo preprosta vprašanja.
- Dobri preskusi enot služijo tudi namenu podrobne dokumentacije. Ko razvijalec napiše testne primere enot, nenamerno napiše pričakovano funkcionalnost kode. To preprosto ni nič drugega kot dokumentacija, ki pojasnjuje delovanje kode.
- Olajša spreminjanje in vzdrževanje kode. Ko spremenite kodo, ponovno zaženite preizkuse in viole, vse napake so ujete brez težav.
- Prav tako uveljavlja modularnost. Preskusi enot se izvajajo na posameznih komponentah, kar pomeni, da mora biti koda čim bolj natančna. To zagotavlja, da je koda primerno razdeljena na module.
Druga stran kovanca
Ima tudi nekaj pomanjkljivosti. Čeprav prednosti tehtajo pomanjkljivosti in je vedno priporočljivo, da preizkusite svojo kodo, vendar je smiselno poznati oba obraza istega kovanca.
- Preizkušanje enot, kako temeljito, včasih ne more zajeti vseh napak tudi v najbolj trivialni kodi. Enostavno ni mogoče oceniti vseh poti izvršitve. Tako so enotni testi pogosto preprosti scenariji srečne poti in negativni.
- Od razvijalca mora razmisliti o tem in poskusiti zlomiti svojo kodo. To je pogosto težko, saj je dojemanje razvijalca pristransko glede na kodo.
Orodja za testiranje enot
V industriji obstaja več orodij za pomoč pri avtomatiziranih testnih primerih. Ker je to namen, razvijalcu olajšajo pisanje in izvajanje preizkusnih primerov enot. Ob razbitju razvijalcev obstaja svet okvirov za testiranje enot. Spodaj so navedena nekatera najbolj priljubljena in široko uporabljena orodja.
JUnit
JUnit je brezplačno za uporabo orodje za testiranje Java. Samodejno je vključen v številne predloge projektov, ki so na voljo z različnimi IDE za razvoj Java. Zaradi tega je JUnit poseben, saj najprej preizkusi podatke in nato preizkusi kodo, potem ko v njih vstavi podatke. Predlaga tudi trditve za prepoznavanje preskusnih metod.
NUnit
NUnit je na .Net kot JUnit na Javo. Ima vse značilnosti JUnit, vendar za razvoj v programskem jeziku .Net. Prav tako podpira vzporedno izvajanje testov.
PHPUnit
Podobno kot JUnit in NUnit je tudi PHPUnit orodje za PHP razvijalce. Prav tako podpira vse elementarne lastnosti dobrega orodja za testiranje.
XUnit
Drug okvir, ki je splošnejši od svojih kolegov, je XUnit. Podpira več jezikov, kot so C ++, C #, ASP.Net itd. Prav tako se ponaša s podobnimi lastnostmi kot v drugih orodjih, ki so na voljo na trgu.
Jtest
Parasoft Jtest je vtičnik drugih proizvajalcev, ki uporablja odprtokodne okvire, kot je JUnit, in doda rešitve z enim klikom, da olajša življenje. Z Jtest lahko s samo nekaj kliki samodejno ustvarite testne kode za svojo kodo. Z avtomatizacijo teh nalog razvijalec lahko dela na poslovni logiki testnih primerov.
QUnit
Zelo priljubljen okvir za testiranje enote JavaScript. JavaScript kodo lahko preizkusi tako na strani odjemalca kot tudi na strani strežnika.
Jasmin
Še eno zelo pogosto uporabljeno orodje za testiranje okvirov JavaScript. Ima veliko podporo skupnosti za Angular, React itd.
JMockIt
JMockIt je odprtokodno orodje, ki podpira tudi zasmehovanje klicev API s sintago snemanja in preverjanja.
Primer enote testnega primera
Zelo osnovna zahteva vsake enote preskušanja je koda, ki jo je treba preizkusiti. Predpostavimo, da imamo funkcijo, ki preverja, ali so telefonske številke pravilne (glede na obliko) ali ne. Glede na geografsko lego se lahko tudi to merilo razlikuje. Torej, ne bomo poudarjali meril. Namesto tega se bomo osredotočili na testni primer enote.
public class PhoneValidator
(
public bool IsPhoneValid(string phone)
(
/* write some code to verify if the phone is valid or not. return true, if the phone is valid. return false, if invalid. */
)
)
Zdaj moramo preizkusiti ta del kode.
Lahko ga preizkusimo ročno, tako da vstavimo različne vrednosti in preverimo izhod. Na prvi pogled se lahko to zdi enostavno, vendar bo ponovljena naloga, če se koda spremeni.
Lahko pa napišemo testni primer enote, ki lahko služi kot moj validator, dokler poslovna logika ostane enaka. Primer preizkušanja enote se ne bo spremenil, tudi če spremenimo kodo. Torej, za zgornjo kodo napišemo testni primer enote.
public void TestPhoneValidator()
(
string validPhone = "(123) 456-7890";
string invalidPhone = "123 45"
PhoneValidator validator = new PhoneValidator();
Assert.IsTrue(validator.IsPhoneValid(valid phone));
Assert.IsFalse(validator.IsPhoneValid(invalidPhone));
)
Kako torej deluje zgornja testna koda enote? Opazite obe izjavi. Poskrbijo, da test opravi le, če obe vrstici prejmeta resnično in napačno iz ustreznih klicev funkcije IsPhoneValid.
Vprašali bi se, kakšne so prednosti pisanja tega testnega primera? No, če imate na tisoče telefonskih številk, ki jih želite preveriti v katerem koli resničnem scenariju, vam ni treba ročno preveriti vsakič, ko odpravljalec napake prikaže kodo. Preprosto pokličite preskusno kodo tisočkrat in ta vam bo povedal, kateri preizkusi so bili opravljeni in kateri neuspešni. Zdaj morate samo pregledati neuspele.
Nasveti za testiranje enot
- Vedno uporabite orodje ali okvir, ki podpira vaš jezik. Orodja olajšajo razvoj enot za preskušanje. V nasprotnem primeru boste morda vložili dodatne napore.
- Čeprav je priporočljivo za vse, je včasih primerno preskočiti kode, ki so preproste in ne vplivajo neposredno na vedenje sistema. Na primer, kode getterja in setterja so lahko manj osredotočene.
- Nikoli ne preskočite kode, ki neposredno vplivajo na sistem ali so ključne za izvajanje poslovne logike.
- Uporabite preskusne podatke, ki so podobni proizvodnim podatkom.
- Izolirajte kodo. Če je vaša koda odvisna od podatkov iz baze podatkov, ne napišite testnega primera, da pokličete bazo podatkov in dobite vrednosti. Namesto tega ustvarite vmesnik in se norčujte iz klicev API-ja in baze podatkov.
- Preden odpravite napako, ki izhaja iz preskušanja enote, napišite testni primer, ki razkrije napako. Za to obstajajo trije razlogi:
- Regresijske napake, ki izhajajo iz vašega popravka, boste lahko ujeli.
- Vaš preskusni primer je zdaj bolj izčrpen.
- Pogosto je razvijalec preveč len, da poskuša posodobiti svoje testne primere, ko jih enkrat napiše.
- Poleg pisanja testnih primerov, ki preverjajo poslovno logiko, napišite tudi primere, ki preizkušajo delovanje kode. Zlasti kadar kode vključujejo zanko, je delovanje najbolj prizadeto območje.
Stvari, ki jih je treba zapomniti
- Primeri preskusnih enot ne bi smeli biti neodvisni od
- Koda, ki jo je treba preizkusiti - Vsaka sprememba kode ne bi smela zahtevati spremembe preskusnega primera, razen če se sama poslovna logika spremeni. Na primer, če logika zdaj zahteva, da se mora veljavna telefonska številka vedno začeti z '+', potem je treba spremeniti testni primer enote, sicer ne.
- Druga koda - Ne sme biti nobene interakcije ali odvisnosti z nobenim drugim delom kode ali vrednosti baze podatkov ali kaj podobnega. Pri preskušanju je treba izolirati enoto.
- Upoštevajte jasne in dosledne konvencije o poimenovanju za vaše testne primere. Olajša sledenje scenarijem. Za spremljanje svojih testnih primerov lahko uporabite tudi orodja za nadzor različic.
- Nikoli ne prenesite kode na naslednjo fazo, dokler je ne storite, odpravite napake in ponovno preizkusite.
- Najpomembneje je, da to postane navada. To je praksa kodiranja, ki jo je treba vključiti. Bolj kot kodirate brez testiranja enot, bolj je nagnjena koda.
Kariera pri enotnem testiranju
Čeprav testiranje enot ni nobeno polje kot celota, je kljub temu dodatna puščica v vaši kovčki. Je dobra praksa kodiranja in kdaj dobri kodirniki niso prednostni?
Zaključek
Brez dvoma lahko sklepamo, da je preskušanje enot včasih preprosto in zapleteno. Takrat vam pomagajo orodja in okviri. Tudi pri opravljenem preizkušanju enote koda ni v celoti dokazano napak. Takrat se začnejo naslednji postopki preizkušanja ravni. Med vsemi temi negotovostmi je zagotovo edino, da je testiranje enote potrebno.
Priporočeni članki
To je vodnik za testiranje enot. Tu smo razpravljali o pomenu, nasvetih, orodjih, karieri in vrstah preizkušanja enot z njenimi primeri. Če želite izvedeti več, lahko preberete tudi druge naše predlagane članke -
- Testiranje vprašanj o intervjuju
- Aplikacija za spletno testiranje
- Pokvarjen življenjski cikel pri testiranju programske opreme
- Poklic pri testiranju programske opreme
- Seznam testnih okvirov za Java