Písanie špecifikácií s Kotlinom a Spekom

1. Úvod

Špecifikácia Testovacie rámce sú doplnkom k Unit Testing rámcom pre testovanie našich aplikácií.

V tomto tutoriáli si predstavíme rámec Spek - rámec testovania špecifikácií pre Java a Kotlin.

2. Čo je testovanie špecifikácií?

Zjednodušene povedané, v Testovaní špecifikácií začneme so špecifikáciou a popíšeme zámer softvéru namiesto jeho mechaniky.

Toto sa často využíva pri vývoji riadenom správaním, pretože zámerom je overiť systém podľa preddefinovaných špecifikácií našej aplikácie.

Medzi bežne známe rámce na testovanie špecifikácií patria Spock, Cucumber, Jasmine a RSpec.

2.1. Čo je to Spek?

Spek je rámec pre špecifikáciu testovania JLM založený na Kotlinovi. Je navrhnutý tak, aby fungoval ako testovací modul JUnit 5. To znamená, že ho môžeme ľahko zapojiť do každého projektu, ktorý už používa JUnit 5 na spustenie popri akýchkoľvek ďalších testoch, ktoré by sme mohli mať.

Testy je tiež možné spustiť pomocou staršieho rámca JUnit 4, v prípade potreby pomocou závislosti platformy JUnit Platform Runner.

2.2. Maven závislosti

Ak chcete používať program Spek, musíme do našej zostavy Maven pridať požadované závislosti:

 test org.jetbrains.spek spek-api 1.1.5 test org.jetbrains.spek spek-junit-platform-engine 1.1.5 

The spek-api závislosť je skutočné API použité pre testovací rámec. Definuje všetko, s čím budú naše testy pracovať. The spek-junit-platforma-motor závislosť je potom testovací modul JUnit 5 potrebný na vykonanie našich testov.

Upozorňujeme, že všetky závislosti typu Spek musia mať rovnakú verziu. Najnovšiu verziu nájdete tu.

2.3. Prvý test

Po nastavení programu Spek je písanie testov jednoduchým prípadom zápisu správnej triedy do správnej štruktúry. Je to trochu neobvyklé, aby bolo čitateľnejšie.

Spek vyžaduje, aby všetky naše testy dedili z príslušnej nadtriedy - zvyčajne Spek - a že naše testy implementujeme odovzdaním bloku konštruktorovi tejto triedy:

trieda FirstSpec: Spek ({// Implementujte test tu})

3. Testovacie štýly

Test špecifikácií kladie dôraz na písanie testov čo najčitateľnejším spôsobom. Napríklad uhorka napíše celý test v ľudsky čitateľnom jazyku a potom ho spojí s krokmi, aby bol kód vedený oddelene.

Program Spek pracuje pomocou špeciálnych metód, ktoré fungujú ako čitateľné reťazce, z ktorých každý dostane blok, ktorý sa má vykonať podľa potreby. Existuje niekoľko variácií, aké funkcie používame, v závislosti od spôsobu, akým chceme, aby testy čítali.

3.1. daný/na/to

Jedným zo spôsobov, ako môžeme písať naše testy, je štýl „dané / zapnuté“.

Toto používa metódy tzv daný, na a to, vložené do tejto štruktúry, aby sme napísali naše testy:

  • daný - stanovuje počiatočné podmienky pre skúšku
  • na - vykonať testovaciu akciu
  • to - tvrdiť, že testovacia akcia prebehla správne

Môžeme mať toľko z každého bloku, koľko potrebujeme, ale musíme ich vnoriť v tomto poradí:

trieda CalculatorTest: Spek ({given ("A calculator") {val calculator = Calculator () on ("Adding 3 and 5") {val result = calculator.add (3, 5) it ("Produces 8") {assertEquals (8, výsledok)}}}})

Tento test sa číta veľmi ľahko. Ak sa zameriame na kroky testu, môžeme si ho prečítať ako „Vzhľadom na kalkulačku, po pridaní 3 a 5 vyprodukuje 8“.

3.2. opísať/to

Ďalším spôsobom, ako môžeme písať naše testy, je štýl „opíš / opíš“. Namiesto toho sa použije táto metóda opísať pre všetky vnorenia a naďalej používa to pre naše tvrdenia.

V tomto prípade môžeme vnoriť opísať metód, koľko potrebujeme na napísanie našich testov:

trieda CalculatorTest: Spek ({describe ("A calculator") {val calculator = Calculator () describe ("Addition") {val result = calculator.add (3, 5) it ("Produkuje správnu odpoveď") {assertEquals ( 8, výsledok)}}}})

V testoch používajúcich tento štýl je presadzovaná menšia štruktúra, čo znamená, že pri písaní testov máme oveľa väčšiu flexibilitu.

Bohužiaľ, nevýhodou je, že testy nečítajú tak prirodzene, ako keď používame „dané / zapnuté“.

3.3. Ďalšie štýly

Spek nepresadzuje tieto štýly a umožní vzájomnú zámenu kľúčových slov, ako je potrebné. Jedinou požiadavkou je, aby všetky tvrdenia existovali vo vnútri to a že na tejto úrovni sa nenájdu žiadne ďalšie bloky.

Celý zoznam vnorených kľúčových slov, ktoré sú k dispozícii, je:

  • daný
  • na
  • opísať
  • kontext

Pomocou nich môžeme dať našim testom najlepšiu možnú štruktúru pre to, ako ich chceme napísať.

3.4. Testy založené na dátach

Mechanizmus používaný na definovanie testov nie je nič iné ako jednoduché volanie funkcií. To znamená, že s nimi môžeme robiť aj iné veci, ako každý normálny kód. Najmä ich môžeme nazvať dátovo riadeným spôsobom, ak si to prajeme.

Najjednoduchší spôsob, ako to urobiť, je prepísať dáta, ktoré chceme použiť, a zavolať príslušný blok z tejto slučky:

trieda DataDrivenTest: Spek ({describe ("A data driven test") {mapOf ("hello" to "HELLO", "world" to "WORLD"). forEach {input, expect -> describe ("Capitalizing $ input") {it ("Správne vráti $ expect") {assertEquals (expect, input.toUpperCase ())}}}})

Ak to bude potrebné, môžeme robiť najrôznejšie veci, ale to je pravdepodobne najužitočnejšie.

4. Tvrdenia

Spek nepredpisuje žiadny konkrétny spôsob použitia tvrdení. Namiesto toho umožňuje nám to použiť akýkoľvek rámec presadzovania, ktorý nám najviac vyhovuje.

Zrejmou voľbou bude org.junit.jupiter.api. Tvrdenia triedy, pretože už ako testovací bežec používame rámec JUnit 5.

Môžeme však použiť aj ktorúkoľvek inú knižnicu tvrdení, ktorú chceme, ak vylepšuje naše testy - napríklad Kluent, Expekt alebo HamKrest.

Výhoda použitia týchto knižníc namiesto štandardného JUnit 5 Tvrdenia triedy závisí od čitateľnosti testov.

Napríklad vyššie uvedený test prepísaný pomocou Kluentu znie ako:

trieda CalculatorTest: Spek ({description ("A calculator") {val calculator = Calculator () describe ("Addition") {val result = calculator.add (3, 5) it ("Produkuje správnu odpoveď") {result shouldEqual 8}}}})

5. Pred / po manipulátoroch

Rovnako ako u väčšiny testovacích rámcov, Spek môže tiež vykonávať logiku pred / po testoch.

Jedná sa presne o bloky, ktoré sa vykonávajú pred alebo po samotnom teste.

Možnosti sú tu:

  • beforeGroup
  • afterGroup
  • beforeEachTest
  • afterEachTest

Môžu byť umiestnené v ktoromkoľvek z vnorených kľúčových slov a budú sa vzťahovať na všetko vo vnútri tejto skupiny.

Ako Spek funguje, všetok kód vo vnútri ktoréhokoľvek z kľúčových slov vnorenia sa vykoná okamžite na začiatku testu, ale riadiace bloky sa vykonajú v konkrétnom poradí sústredenom okolo to blokov.

Spek bude pracovať zvonku, každý vykoná beforeEachTest blokuj bezprostredne pred každým to blok vnorený do rovnakej skupiny a každý z nich afterEachTest blokovať ihneď po každom to blokovať. Rovnako tak Spek vykoná každého beforeGroup blokujte bezprostredne pred každou skupinou a každou afterGroup blok okamžite po každej skupine v aktuálnom vnorení.

Toto je komplikované a najlepšie sa to vysvetľuje príkladom:

trieda GroupTest5: Spek ({describe ("Outer group") {beforeEachTest {System.out.println ("BeforeEachTest 0")} beforeGroup {System.out.println ("BeforeGroup 0")} afterEachTest {System.out.println ( "AfterEachTest 0")} afterGroup {System.out.println ("AfterGroup 0")} description ("Vnútorná skupina 1") {beforeEachTest {System.out.println ("BeforeEachTest 1")} beforeGroup {System.out.println ("BeforeGroup 1")} afterEachTest {System.out.println ("AfterEachTest 1")} afterGroup {System.out.println ("AfterGroup 1")} it ("Test 1") {System.out.println (" Test 1 ")}}}})

Výstupom spustenia vyššie uvedeného je:

BeforeGroup 0 BeforeGroup 1 BeforeEachTest 0 BeforeEachTest 1 Test 1 AfterEachTest 1 AfterEachTest 0 AfterGroup 1 AfterGroup 0

Hneď vidíme, že vonkajší beforeGroup / afterGroup bloky sú okolo celej sady testov, zatiaľ čo vnútorné beforeGroup / afterGroup bloky sú iba okolo testov v rovnakom kontexte.

Vidíme tiež, že všetky beforeGroup bloky sa vykonajú skôr beforeEachTest bloky a opak pre afterGroup / afterEachTest.

Väčší príklad toho, ktorý ukazuje interakciu medzi viacerými testami vo viacerých skupinách, je možné vidieť na GitHub.

6. Testované subjekty

Mnohokrát napíšeme jednu špecifikáciu pre jeden testovaný subjekt. Spek ponúka pohodlný spôsob, ako to napísať, aby za nás automaticky spravoval testovaný predmet. Používame SubjectSpek základná trieda namiesto Spek triedy za toto.

Keď to použijeme, musíme vyhlásiť hovor na predmet blok na najvzdialenejšej úrovni. To definuje testovanú osobu. Na toto sa potom môžeme odvolať z ktoréhokoľvek z našich testovacích kódov ako predmet.

To môžeme použiť na prepísanie nášho predchádzajúceho testu kalkulačky nasledovne:

trieda CalculatorTest: SubjectSpek ({subject {Calculator ()} describe ("A calculator") {describe ("Addition") {val result = subject.add (3, 5) it ("Produces the correct answer") {assertEquals ( 8, výsledok)}}}})

Možno sa to nezdá, ale môže to pomôcť, aby boli testy oveľa čitateľnejšie, najmä keď je potrebné vziať do úvahy veľké množstvo testovacích prípadov.

6.1. Maven závislosti

Ak chcete použiť rozšírenie predmetu, musíme do našej zostavy Maven pridať závislosť:

 org.jetbrains.spek test spek-subject-extension 1.1.5 

7. Zhrnutie

Spek je výkonný rámec umožňujúci niekoľko veľmi dobre čitateľných testov, čo znamená, že ich môžu čítať všetky časti organizácie.

To je dôležité, aby sme všetkým kolegom umožnili prispievať k testovaniu celej aplikácie.

Nakoniec, útržky kódu, ako vždy, nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found