Appearance
Unit Testing β
Zusammenfassung β
Unit Testing ist das automatisierte Testen von einzelnen, isolierten Code-Einheiten (meist Methoden/Klassen). Es ist die Grundlage fΓΌr zuverlΓ€ssige Software und ermΓΆglicht schnelle Refactorings ohne Angst vor Regressions.
Kernkonzept β
Unit Tests prΓΌfen das Verhalten einer einzelnen Methode oder Klasse unabhΓ€ngig von anderen Komponenten.
Sie basieren auf dem AAA-Pattern:
- Arrange: Testdaten und Zustand vorbereiten
- Act: Die zu testende Methode aufrufen
- Assert: Ergebnis ΓΌberprΓΌfen
Isolation ist zentral: Tests sollten voneinander unabhΓ€ngig sein und keine externen AbhΓ€ngigkeiten (DB, APIs, File-System) haben. DafΓΌr nutzt man Mocks und Stubs.
Code-Beispiel β
java
// Klasse unter Test
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
// Unit Test mit JUnit 5
@Test
void testAddPositiveNumbers() {
// Arrange
Calculator calc = new Calculator();
// Act
int result = calc.add(5, 3);
// Assert
assertEquals(8, result, "5 + 3 sollte 8 ergeben");
}
@Test
void testAddNegativeNumbers() {
Calculator calc = new Calculator();
int result = calc.add(-5, -3);
assertEquals(-8, result);
}Wichtige Punkte β
- Schnell: Unit Tests dauern Millisekunden, nicht Sekunden
- Wiederholbar: Jeder Test liefert immer das gleiche Ergebnis
- UnabhΓ€ngig: Tests beeinflussen sich gegenseitig nicht
- AussagekrΓ€ftig: Der Test-Name beschreibt klar, was geprΓΌft wird
- Wartbar: Ein Test = eine Verantwortung; komplexe Tests sind ein Code-Smell
Klassische Fragen β
Wann schreibe ich Unit Tests? β
Vor oder nach dem Code? Idealerweise vorher (TDD), praktisch meist parallel oder direkt danach. Die wichtigsten Faustregel: Je kritischer der Code, desto wichtiger der Test.
Muss ich jede Methode testen? β
Nein. Triviale Getter/Setter brauchst du nicht zu testen. Fokussiere auf Business-Logik, Fehlerbehandlung und Edge Cases. Eine Code-Coverage von 70-80% ist realistisch und sinnvoll.
Unit Test vs. Integrations Test? β
Unit Tests isolieren eine Einheit (Mock-AbhΓ€ngigkeiten). Integrations Tests prΓΌfen mehrere Komponenten zusammen (echte DB, APIs). Unit Tests sind schneller, Integrations Tests liefern hΓΆhere Gewissheit.
Wie mock ich AbhΓ€ngigkeiten richtig? β
Nutze Mockito (when().thenReturn()), Spy fΓΌr Partial-Mocks oder Test-Doubles. Mocks simulieren echte Objekte, aber zu viele Mocks = zu viel Isolation = unrealistische Tests.
Was ist ein guter Test-Name? β
Pattern: testMethodeName_WhenCondition_ThenExpectation Beispiel: testCalculatePrice_WhenDiscountApplied_ThenReturnReducedPrice
Wusstest du schon? β
π― TDD-Paradoxon: Entwickler, die zuerst Tests schreiben (TDD), benΓΆtigen am Ende 20-40% weniger Debug-Zeit, schreiben aber 10-15% mehr Code. Das zahlt sich langfristig massiv aus!