JUnit je platforma pro testování jednotek s otevřeným zdrojovým kódem třetí strany. Projekt zahájili Kent Beck a Erich Gamma na konci roku 1995. Rychle vzbudil zájem v komunitě vývojářů, kteří se zabývají zejména testováním řízeným vývojem. JUnit byl původně představen na Smalltalk, ale později byl portován na Javu, která to rychle převzala jako de-facto standard testování jednotek. Popularita JUnit vzrostla do té míry, že pro uspokojení potřeb mnoha dalších současných jazyků, jako je C#, Perl, Python, PHP, Ruby, Visual Basic, C++ atd., byl vyvinut obecný rámec xUnit, kde písmeno 'x' je nahrazeno prvním písmenem jazyka, například JUnit pro Javu, RUnit pro Ruby a tak dále. Tento článek poskytuje přehled tohoto rámce, jak je používán de facto standardem testování jednotek Java.
Přehled testování
Testování je důležitou fází životního cyklu vývoje aplikace. Hlavním účelem testování je vyhodnotit program na základě požadovaných specifikací. Cílem je vytvořit určité testovací případy, které co nejvíce odhalí chyby, mezery, jakékoli nesrovnalosti nebo neočekávané výsledky. S tímto jednoduchým konceptem jsou spojeny některé propracované procesy. Ale stručně řečeno, děje se to na třech úrovních. Když se testování provádí na velmi podrobné úrovni nebo na úrovni jednotlivých komponent, nazývá se Unit Testing; když jsou zkombinovány za účelem kontroly rozhraní mezi komponentami oproti návrhu softwaru, nazývá se to testování integrace; a nakonec, když je celý systém integrován a je provedeno testování, aby se ověřilo, že systém jako celek splňuje zadaný požadavek, nazývá se Testování systému .
Testování jednotek
Stručně řečeno, provedení testu jednotky je způsob, jak prozkoumat chování odlišné jednotky kódu. V Javě jednotka kódu může znamenat metodu nebo třídu nebo dokonce modul, podle kontextu. Pokud se jedná například o metodu, těžištěm testu je vyhodnocení správného odkazu na objekt, který umožňuje vyvolat metodu, typ parametrů a přijatelných hodnot, rozsahy primitivních hodnot, návratový typ a hodnota atd. Záměrem je ogrilovat metodu tak, aby mohla být dostatečně robustní, aby elegantně zvládla svůj problém a vyloučila ty, které jsou mimo její rozsah, mimo plnění smlouvy.
Unit testování proto tvoří základní stavební kámen jakéhokoli hodnocení programu. Ve skutečnosti každý programátor při psaní kódu provádí nějaký druh testování jednotek, aby zkontroloval výsledek kódu pomocí nějakých falešných dat/případů. Jednotkové testování je tedy formální status daný této izolované sbírce testů. Je nesmírně důležité, aby kód prošel přísností různých fází testování. Testování jednotek je kromě důležitosti také velmi běžné. Lidé jako Kent Beck a Erich Gamma mysleli na vytvoření rámce pro to, aby programátoři získali strukturované prostředí a mohli automatizovat mnoho z těchto úkolů. Ostatně k tomu slouží framework. Obvykle poskytuje koherentní programovou strukturu, která je opakovaně použitelná a sdílená napříč aplikacemi. Programátor je může začlenit do stávající aplikace a rozšířit je podle svých konkrétních potřeb.
Rychlý příklad
Jednoduchý jednotkový testovací kód k prozkoumání jedné metody v Teplota třídy bez použití rámce JUnit je následující:
package org.mano.unittest.examples; public class Circle { double area(double radius) { returnMath.PI* radius * radius; } }
Nyní napíšeme kód pro testování jednotky oblasti metoda.
package org.mano.unittest.examples; public class CircleTest { public int errCounter= 0; public void testCircleArea() { Circle circle = new Circle(); double area = circle.area(12); if (area < 452 && area > 453) { throw new IllegalStateException("Wrong calculation!: " + area); } } public static void main(String[] args) { TestCircle test = new TestCircle(); try { test.testCircleArea(); } catch (Throwable e) { test.errCounter++; e.printStackTrace(); } if (test.errCounter> 0) { throw new IllegalStateException("There were " + test.errCounter+ " error(s)"); } } }
Toto je základní příklad, ale dává vám představu o tom, jak lze testování jednotek provádět bez použití jakéhokoli rámce.
Junit Testing Framework
Použití rámce JUnit pro testování jednotek má několik výhod. Poskytuje četné anotace, které usnadňují psaní a spouštění testovacích kódů v Javě:
- Především odděluje starost o testování jednotek od skutečného kódu projektu tím, že umožňuje vytvořit instanci testovací třídy a zavaděče třídy pro každý test jednotky. Tyto „imunitní“ stávající kód před zbytečnými vedlejšími účinky testování.
- Anotace poskytované společností JUnit – například @Before, @After, @BeforeClass, @AfterClass —mít metody jak pro inicializaci zdrojů, tak pro rekultivaci zdrojů.
- Existuje široká škála metod tvrzení k ověření výsledku testu.
- Během let se JUnit stala tak populární, že četné Java nástroje, jako je Ant a Maven; a populární IDE, jako je Eclipse , NetBeans , IntelliJ NÁPAD , a podobně, přichází s vestavěnou integrací JUnit.
Chcete-li použít JUnit Test Framework v projektu Java, musíte přidat soubor JUnit JAR do cesty třídy projektu. To je výslovně vyžadováno, pokud IDE není integrováno s knihovnou JUnit. Postup je jednoduchý. Stáhněte si soubor JAR a přidejte jej do cesty třídy projektu.
Zde jsou některé důležité odkazy na rámec JUnit.
- Oficiální stránky JUnit
- JUnit Java API
- Uživatelská příručka JUnit
- Zdrojový kód JUnit na GitHubu
Na rozdíl od JUnit 4 a jejích předchůdců přinesl JUnit 5 některé významné změny. Kromě mnoha přidaných nových funkcí – jako je podpora lambda, nové anotace a vkládání parametrů testovací metody – doznala základní architektura výrazných změn. JUnit 5 je nyní složená architektura tří různých modulů:JUnit Jupiter, JUnit Vintage a JUnit Platform. Vývojáři testovacích případů se však nemusí obtěžovat složitostí změn. Změny znamenají především lepší podporu nástrojů, konzistenci a čistší API. Především je plně zpětně kompatibilní s JUnit 4. Takže ani tam se nemusíte bát. Další podrobnosti naleznete v uživatelské příručce JUnit 5.
Rychlý příklad
Zde je velmi jednoduchý příklad, který vám umožní nahlédnout do toho, jak lze testování jednotek provádět s rámcem JUnit. Používáme Zaměstnanec třídy pro unit test a vytvořte testovací třídu, abyste získali představu o jejím fungování. Tento příklad je základní v rozsahu psaní programu „Ahoj světe“. Testovací případy v reálném světě, nebo dokonce slušný příklad unit testů, vyžadují velké množství kódu. Možná to zkusíme v nějakém jiném článku.
package org.mano.unittest.examples; public class Employee { private final String name; private final double basicPay; public Employee(String name, double basicPay) { this.name=name; this.basicPay=basicPay; } public String getName() { return name; } public double getBasicPay() { return basicPay; } } package org.mano.unittest.examples; import org.junit.Test; import static org.junit.Assert.*; public class EmployeeTest { @Test public void constructorInitTest(){ Employee emp=new Employee("Odin", 2300); assertEquals("Odin", emp.getName()); assertEquals(2300, emp.getBasicPay(), 0.001); } } package org.mano.unittest.examples; public class EmployeeTestMain { public static void main(String[] args){ EmployeeTest et=new EmployeeTest(); et.constructorInitTest(); } }
Všimněte si, že třída Employee je neměnná pouze se dvěma poli nastavenými konstruktorem. Protože pouze metoda konstruktoru stojí za testování, otestujeme pouze to.
Testovací třída se jmenuje EmployeeTest podle úmluvy. Anotace @Test umožňuje JUnit určit metodu jako testovací metodu. Assert obsahuje různé metody tvrzení třída. Zde jsme použili pouze assertEquals .
Existuje mnoho způsobů, jak spustit test napsaný v JUnit. Obvykle po spuštění testovacích případů vytiskne souhrn. Může se však lišit v závislosti na tom, jak test probíhá. Může běžet přes IDE jako Eclipse nebo IntelliJ nebo nástroje jako Maven, Gradle a tak dále. Někdy je jedinou informací obdrženou po testu, že test buď selhal, nebo prošel.
Závěr
Existuje několik dalších rámců pro testování jednotek. JUnit je oblíbený rámec pro testování jednotek v komunitě Java. Testování jako fáze systémového inženýrství s sebou nese mnohem více procesů. Testování jednotek je jen jeho součástí a je zajímavé, že mnoho herních testů, které provádí vývojář, lze nazvat jako testování jednotek. JUnit jako testovací rámec k tomu přidává hodnotu. Anotace a rozhraní API poskytované JUnit automatizují mnoho úkolů a výrazně usnadňují život vývojářům unit testů.