Testen in Java: Überblick über Frameworks und Tools
Qualitätssicherung durch Tests ist ein wesentlicher Bestandteil professioneller Java-Entwicklung. Ohne automatisierte Tests sind große Projekte schwer zu warten, neue Funktionen schwer zu integrieren und Regressionen schwer zu vermeiden. In diesem Artikel betrachten wir die wichtigsten Werkzeuge und Frameworks zum Testen von Java-Anwendungen: von Unit-Tests über Integrationstests bis hin zur UI-Automatisierung.
Warum ist das Testen von Java-Code wichtig?
Tests ermöglichen:
- Fehler frühzeitig in der Entwicklung zu erkennen.
- Refactoring zu vereinfachen – Sie sehen sofort, was kaputt gegangen ist.
- Das Verhalten des Codes zu dokumentieren.
- Die Überprüfung auf Regressionen bei jedem Commit zu automatisieren.
JUnit 5 – die Grundlage des Unit-Testens
JUnit 5 ist der De-facto-Standard für Modultests in Java. Es besteht aus drei Modulen: JUnit Platform, JUnit Jupiter und JUnit Vintage. Jupiter bietet ein neues Programmiermodell mit Annotationen und Erweiterungen.
Ein einfaches Beispiel für einen Test mit JUnit 5:
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;
class CalculatorTest { @Test void testAddition() { Calculator calc = new Calculator(); assertEquals(5, calc.add(2, 3), "2 + 3 sollte 5 sein"); }}Mockito – Erstellung von Stubs und Mocks
Beim Testen muss eine Klasse oft von ihren Abhängigkeiten (Datenbanken, externe APIs) isoliert werden. Mockito ermöglicht die Erstellung von Mock-Objekten und die Definition ihres Verhaltens.
Beispiel für die Verwendung von Mockito mit JUnit 5:
import org.junit.jupiter.api.Test;import org.junit.jupiter.api.extension.ExtendWith;import org.mockito.InjectMocks;import org.mockito.Mock;import org.mockito.junit.jupiter.MockitoExtension;import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)class UserServiceTest { @Mock private UserRepository repository;
@InjectMocks private UserService service;
@Test void testFindUser() { when(repository.findById(1L)).thenReturn(new User("Alice")); User result = service.findUser(1L); assertEquals("Alice", result.getName()); verify(repository).findById(1L); }}TestNG – Alternative zu JUnit mit erweiterten Funktionen
TestNG (Test Next Generation) ist ein Framework, das von JUnit inspiriert wurde, aber Unterstützung für Testgruppen, Parametrisierung, Abhängigkeiten und parallele Ausführung bietet. Es ist besonders beliebt in großen Projekten und beim Integrationstesten.
Beispiel für einen parametrisierten Test in TestNG:
import org.testng.annotations.DataProvider;import org.testng.annotations.Test;import static org.testng.Assert.assertEquals;
public class ParamTest { @DataProvider(name = "numbers") public Object[][] data() { return new Object[][] { {1, 2, 3}, {0, 0, 0}, {-1, 1, 0} }; }
@Test(dataProvider = "numbers") public void testAdd(int a, int b, int expected) { assertEquals(a + b, expected); }}Selenium – Automatisierung von Weboberflächen
Zum Testen von Java-Webanwendungen (z. B. mit Spring Boot) wird häufig Selenium WebDriver verwendet. Es ermöglicht die Simulation von Benutzeraktionen im Browser: Klicks, Texteingaben, Überprüfung von Elementen.
Minimalbeispiel eines Selenium-Tests:
import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import org.junit.jupiter.api.Test;
public class LoginTest { @Test public void testLoginPage() { WebDriver driver = new ChromeDriver(); driver.get("https://example.com/login"); driver.findElement(By.id("username")).sendKeys("admin"); driver.findElement(By.id("password")).sendKeys("pa Auch in der Bibliothek
CMake für C++: vollständiger Leitfaden mit Beispielen
Logging in Go (Golang): Die besten Bibliotheken und Lösungen für die Produktion
PDF-Generierung in JavaScript: Die Bibliothek pdf-lib
Arbeit mit Daten in C# (.NET): Überblick über Bibliotheken und integrierte Mittel
Arbeiten mit Markdown in TypeScript: Bibliotheken, Parser und Werkzeuge