2. diel - Testovanie vo VB.NET - Úvod do unit testov a príprava projektu
V minulej lekcii, Testovanie vo VB.NET - Úvod do testovania , sme si urobili pomerne solídny úvod do problematiky testovania vo VB .NET. Tiež sme si uviedli v-model, ktorý znázorňuje vzťah medzi jednotlivými výstupmi fáz návrhu a príslušnými testami.
V dnešnom tutoriále Testovania vo VB .NET sa budeme venovať jednotkovým testom (unit testy), ktoré testujú detailnú špecifikáciu aplikácie, teda jej triedy.
Unit testy píšeme vždy na základe návrhu, nie implementácie. Inými slovami, robíme ich na základe očakávanej funkčnosti. Tá môže byť buď priamo od zákazníka (v prípade akceptačných testov) alebo už od programátora (architekta). Vo funkčnosti je špecifikované, ako sa má ktorá metóda správať.
Nikdy nepíšeme testy podľa toho, ako je niečo vo vnútri naprogramované! Veľmi jednoducho by to mohlo naše myslenie zviesť iba tým daným spôsobom. Zabudli by sme na to, že metóde môžu prísť napríklad aj iné vstupy. A na tieto vstupy potom nebude pripravená. Testovanie s implementáciou v skutočnosti vôbec nesúvisí. Vždy testujeme či je splnené zadanie.
Aké triedy testujeme
Unit testy testujú jednotlivé metódy v triedach. Nemá veľký zmysel testovať jednoúčelové metódy napr. v modeloch, ktoré napr. iba niečo vyberajú z databázy. Aby sme boli konkrétnejší, nemá zmysel testovať metódu ako je táto:
Metóda pridáva položku do databázy. Typicky je použitá len v nejakom formulári. Pokiaľ by metóda nefungovala, zistí to akceptačné testy. Nová položka by sa neobjavila v zozname. Podobných metód je v aplikácii veľa. Zbytočne by sme strácali čas pokrývaním niečoho, čo ľahko pokryjeme v iných testoch.
Unit testy nájdeme najčastejšie pri knižniciach, ktoré programátor používa na viacerých miestach alebo dokonca vo viacerých projektoch. Keď použijeme nejakú knižnicu (napr. stiahnutú z GitHubu) veľmi pravdepodobne budú u nej aj testy.
Pokiaľ napr. píšeme aplikáciu, v ktorej často potrebujeme nejaké matematické výpočty (napr. faktoriály a ďalšie pravdepodobnostné funkcie), je samozrejmosťou vytvoriť si na tieto výpočty knižnicu. Je veľmi dobrý nápad pokryť takú knižnicu testy.
My si podobnú triedu vytvoríme a skúsime si ju otestovať. Aby sme sa nezdržiavali, budeme tvoriť iba jednoduchú kalkulačku. Tá bude vedieť:
- sčítať,
- odčítať,
- násobiť,
- deliť.
V praxi by v triede boli nejaké zložitejšie výpočty, ale tým sa tu
nebudeme zaoberať. Vytvorme si nový projekt typu
konzolová aplikácia s názvom KalkulackaApp
. Do
neho si pridáme verejnú (Public
) triedu
Kalkulacka
s nasledujúcou implementáciou:
Na kóde je zaujímavá iba
metóda Vydel()
vyvolávajúca výnimku v prípade, že delíme
nulou.
Menný priestor
UnitTesting
Vo VB .NET sa unit testy píšu pomocou nástrojov z menného priestoru
Microsoft.VisualStudio.TestTools.UnitTesting
. Visual Studio
poskytuje plnú podporu týchto testov. Do svojej aplikácie budeme pridávať
testy ako ďalší projekt do solution. Testy teda budú od projektu
úplne oddelené, čo je návrhovo veľká výhoda. Iba
nesmieme zabudnúť projekty prepojiť príslušnými
referenciami.
V okne Solution Explorer klikneme na Solution KalkulackaApp pravým tlačidlom a zvolíme Add -> New Project...
V ďalšom kroku vyberieme šablónu MSTest Test Project:
Neskôr zvolíme názov projektu s testami, ktorý sa
spravidla zostavuje ako názov projektu aplikácie + slovo Tests
. V
našom prípade teda KalkulackaAppTests
:
A nakoniec potvrdíme typ frameworku NET 6.0:
Do testovacieho projektu teraz musíme pridať referenciu na
projekt s aplikáciou, aby sme mohli pristupovať k príslušným triedam. To
urobíme kliknutím pravým tlačidlom na projekt
KalkulackaAppTests
a zvolením Add -> Project
Reference...:
V nasledujúcom formulári vyberieme záložku Projects ->
Solution a zaškrtneme projekt KalkulackaApp
. Dialóg
potvrdíme, čím si sprístupníme triedu Kalkulacka
:
V projekte KalkulackaAppTest
sa nám vygeneroval nový súbor
UnitTest1.cs
s nasledujúcim kódom:
V objektovom VB.NET je test triedy (scenár) reprezentovaný aj triedou a jednotlivé testy sú reprezentované metódami.
S atribútmi (lomenými zátvorkami nad metódami a
triedami) sme sa už v seriáli stretli. Atribút <TestClass>
tu označuje testovací scenár. Atribútom
<TestMethod>
vidíme označené metódy, ktoré reprezentujú
jednotlivé testy (budú automaticky spúšťané Visual
Studiom). Triedu UnitTest1
(aj jej súbor) si premenujeme na
KalkulackaTests
, pretože bude obsahovať testy pre triedu
Kalkulacka
.
Pokrytie triedy testy
V unit testoch môžeme použiť ešte niekoľko ďalších atribútov. My
teraz využijeme atribút <TestInitialize>
a pre názornosť
aj atribút <TestCleanup>
. Týmito atribútmi označujeme
metódy, ktoré sa zavolajú pred (resp. po každom teste) v
tejto triede. To je pre nás veľmi dôležité. Podľa best practices chceme,
aby boli testy nezávislé. Obvykle teda pred každým testom
pripravujeme znova to isté prostredie, aby sa testy vzájomne vôbec
neovplyvňovali. O dobrých praktikách sa zmienime neskôr detailnejšie.
Do triedy KalkulackaTests
si teraz najprv pridajme menný
priestor Imports KalkulackaApp
a potom Private
premennú kalkulacka
. V metóde s anotáciou
<TestInitialize>
si do premennej kalkulacka
vytvoríme novú kalkulačku pre každý test. Ak by ju bolo ešte potrebné
ďalej nastavovať (napr. vytvoriť ďalšie závislosti) boli by aj v tejto
metóde. Metódu TestMethod1()
odstránime.
Náš kód triedy KalkulackaTests
po zmenách vyzerá
nasledovne:
Máme všetko pripravené na pridávanie samotných testov.
V budúcej lekcii, Testovanie vo VB.NET - Dokončenie unit testov a best practices , pokryjeme triedu unit testy, vysvetlíme si
metódy na triede Assert
a naučíme sa testovať výnimky.
Spomenieme best practices.