1. A legfontosabb rész:
@Test
Ez mondja meg a JUnitnak, hogy ez egy tesztmetódus. Az assertion: assertEquals(5, result);
azt jelenti: elvárt érték = 5 tényleges érték = result
2. A legfontosabb assertionök Ezeket fogod a legtöbbször használni:
assertEquals(expected, actual); assertNotEquals(expected, actual); assertTrue(condition); assertFalse(condition); assertNull(value); assertNotNull(value);
Például:
@Test void simpleAssertions() { assertEquals(4, 2 + 2); assertTrue(10 > 5); assertFalse(3 > 10); String name = "Oliver"; assertNotNull(name); }
Nagyon fontos szokás:
assertEquals(expected, actual);
tehát először az elvárt, utána a kapott érték.
3. Több teszt ugyanarra az osztályra Például bővítsük a Calculator osztályt:
public class Calculator { public int add(int a, int b) { return a + b; } public int subtract(int a, int b) { return a - b; } public int multiply(int a, int b) { return a * b; } }
A teszt:
class CalculatorTest { @Test void additionWorks() { Calculator calculator = new Calculator(); assertEquals(5, calculator.add(2, 3)); } @Test void subtractionWorks() { Calculator calculator = new Calculator(); assertEquals(7, calculator.subtract(10, 3)); } @Test void multiplicationWorks() { Calculator calculator = new Calculator(); assertEquals(20, calculator.multiply(4, 5)); } }
Mavenből: mvn test
VS Code-ban pedig az egyes @Test metódusok mellett is megjelenhet a Run Test gomb; a Java Test Runner JUnit 5-öt is támogatja. Visual Studio Code
4. @BeforeEach Gyakran ugyanazt az objektumot kell minden teszthez létrehoznunk. Ez:
@Test void additionWorks() { Calculator calculator = new Calculator(); assertEquals(5, calculator.add(2, 3)); } @Test void subtractionWorks() { Calculator calculator = new Calculator(); assertEquals(7, calculator.subtract(10, 3)); }
ismétli ezt:
Calculator calculator = new Calculator();
Erre való a: @BeforeEach
Például:
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; class CalculatorTest { private Calculator calculator; @BeforeEach void setUp() { calculator = new Calculator(); } @Test void additionWorks() { assertEquals(5, calculator.add(2, 3)); } @Test void subtractionWorks() { assertEquals(7, calculator.subtract(10, 3)); } }
A setUp() minden egyes teszt előtt lefut. Tehát: @BeforeEach → @Test #1 @BeforeEach → @Test #2 @BeforeEach → @Test #3
Ez nagyon fontos unit testing minta.
5. @BeforeAll és @AfterAll Van olyan inicializáció, amit csak egyszer akarunk lefuttatni.
@BeforeAll static void beforeAllTests() { System.out.println("Tests starting..."); }
és a végén:
@AfterAll static void afterAllTests() { System.out.println("Tests finished."); }
Teljes példa:
import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; class ExampleTest { @BeforeAll static void beforeAll() { System.out.println("START"); } @Test void testOne() { System.out.println("testOne"); } @Test void testTwo() { System.out.println("testTwo"); } @AfterAll static void afterAll() { System.out.println("END"); } }
6. Kivételek tesztelése: assertThrows Ez különösen fontos. Tegyük fel, hogy van osztás:
public int divide(int a, int b) { if (b == 0) { throw new IllegalArgumentException("Division by zero"); } return a / b; }
Azt szeretnénk tesztelni, hogy nullával osztás esetén valóban kivételt kapunk:
@Test void divisionByZeroThrowsException() { Calculator calculator = new Calculator(); assertThrows( IllegalArgumentException.class, () -> calculator.divide(10, 0) ); }
Ez nagyon tipikus JUnit 5 kód. Még jobb:
@Test void divisionByZeroThrowsException() { IllegalArgumentException exception = assertThrows( IllegalArgumentException.class, () -> calculator.divide(10, 0) ); assertEquals( "Division by zero", exception.getMessage() ); }
Itt már nemcsak azt ellenőrizzük, hogy volt exception, hanem az üzenetét is.
7. assertAll Több dolgot egyszerre is ellenőrizhetsz:
@Test void severalAssertions() { int result = 10; assertAll( () -> assertTrue(result > 0), () -> assertTrue(result < 100), () -> assertEquals(10, result) ); }
Előnye, hogy a JUnit megpróbálja az összes assertiont kiértékelni.
8. @DisplayName Olvasható nevet adhatsz a tesztnek:
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class CalculatorTest { @Test @DisplayName("2 + 3 eredménye 5") void additionWorks() { Calculator calculator = new Calculator(); assertEquals(5, calculator.add(2, 3)); } }
A VS Code Testing nézetében így sokkal érthetőbb lehet a teszt.
9. @Disabled Ideiglenesen kikapcsolhatsz egy tesztet:
import org.junit.jupiter.api.Disabled; @Test @Disabled void unfinishedTest() { // még nincs kész }
Vagy indoklással: @Disabled(“A funkció még nincs implementálva”)
10. Paraméterezett tesztek Ez a JUnit 5 egyik nagyon hasznos funkciója. Tegyük fel, hogy ezt akarjuk tesztelni: calculator.add(…)
Nem akarunk öt külön tesztet írni:
assertEquals(3, calculator.add(1, 2)); assertEquals(7, calculator.add(3, 4)); assertEquals(0, calculator.add(-1, 1));
Használhatunk @ParameterizedTest-et:
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; class CalculatorTest { private final Calculator calculator = new Calculator(); @ParameterizedTest @CsvSource({ "1, 2, 3", "3, 4, 7", "-1, 1, 0", "10, 20, 30" }) void additionWorks( int a, int b, int expected) { assertEquals( expected, calculator.add(a, b) ); } }
Ez gyakorlatilag négyszer futtatja ugyanazt a tesztet különböző adatokkal.
11. @ValueSource Egyszerű paraméterlistához:
@ParameterizedTest @ValueSource(ints = {1, 2, 3, 10, 100}) void positiveNumbersArePositive(int number) { assertTrue(number > 0); }
12. Jó teszt felépítése: Arrange – Act – Assert Ezt érdemes megszokni.
@Test void additionWorks() { // Arrange Calculator calculator = new Calculator(); // Act int result = calculator.add(2, 3); // Assert assertEquals(5, result); }
A három rész: Arrange ↓ előkészítjük a tesztet
Act ↓ meghívjuk a tesztelendő kódot
Assert ↓ ellenőrizzük az eredményt
Ez az egyik legfontosabb unit testing gondolkodásmód.