Preskočiť na obsah

JUnit

z Wikipédie, slobodnej encyklopédie
JUnit

Logo
Základné informácie
AutorKent Beck, Erich Gamma
VývojárKent Beck, Erich Gamma
Uvedenie1997
Posledná stabilná verzia6.1.3 (7. augusta 2026[1])
Vyvinutý vJava
Operačný systémmultiplatformový
Typ softvérunástroj na unit testing
LicenciaEclipse Public License 2.0[2]
Ďalšie odkazy
Webová stránkajunit.org

Pozri aj Informačný portál

JUnit je softvérový framework na automatizované testovanie programov v programovacom jazyku Java. Často sa používa na unit testing (testovanie jednotlivých častí programu) a patrí do rodiny testovacích frameworkov xUnit.

JUnit sa k programu pripája pri kompilácii ako archív JAR. Najnovšia verzia frameworku, JUnit 6, má triedy a anotácie v balíku org.junit.jupiter.[3] Predchádzajúce verzie JUnit 4[4] a JUnit 3 boli v balíkoch org.junit a junit.framework.

Prieskum z roku 2013, ktorý zahŕňal 10 000 projektov v Jave na GitHube, zistil, že JUnit bol najpoužívanejším testovacím frameworkom a najrozšírenejšie externé knižnice používalo približne 30 % projektov.[5]

Životný cyklus testu

[upraviť | upraviť zdroj]

Každá testovacia trieda v JUnite má zvyčajne niekoľko testovacích prípadov. Tie podliehajú životnému cyklu testu, ktorý má tri hlavné fázy:[6]

  1. Fáza prípravy – pripravuje sa infraštruktúra testu. Príprava je možná na dvoch úrovniach. Prvou je príprava na úrovni triedy, pri ktorej sa vytvorí výpočtovo náročný objekt, napríklad pripojenie k databáze, a ten sa potom s minimálnymi vedľajšími účinkami opakovane používa. Príprava na úrovni triedy sa zapisuje anotáciou @BeforeAll. Druhou je príprava pred každým testovacím prípadom, na ktorú slúži anotácia @BeforeEach.[6]
  2. Vykonanie testu – v tejto fáze sa test spustí a overí sa jeho výsledok, ktorý ukáže, či test prešiel, alebo zlyhal. Používa sa tu anotácia @Test.[6]
  3. Záverečná fáza (clean up) – po vykonaní všetkých testov môže byť potrebné systém upratať. Podobne ako pri príprave existuje aj upratovanie na úrovni triedy, ktoré sa zapisuje anotáciou @AfterAll. Anotácia @AfterEach umožňuje upratovanie po každom vykonanom teste.[6]

Integrácia s ďalšími nástrojmi

[upraviť | upraviť zdroj]

JUnit 6 sa dá prepojiť s viacerými nástrojmi, napríklad s nástrojmi na zostavovanie (build tools), integrovanými vývojovými prostrediami (IDE) či nástrojmi na priebežnú integráciu (continuous integration, CI).[7]

Nástroje na zostavovanie

[upraviť | upraviť zdroj]

JUnit podporuje nástroje na zostavovanie Apache Ant, Apache Maven a Gradle, ktoré patria k najpoužívanejším nástrojom na zostavovanie projektov.[8] Tieto nástroje sú nevyhnutné na automatizáciu zostavovania projektu.[7]

Apache Ant (skrátene Ant) patrí k najvšestrannejším nástrojom na zostavovanie a z troch uvedených nástrojov má najdlhšiu históriu.[9] Jeho základom je súbor build.xml, v ktorom sa nastavujú úlohy potrebné na spustenie projektu.[9] Ant má aj rozšírenie Apache Ivy, ktoré pomáha riešiť závislosti; závislosti projektu sa deklarujú v súbore ivy.xml.

Na rozdiel od Antu používa Apache Maven (skrátene Maven) pri zostavovaní štandardizovaný a jednotný prístup.[10] Pri správe závislostí sa riadi zásadou „konvencia pred konfiguráciou“ (convention over configuration).[11] Zdrojový kód v Jave sa nachádza v adresári src/main/java a testovacie súbory v adresári src/test/java.[11] Maven sa dá použiť pre akýkoľvek projekt v Jave.[10] Používa objektový model projektu (Project Object Model, POM), teda prístup k nastaveniu krokov zostavovania založený na XML.[10] Minimálny súbor pom.xml musí obsahovať zoznam závislostí a jedinečný identifikátor projektu.[10] Aby Maven fungoval, musí byť dostupný v ceste zostavovania (build path).[10] S JUnitom 5 a novšími verziami sa dá Maven prepojiť pomocou zásuvného modulu jacoco-maven-plugin, ktorý testy JUnitu podporuje bez ďalšieho nastavovania.[12] Na jednotlivé úlohy sa dajú zadať rôzne ciele (goals) Mavenu.[12]

Bližšie informácie v hlavnom článku: Gradle

Gradle je nástroj na zostavovanie, ktorý preberá mnohé koncepty svojich predchodcov Antu a Mavenu.[11] Kroky potrebné na zostavenie projektu sa deklarujú v súbore build.gradle.[11] Na rozdiel od Antu a Mavenu, ktoré sú založené na XML, Gradle používa jazyk Groovy založený na Jave a XML nepotrebuje.[11] Gradle sa však drží Mavenovej zásady „konvencia pred konfiguráciou“ a rovnakej štruktúry adresárov src/main/java a src/test/java.[11] S JUnitom 5 a novšími verziami sa Gradle prepája nastavením zásuvného modulu jacoco spolu so zásuvným modulom junit-platform, ktorý dodáva tím JUnitu.[13]

Model rozšírení

[upraviť | upraviť zdroj]

JUnit sa riadi zásadou, že body rozšírenia majú prednosť pred novými funkciami.[14] Tím JUnitu sa rozhodol nedávať všetky funkcie do jadra JUnitu, ale poskytnúť vývojárom rozšíriteľný spôsob, ako si svoje potreby vyriešiť sami.[14]

V JUnite 4 existujú dva mechanizmy rozšírení: Runner API a Rule API.[15] Oba majú nevýhody.

Hlavným obmedzením Runner API je, že vývojár musí implementovať celý životný cyklus testu, aj keď potrebuje iba jednu jeho fázu.[15] To je pre väčšinu prípadov použitia príliš zložité a ťažkopádne.[15] Ďalším obmedzením je, že pre jeden testovací prípad sa dá použiť iba jedna trieda typu runner, takže runnery sa nedajú kombinovať.[15] Napríklad runnery Mockito a Parameterized nemožno použiť spolu v tej istej testovacej triede.[15]

Hlavným obmedzením Rule API je, že nedokáže riadiť celý životný cyklus testu, a preto sa na niektoré prípady použitia nehodí.[15] Pravidlá (rules) sa hodia iba na operácie, ktoré sa majú vykonať pred vykonaním testu alebo po ňom.[15] Ďalším obmedzením je, že pravidlá na úrovni triedy a na úrovni metódy treba definovať osobitne.[15]

V JUnite 5 a novších verziách sa rozhranie rozšírení nachádza v module JUnit Jupiter Engine.[16] Tím JUnitu chce vývojárom umožniť napojiť sa na jednotlivé fázy životného cyklu testu prostredníctvom jediného jednotného rozhrania rozšírení.[16] Keď Jupiter Engine dosiahne určitú fázu životného cyklu, zavolá všetky rozšírenia zaregistrované pre túto fázu.[16] Vývojár sa môže napojiť na päť hlavných bodov rozšírenia:[16]

  1. Spätné volania životného cyklu testu (test lifecycle callbacks) – umožňujú vykonať kód v určitých fázach životného cyklu testu.[17]
  2. Dodatočné spracovanie inštancie testu (test instance post-processing) – umožňuje napojiť sa na fázu vytvárania inštancie testu prostredníctvom rozhrania TestInstancePostProcessor.[18]
  3. Podmienené vykonanie testu (conditional test execution) – test sa vykoná iba vtedy, ak sú splnené určité podmienky.[19]
  4. Rozlišovanie parametrov (parameter resolution) – umožňuje vkladať parametre do testovacích metód alebo konštruktorov.
  5. Spracovanie výnimiek (exception handling) – umožňuje zmeniť správanie testu v reakcii na výnimku namiesto toho, aby test rovno zlyhal.[20]

Príklad testovacej triedy

[upraviť | upraviť zdroj]

Testovacia trieda JUnitu (test fixture) je objekt v Jave. Testovacie metódy musia byť označené anotáciou @Test. Ak si to situácia vyžaduje,[21] možno definovať aj metódu, ktorá sa vykoná pred každou testovacou metódou (alebo po nej), prípadne pred všetkými (alebo po všetkých), a to anotáciami @BeforeEach (alebo @AfterEach) a @BeforeAll (alebo @AfterAll).[22][6]

import org.junit.jupiter.api.*;

class FoobarTests {
    @BeforeAll
    static void setUpClass() throws Exception {
        // kód vykonaný pred prvou testovacou metódou
    }

    @BeforeEach
    void setUp() throws Exception {
        // kód vykonaný pred každým testom
    }

    @Test
    void oneThing() {
        // kód, ktorý testuje jednu vec
    }

    @Test
    void anotherThing() {
        // kód, ktorý testuje inú vec
    }

    @Test
    void somethingElse() {
        // kód, ktorý testuje ešte niečo iné
    }

    @AfterEach
    void tearDown() throws Exception {
        // kód vykonaný po každom teste
    }

    @AfterAll
    static void tearDownClass() throws Exception {
        // kód vykonaný po poslednej testovacej metóde
    }
}

Staršie verzie

[upraviť | upraviť zdroj]

Podľa Martina Fowlera, jedného z prvých používateľov JUnitu:[23]

„ JUnit sa zrodil počas letu z Zürichu na konferenciu OOPSLA v Atlante v roku 1997. Kent letel s Erichom Gammom a čo iné majú dvaja geekovia robiť na dlhom lete, ako programovať? Prvá verzia JUnitu vznikla práve tam – programovaná v pároch a s testami napísanými vopred (príjemná forma metacirkulárneho geekovstva). “
– Martin Fowler

Vďaka rozšírenosti JUnitu zostávajú obľúbené aj jeho staršie verzie: v októbri 2021 malo JUnit 4 v centrálnom repozitári Mavenu (Maven Central) viac ako 100 000 použití inými softvérovými komponentmi.[24]

V JUnite 4 sa anotácie spätných volaní pri vykonávaní testov nazývali @BeforeClass, @Before, @After a @AfterClass, kým v JUnite 5 sú to @BeforeAll, @BeforeEach, @AfterEach a @AfterAll.[22][6]

V JUnite 3 museli testovacie prípravky dediť od triedy junit.framework.TestCase.[25] Názvy testovacích metód navyše museli začínať predponou test.[26]

Referencie

[upraviť | upraviť zdroj]
  1. ↑ JUnit Releases [online]. GitHub, [cit. 2026-10-22]. Dostupné online. (po anglicky)
  2. ↑ Change license to EPL v2.0 [online]. GitHub, 2017-09-07, [cit. 2021-02-04]. Dostupné online. (po anglicky)
  3. ↑ Migrating from JUnit 4 [online]. junit.org, [cit. 2026-10-22]. Dostupné online. (po anglicky)
  4. ↑ Gulati & Sharma 2017, s. 144, kap. 8.
  5. ↑ We Analyzed 30,000 GitHub Projects – Here Are The Top 100 Libraries in Java, JS and Ruby [online]. [cit. 2014-02-09]. Dostupné online. Archivované 2014-07-09 z originálu. (po anglicky)
  6. 1 2 3 4 5 6 Gulati & Sharma 2017, s. 37–40, kap. 2.
  7. 1 2 Gulati & Sharma 2017, s. 99, kap. 6.
  8. ↑ Gulati & Sharma 2017, s. 99–117, kap. 6.
  9. 1 2 Gulati & Sharma 2017, s. 108–112, kap. 6.
  10. 1 2 3 4 5 Gulati & Sharma 2017, s. 104–108, kap. 6.
  11. 1 2 3 4 5 6 Gulati & Sharma 2017, s. 99–103, kap. 6.
  12. 1 2 Gulati & Sharma 2017, s. 115, kap. 6.
  13. ↑ Gulati & Sharma 2017, s. 113–114, kap. 6.
  14. 1 2 Gulati & Sharma 2017, s. 121, kap. 7.
  15. 1 2 3 4 5 6 7 8 Gulati & Sharma 2017, s. 121–122, kap. 7.
  16. 1 2 3 4 Gulati & Sharma 2017, s. 122–124, kap. 7.
  17. ↑ Gulati & Sharma 2017, s. 124–126, kap. 7.
  18. ↑ Gulati & Sharma 2017, s. 126–127, kap. 7.
  19. ↑ Gulati & Sharma 2017, s. 127, kap. 7.
  20. ↑ Gulati & Sharma 2017, s. 129, kap. 7.
  21. ↑ BECK, Kent. Expensive Setup Smell [online]. C2 Wiki, [cit. 2011-11-28]. Dostupné online. (po anglicky)
  22. 1 2 Writing Tests [online]. junit.org, [cit. 2026-10-22]. Dostupné online. (po anglicky)
  23. ↑ FOWLER, Martin. bliki: Xunit [online]. martinfowler.com, 2006-01-17, [cit. 2022-03-07]. Dostupné online. (po anglicky)
  24. ↑ JUnit [online]. mvnrepository.com, [cit. 2021-10-29]. Dostupné online. (po anglicky)
  25. ↑ BECK, Kent; GAMMA, Erich. JUnit Cookbook [online]. junit.sourceforge.net, [cit. 2011-05-21]. Dostupné online. Archivované 2020-06-15 z originálu. (po anglicky)
  26. ↑ SHARP, Charles A.. Migrating from JUnit 3 to JUnit 4: Nothing But Good News [online]. Object Computing, Inc., 2007-08, [cit. 2021-02-04]. Dostupné online. Archivované 2026-02-14 z originálu. (po anglicky)

Literatúra

[upraviť | upraviť zdroj]

Externé odkazy

[upraviť | upraviť zdroj]

Tento článok je čiastočný alebo úplný preklad článku JUnit na anglickej Wikipédii.