[[oktatas:programozás:java:java_teszteles:junit5|< JUnit5]] ====== JUnit5 kezdés ====== * **Szerző:** Sallai András * Copyright (c) 2021, Sallai András * Szerkesztve: 2021, 2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== A JUnit ===== A JUnit a Java egységtesztelő keretrendszere. Jelenleg verziója 5. Webhely: * https://junit.org/ * https://junit.org/junit5/ ===== Beszerzés ===== Töltsük le a JUnit legújabb verzióját. Két fájlra van szükség. ===== Visual Studio Code bővítmény ===== * Test Runner for Java ==== junit-juipter-api ==== A weboldal jobb oldalán keressük meg a "Latest Release" feliratot. Alatta válasszuk a "Jupiter v5.x.y" verziót. A Maven tároló új oldalát kapjuk. Keressük a következő csomagot: * **junit-jupiter-api** ==== junit-platform-console-standalone ==== A weboldal jobb oldalán keressük meg a "Latest Release" feliratot. Alatta válasszuk a "Platform v1.x.y" verziót. A Maven tároló új oldalát kapjuk. Keresőbe írjuk be: * **junit-platform-console-standalone** ===== Telepítés ===== ==== Visual Studio Code ==== A letöltés után kapunk egy **junit-jupiter-api-5.x.y.jar** és egy **junit-platform-console-standalone-1.x.y.jar** nevű fájlt. Az x.y helyén különböző verziószámok lehetnek. Letölthetjük az adott projekt lib könyvtárába, vagy a felhasználói könyvtárban egy **Library/junit** könyvtárba. Utóbbi esetben más projektekhez is használható. Ha projekt **lib** könyvtárába töltjük, akkor azonnal használható. Ha ~/Library/junit könyvtárba töltöttük, akkor a projekt beállításainál ki kell tallóznunk. ===== Tesztelés megkezdése ===== ==== Visual Studio Code - build eszköz nélkül ==== Hozzuk létre egy test nevű könyvtárat a projekt gyökérkönyvtárában. Állítsuk be a projekt könyvtárában található .vscode/settings.json fájlban a test könyvtárat is java.project.sourcePath tömbjében. Ne kézzel adjuk meg a test könyvtárat. Használjuk a Jobb egér gombra megjelenő menüt: **Add Folder to Java Source Path** Legyen megnyitva az App.java fájl. Majd a már létező **test** könyvtár felett jobb egér gomb, majd a menüből válasszuk a következőt: **Add Folder to Java Source Path**. { "java.project.sourcePaths": ["src", "test"], "java.project.outputPath": "bin" } Egészítsük ki a következővel: "java.test.config": { "name": "Java teszt", "workingDirectory": "${workspaceFolder}", }, Teljes JSON fájl, hivatkozásokkal együtt: { "java.project.sourcePaths": ["src", "test"], "java.project.outputPath": "bin", "java.project.referencedLibraries": [ "lib/**/*.jar", "/home/andras/Library/junit/junit-jupiter-api-5.8.1.jar", "/home/andras/Library/junit/junit-platform-console-standalone-1.8.1.jar" ], "java.test.config": { "name": "Java teszt", "workingDirectory": "${workspaceFolder}", }, } Egyéb beállíátsok: * https://github.com/Microsoft/vscode-java-test/wiki/Run-with-Configuration Teszt hivatalos oldal: * https://code.visualstudio.com/docs/java/java-testing Ha Maven-t használunk nincs szükség ezekre a beállításokra, mert ezek automatikusan beállításra kerülnek. === Teszt osztály === Egy tesztosztályt létre kell hozni. Addig nem fogadja el a test könyvtárat. Pl. class ValamiTest { } Újraindítás után útvonalba lesz a test. ==== Projekt útvonal ==== Az alábbi beállítás akkor fontos, ha például szeretnénk fájlt megnyitni az aktuális projekt könyvtárában: "java.test.config": { "name": "Java teszt", "workingDirectory": "${workspaceFolder}", }, Ha ezt nem állítjuk be, a teszt futtatásakor az aktuális könyvtár valami útvonala a felhasználó saját könyvtárán belül a .config/Code/User/workspaceStorage/ könyvtárban. Lehet a test könyvtáron belül szeretnénk Mocking céljából egy fájlt megnyitni. Erre a beállításra szükség van! ===== Egyszerű egyezés ===== import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class TriangleTest { Triangle triangle; @BeforeEach public void initEach() { triangle = new Triangle(); } @Test public void testCalcArea() { assertEquals(525, triangle.calcArea(30, 35)); } } A org.junit.Test nem jó! Az a régebbi Test osztály. ===== Futtatás ===== A Visual Studio Code akciósávján van egy Teszt ikon. Válasszuk ki. Ha tesztet sikeresen beállítottuk megjelenik és futtathatjuk a "lejátszógombbal". ===== AAA ===== * Arrange: adatok beállítása, előkészítése * Act: tesztelt metódus hívása * Assert: Ellenőrzés public class Circle { private double radius; public double calcArea() { return Math.PI * Math.pow(this.radius, 2); } public void setRadius(double radius) { this.radius = radius; } } import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class CircleTest { private Circle circle; @BeforeEach public void init() { this.circle = new Circle(); } @Test public void testCalcArea() { //Arrange - szervezés, felkészülés double radius = 30; double expected = 2827.43; circle.setRadius(radius); //Act - akció double actual = circle.calcArea(); //Assert - állítás, ellenőrzés assertEquals(expected, actual, 0.01); } } ===== Assertions metódusok ===== | assertEquals() | Egyenlő? | | assertSame() | Ugyanaz az objektum? | ===== assertEquals() ===== * assertEquals(elvárt, aktuális, delta) Ennyi lehet az eltérés. Double típus esetén például ha két tizedesjegy egyezés szükséges, akkor a delta legyen 0.01. Delta (megengedett eltérés): assertEquals(expected, actual, 0.01); Plusz információ megjelenítése: assertEquals(expected, actual, 0.01, "Kör terület ellenőrzés"); A szöveg csak akkor jelenik meg, ha sikertelen a teszt. A negyedik paraméter lehet függvény is: assertEquals(expected, actual, 0.01, () -> "Kör terület ellenőrzés"); ===== Listák összehasonlítása ===== ArrayList nevek = new ArrayList<>(); nevek.add("egy"); nevek.add("kettő"); nevek.add("három"); boolean a = (nevek.equals(Arrays.asList("egy", "kettő", "három"))); ===== Típusvizsgálat ===== import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.ArrayList; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.BeforeEach; public class FileloadTest { Fileload fileload; @BeforeEach public void initEach() { fileload = new Fileload(); } @Test public void testEmployeeListType() { assertTrue(fileload.getLines() instanceof ArrayList); } } ===== TDD ===== ==== Kezdés ==== Hozzuk létre a tesztelő osztályt. import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class TriangleTest { Triangle triangle; @BeforeEach public void initEach() { triangle = new Triangle(); } @Test public void testCalcArea() { assertEquals(0, triangle.caclArea()); } } Jobb oldalon a normál futtatás gombbal futtassuk. Fejlesszük az ipari kódot, de csak addig, amíg teljesül a teszt: public class Triangle { public double caclArea() { return 0; } } ===== Alternatív futtatási módok ===== ==== Futtatás parancssorból ==== Szükség van a lib könyvtárban a junit-platform-console-standalone jar fájl egy példányára. A példában az 1.8.1-s verzió szerepel, be kell helyettesíteni a saját verziót. Feltételezzük, hogy a forrásfájlok az src könyvtárban vannak, és az out könyvtár nem létezik. javac -d out src/*.java javac -d out -cp out:lib/junit-platform-console-standalone-1.8.1.jar test/*.java java -jar lib/junit-platform-console-standalone-1.8.1.jar -cp out --scan-class-path ==== Script készítése ==== Írjuk a három sort egy scripts nevű könyvtárban egy test.sh fájlba. Unix alapú rendszeren adjunk rá futtatási jogot. Windowson test.cmd nevű scriptet írjunk. javac -d out src/*.java javac -d out -cp out:lib/junit-platform-console-standalone-1.8.1.jar test/*.java java -jar lib/junit-platform-console-standalone-1.8.1.jar -cp out --scan-class-path ==== Task futtatása ==== A tasks.json fájl a felhasználó profil könyvtárába is tehető: * ~/.config/Code/User De elhelyezhető a projekt könyvtárban a .vscode könyvtárban is. { "version": "2.0.0", "tasks": [ { "label": "JUnit teszt futtatása", "type": "shell", "command" : "./scripts/test.sh", "windows": { "command": ".\\scripts\\test.cmd" }, }, ] } Futtatás: * F1 * Tasks: Run Task Az újabb felületen meg kell jelenjen a "label"-ben szereplő felirat. Válasszuk ki.