Čo je testovanie jednotiek?
Testovanie jednotky je samovysvetľujúce slovo, ak človek rozumie, čo sa myslí pod jednotkou. Jednotka je najmenší možný kód, ktorý sa dá logicky izolovať od systému. To znamená, že akákoľvek časť kódu, ktorá môže prijímať vstupy, vykonávať úlohu a generovať výstup, aj keď je nezávislá od celého systému alebo riešenia, môže byť označená ako jednotka. Testovanie tejto časti kódu na generovanie očakávaného výstupu na danej skupine vstupov sa nazýva Testovanie jednotiek.
Druhy skúšania jednotiek
Poďme diskutovať o niektorých typoch testovania jednotiek.
1) Ručné testovanie
Manuálne testovanie kódu vyžaduje, aby vývojár manuálne ladil každý riadok kódu a testoval jeho presnosť. Ak je funkčnosť zložitá, môže si to vyžadovať aj krok za krokom.
2) Automatické testovanie
Pri automatizovanom testovaní vývojár zapisuje kód do testovacieho kódu. To sa vo všeobecnosti zabezpečuje prostredníctvom rámcov jednotkových testov, ktoré sa nezavádzajú vo výrobe. Inokedy sa vývojár môže rozhodnúť napísať testovací kód bez rámca a manuálne ho pred nasadením okomentovať.
Ručné testovanie sa zdá byť vo väčšine prípadov časovo náročné. Ale v niektorých prípadoch, keď píšeme automatizované testovacie prípady na pokrytie každého scenára, nie je možné, manuálna je často preferovaná metóda.
Prečo je testovanie jednotiek dôležité?
Aby sme pochopili dôležitosť testovania jednotiek, musíme sa pozrieť na širší obraz. Je súčasťou životného cyklu vývoja softvéru. Pozrime sa stručne na ďalšie časti, aby sme lepšie porozumeli úlohe Unit Testing.
Vyššie uvedený obrázok je jednoduchou ilustráciou bežného životného cyklu vývoja softvéru a testovacích procesov s ním spojených. Samozrejme, v závislosti od štruktúry projektu sa celý proces mení s pridaním a odstránením určitých komponentov. Proces testovania však určite zahŕňa štyri typy, ako je opísané nižšie:
- Unit Testing - Elementárna úroveň celého testovacieho procesu. Vykonáva to vývojár komponentu alebo ktorýkoľvek z jeho rovesníkov. V druhom prípade sa vo svete softvéru často nazýva Peer Testing.
- Integration Testing - Testovanie komponentu jednotky s jeho okamžitým nadradeným modulom. Cieľom je skontrolovať, či sa komponent jednotky dobre integruje s ostatnými komponentmi a či nespôsobil poruchu iného komponentu.
- Testovanie systémov - testovanie celého systému, keď je komponent jednotky umiestnený v jeho polohe.
- Akceptačné testovanie - zvyčajne sa vykonáva v podnikoch / klientoch a kontroluje, či je výsledok v súlade s funkčnosťou očakávanou koncovým používateľom.
Takto je možné veľmi dobre vidieť, že všetky testovacie procesy závisia od základnej úrovne testovania. Ak sa základná úroveň testovania neuskutoční, všetky ostatné testy môžu mať za následok zbytočné výsledky.
Povedzme, že máte kód, ktorý má dve časti
- Vypočítajte úroky z úrokov.
- K úroku sa pripočíta úrok a vypočíta sa splatnosť.
Predpokladajme, že ste netestovali jednotky žiadneho z týchto komponentov a pristúpili ste priamo k testovaniu systému. Pri testovaní systému sa vyskytne chyba, že hodnota splatnosti je nesprávna. Ktorá časť kódu má teraz chybu?
- Môže to byť pri výpočte úrokov.
- Môže to byť pri aplikácii logiky zloženia.
- Môže to byť okrem úroku aj do výšky istiny.
Pozrite sa, ako to teraz zvyšuje úsilie. Tomu všetkému by sa dalo predísť, keby boli obe komponenty kódu testované jednotkou.
Prečo je testovanie jednotiek dôležité?
- Opravuje chyby iba na začiatku vývojovej fázy. To šetrí veľa času, úsilia a nákladov. Predstavte si, že ak by sa nevykonali žiadne jednotkové testy, kód by pre veľmi jednoduché problémy smeroval do tímu zabezpečenia kvality a od neho.
- Dobré jednotkové testy tiež slúžia na účely podrobnej dokumentácie. Keď vývojár píše prípady testovania jednotiek, neúmyselne zapisuje očakávanú funkčnosť kódu. Toto nie je nič iné ako dokumentácia, ktorá vysvetľuje fungovanie kódu.
- Uľahčuje to úpravu a údržbu kódu. Po vykonaní akýchkoľvek zmien v kóde, spustite testy znova a porušte, všetky chyby sú zachytené bez problémov.
- Presadzuje tiež modularitu. Jednotkové testy sa vykonávajú na jednotlivých komponentoch, čo znamená, že kód musí byť čo najpresnejší. To zaisťuje, že kód je vhodne rozdelený do modulov.
Druhá strana mince
Má aj niektoré nevýhody. Aj keď výhody ťažia nad nevýhodami a vždy sa odporúča jednotkový test kódu, napriek tomu má zmysel poznať obe tváre tej istej mince.
- Testovanie jednotiek, akokoľvek dôkladné, niekedy nedokáže zachytiť všetky chyby aj v najzávažnejších kódoch. Je jednoducho nemožné vyhodnotiť všetky cesty vykonávania. Testy na jednotkách sú teda často priamočiarym negatívnym scenárom.
- Vyžaduje, aby vývojár vymyslel škatuľu a pokúsil sa prelomiť jeho kód. To je často ťažké, pretože vnímanie vývojára je skreslené smerom k kódu.
Nástroje na testovanie jednotiek
V priemysle existuje niekoľko nástrojov na pomoc s automatizovanými prípadmi testovania jednotiek. Účelom je uľahčiť vývojárovi písanie a vykonávanie prípadov testovania jednotiek. Existuje svet rámcov na testovanie jednotiek, ktoré sa poskytujú na výplatu vývojárom. Nižšie sú uvedené niektoré z najpopulárnejších a najpoužívanejších nástrojov.
JUnit
JUnit je bezplatný nástroj na testovanie Java. Je automaticky zahrnutá do mnohých šablón projektov dostupných s rôznymi IDE pre vývoj Java. Čo robí JUnit špeciálnym je, že najskôr otestuje údaje a potom po vložení údajov do nich otestuje kód. Poskytuje tiež tvrdenia na identifikáciu testovacích metód.
NUNIT
NUnit je .Net ako JUnit je Java. Má všetky hlavné vlastnosti JUnit, ale pre vývoj v .Net programovacom jazyku. Podporuje tiež paralelné vykonávanie testov.
PHPUnit
Podobne ako JUnit a NUnit je PHPUnit nástrojom pre vývojárov PHP. Podporuje tiež všetky základné vlastnosti dobrého testovacieho nástroja.
xUnit
Ďalším rámcom, ktorý je všeobecnejší ako jeho náprotivky, je XUnit. Podporuje viac jazykov ako C ++, C #, ASP.Net, atď. Tiež sa môže pochváliť podobnými vlastnosťami ako iné nástroje dostupné na trhu.
Jtest
Parasoft Jtest je doplnok tretích strán, ktorý využíva rámce otvoreného zdroja, ako je JUnit, a pridáva riešenia na jedno kliknutie, aby sa uľahčil život. S Jtestom môžete automaticky generovať testovacie kódy pre váš kód pomocou niekoľkých kliknutí. Automatizáciou týchto úloh vývojár môže pracovať na obchodnej logike testovacích prípadov.
QUnit
Veľmi populárny rámec pre testovanie jednotiek JavaScript. Môže otestovať kód JavaScript na strane klienta aj servera.
jazmín
Ďalší veľmi používaný testovací nástroj pre rámce JavaScriptu. Má veľkú podporu komunity pre Angular, React atď.
JMockIt
JMockIt je nástroj s otvoreným zdrojom, ktorý tiež podporuje zosmiešňovanie hovorov API so syntaxou nahrávania a overovania.
Príklad testu jednotky
Veľmi základnou požiadavkou každého prípadu testu jednotky je kód, ktorý sa má testovať. Predpokladajme, že máme funkciu, ktorá overí, či sú telefónne čísla správne (z hľadiska formátu) alebo nie. V závislosti od geografickej polohy sa toto kritérium môže meniť. Nebudeme zdôrazňovať kritériá. Skôr sa zameriame na prípad testovania jednotky.
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. */
)
)
Teraz musíme tento kus kódu otestovať.
Môžeme to buď otestovať ručne vložením rôznych hodnôt a overením výstupu. Na prvý pohľad sa to môže zdať ľahké, bude to však opakovaná úloha, ak dôjde k akejkoľvek zmene kódu.
Prípadne môžeme napísať prípad testu jednotky, ktorý môže slúžiť ako môj validátor, pokiaľ obchodná logika zostane rovnaká. Test jednotky sa nezmení, aj keď zmeníme kód. Takže poďme napísať prípad testu jednotky pre vyššie uvedený kód.
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));
)
Ako teda funguje vyššie uvedený testovací kód jednotky? Všimnite si dve výpovede Assert Zaisťujú, že test prebehne iba vtedy, ak dva riadky dostanú pravdivé a nepravdivé z príslušných volaní funkcií IsPhoneValid.
Spýtali by ste sa, aké sú výhody písania tohto testovacieho prípadu? Ak máte tisíce telefónnych čísel na overenie v akomkoľvek scenári skutočného sveta, nemusíte ručne verifikovať zakaždým, keď ladiaci program zasiahne kód. Jednoducho volajte testovací kód tisíckrát a povie vám, ktoré testy prešli a ktoré zlyhali. Teraz musíte skontrolovať len tie, ktoré zlyhali.
Tipy na testovanie jednotiek
- Vždy používajte nástroj alebo štruktúru podporujúcu váš jazyk. Nástroje uľahčujú vývoj prípadov testovania jednotiek. Inak môžete vynaložiť ďalšie úsilie.
- Aj keď sa odporúča pre všetko, niekedy je vhodné preskočiť kódy, ktoré sú jednoduché a nemajú priamy vplyv na správanie systému. Napríklad kódy getter a setter môžu byť menej zamerané.
- Nikdy nevynechajte kódy, ktoré majú priamy vplyv na systém alebo sú kľúčové pre implementáciu obchodnej logiky.
- Použite testovacie údaje, ktoré sa podobajú výrobným údajom.
- Izolujte svoj kód. Ak váš kód závisí od údajov z databázy, nepíšte testovací prípad, ktorý by zavolal do databázy a získal hodnoty. Namiesto toho vytvorte rozhranie a zosmiešnite hovory API a databázy.
- Pred odstránením chyby vzniknutej pri testovaní jednotky napíšte testovací prípad, ktorý chybu odhalil. Existujú tri dôvody:
- Budete schopní zachytiť regresné chyby, ktoré vzniknú z vašej opravy.
- Váš testovací prípad je teraz komplexnejší.
- Vývojár je často príliš lenivý na to, aby aktualizoval svoje testovacie prípady po ich napísaní.
- Okrem písania testovacích prípadov, ktoré overujú obchodnú logiku, píšu aj prípady, ktoré testujú výkonnosť vášho kódu. Najmä v prípade, keď kódy zahŕňajú opakovanie, výkon je najviac ovplyvnená oblasť.
Čo je potrebné pamätať
- Prípady jednotkových testov by mali byť nezávislé
- Kód, ktorý sa má testovať - Akákoľvek zmena v kóde by nemala vyžadovať zmenu v prípade testu jednotky, pokiaľ sa nezmení samotná obchodná logika. Napríklad, ak logika teraz vyžaduje, aby platné telefónne číslo malo vždy začínať „+“, potom je potrebné zmeniť testovací prípad jednotky, inak nie.
- Druhý kód - nemala by existovať žiadna interakcia alebo závislosť s inou časťou kódu alebo hodnoty databázy alebo s inou takou vecou. Jednotka by mala byť pri testovaní izolovaná.
- Pri testovacích prípadoch postupujte podľa jasných a konzistentných konvencií pomenovávania. Uľahčuje sledovanie scenárov. Na sledovanie svojich testovacích prípadov môžete použiť aj nástroje na správu verzií.
- Nikdy neodovzdajte kód do ďalšej fázy, kým sa tak nestane, chyby nie sú opravené a znovu testované.
- Najdôležitejšie je urobiť zo zvyku. Toto je prax kódovania, ktorú je potrebné vštepovať. Čím viac kódu kódujete bez testovania jednotky, tým je kód náchylnejší k chybám.
Kariéra v testovaní jednotiek
Aj keď testovanie jednotiek nie je pole ako celok, je to ďalší šíp vo vašom toulci. Je to dobrý kódovací postup a kedy nie sú preferovaní dobrí kódovači?
záver
Je nesporné, že testovanie jednotiek môže byť niekedy niekedy jednoduché a zložité. To je, keď nástroje a rámce prídu na vašu záchranu. Aj keď je testovanie jednotky hotové, kód nie je úplne odolný voči chybám. Vtedy sa začnú postupy testovania na ďalšej úrovni. Medzi všetkými týmito neistotami je jediné, čo je isté, že je potrebné testovanie jednotiek.
Odporúčané články
Toto bol návod na testovanie jednotky. Tu sme diskutovali s príkladmi o dôležitosti, tipoch, nástrojoch, kariére a typoch testovania jednotiek. Viac informácií nájdete aj v ďalších navrhovaných článkoch -
- Testovanie otázok rozhovoru
- Webová testovacia aplikácia
- Životný cyklus defektov pri testovaní softvéru
- Kariéra v testovaní softvéru
- Zoznam testovacích rámcov pre Java