[[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.