[[oktatas:programozás:java:java_teszteles|< Java tesztelés]] ====== JUnit ====== * **Szerző:** Sallai András * Copyright (c) 2014, Sallai András * Szerkesztve: 2014, 2015 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Telepítés ===== A használatához telepíteni kell a junit4 csomagot: apt-get install junit4 Linuxon jelenleg csak egyetlen .jar kiterjesztésű állománnyal kell dolgoznunk. Telepítés után a helye: /usr/share/java/junit4.jar Vagy: /usr/share/java/junit4-4.10.jar Windows rendszerre, vagy ha legújabb JUnit csomagot akarjuk használni, látogassunk meg a JUnit weboldalát: * http://junit.org Windowson a következő két .jar kiterjesztésű fájlt kell beszereznünk: - junit - hamcrest-core Ha Netbeans használunk, az tartalmaz egy JUnit csomagot telepítve. ===== Háromszög területe kivétel megkövetelesésével ===== import org.junit.Test; import static org.junit.Assert.*; public class HaromszogTeszt { @Test public void tesztSzamitTerulet() { assertEquals(525, Haromszog.szamitTerulet(30, 35), 0); assertEquals(900, Haromszog.szamitTerulet(40, 45), 0); } @Test(expected = IllegalArgumentException.class) public void tesztExceptionSzamitTerulet() { Haromszog.szamitTerulet(0, 35); } } Windowsos Makefile: all: javac Haromszog.java JUNIT=c:\bin\SWScite\SWScite_0.5.2_20140505\javalibs\junit-4.11.jar HAMCREST=c:\bin\SWScite\SWScite_0.5.2_20140505\javalibs\hamcrest-core-1.3.jar test: javac -cp .;$(JUNIT);$(HAMCREST) HaromszogTeszt.java java -cp .;$(JUNIT);$(HAMCREST) org.junit.runner.JUnitCore HaromszogTeszt Linuxos makefile: all: javac Haromszog.java JUNIT=/usr/share/java/junit4.jar test: javac -cp .:$(JUNIT) HaromszogTeszt.java java -cp .:$(JUNIT) org.junit.runner.JUnitCore HaromszogTeszt class Haromszog { public static double szamitTerulet(int alap, int magassag) { if (alap <= 0 || magassag <= 0) { throw new IllegalArgumentException("Nem megfelelő paraméterek"); } return (alap * magassag) / 2; } public static void main(String[] args) { System.out.println(szamitTerulet(30, 45)); } } @echo off java Haromszog & pause #!/bin/bash java Haromszog && read ===== ExpectedException használata ===== A kivételek kezelhetők az ExceptedException osztállyal is: ... import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; ... @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void tesztExceptionSzamitTerulet() { thrown.expect(IllegalArgumentException.class); Haromszog.szamitTerulet(0, 35); } ... A kivétel tesztelő metódusban, azaz a tesztExceptionSzamitTerulet()-ban meg kell hívnunk egy olyan paraméterrel a tesztelt metódust, ami hibás paramétert tartalmaz. package haromszog; public class Haromszog { public static double szamitTerulet(int alap, int magassag) throws TulKisSzamException { if (alap <= 0 || magassag <= 0) { throw new TulKisSzamException("Túl kis számok"); } return (alap * magassag) / 2; } public static void main(String[] args) throws IOException { System.out.println(szamitTerulet(30, 45)); } } package haromszog; public class TulKisSzamException extends Exception { public TulKisSzamException(String msg){ super("Túl kis számok!"); } } Dobhattunk volna IllegalArgumentException-t is: throw new IllegalArgumentException("Illegális paraméter!"); Így nem kellett volna saját kivétel készíteni, de kellett volna kezelni mindenféle illegális paramétert azonnal. A HaromszogTest osztályban így nem kell eldobni a kivételeket. A teljes lista: package haromszog; import org.junit.Test; import static org.junit.Assert.*; public class HaromszogTest { @Test public void tesztSzamitTerulet() { assertEquals(525, Haromszog.szamitTerulet(30, 35), 0); assertEquals(900, Haromszog.szamitTerulet(40, 45), 0); } @Test(expected = IllegalArgumentException.class) public void tesztExceptionSzamitTerulet() { Haromszog.szamitTerulet(0, 35); } } package haromszog; public class Haromszog { public static double szamitTerulet(int alap, int magassag) { if (alap <= 0 || magassag <= 0) { throw new IllegalArgumentException("Nem megfelelő paraméterek"); } return (alap * magassag) / 2; } public static void main(String[] args) { System.out.println(szamitTerulet(43, 28)); } } Ebben a példában a teszteléshez külön osztályt készítettünk. A teszt futtatása a programfuttatástól egy külön esemény. A teszt fordítását és futtatását látjuk az alábbiakban: all: javac Haromszog.java JUNIT=/usr/share/java/junit4.jar test: javac -cp .:$(JUNIT) HaromszogTest.java java -cp .:$(JUNIT) org.junit.runner.JUnitCore HaromszogTest all: javac Calc.java JUNIT=c:\bin\SWScite\javalibs\junit-4.11.jar HAMCREST=c:\bin\SWScite\javalibs\hamcrest-core-1.3.jar test: javac -cp .;$(JUNIT);$(HAMCREST) CalcTest.java java -cp .;$(JUNIT);$(HAMCREST) org.junit.runner.JUnitCore CalcTest ===== Mire ne írjunk tesztet ===== * Olyan kód esetén, amely a csak a grafikus megjelenésért felel. * Más keretrendszerek könyvtáraihoz. * Triviális metódus. Ilyen lehet a set, get metódus. * Külső erőforrásokra. Például állomány, adatbázis. Elég ha az elérhetőséget vizsgáljuk. * Olyan kód esetén, amelynek a visszatérési értéke nem determinisztikus. Véletlen számok, szálkezelés. ===== Mire írjunk tesztet? ===== Aranyszabályként elfogadható, hogy az üzleti logikára kell tesztet írnunk. Írjunk tesztet minden központi kódra, amely más modulokat hív. Ha egy kódban sok hiba fordul elő, írjunk tesztet. Ha mindig más és más fejlesztő változtatja meg a kódot, szintén a tesztírás ajánlott. ===== Linkek ===== * http://junit.org/ * https://junit.org/junit5/docs/current/user-guide/ (2021) * https://junit.org/junit5/docs/current/api/ (2021)