Skip to content
IRC-CodingIRC-Coding
Unit TestsSoftware TestingTestautomatisierungJUnitpytestJestTDD

Unit Tests Grundlagen: Isoliert, schnell und effektiv testen

Lerne die Grundlagen von Unit Tests: Definition, Vorteile, Aufbau, Best Practices und gängige Frameworks mit praktischem Beispiel.

S

schutzgeist

2 min read
Unit Tests Grundlagen: Isoliert, schnell und effektiv testen

Unit Tests Grundlagen

Unit Tests sind das Fundament der Testautomatisierung. Sie prüfen kleinste Teile einer Software isoliert und liefern schnelles Feedback, wenn etwas nicht mehr funktioniert. Wer Unit Tests richtig einsetzt, vermeidet teure Fehler und schafft Vertrauen in den eigenen Code.

In a Nutshell

  • Unit Tests prüfen einzelne Funktionen, Klassen oder Methoden isoliert.
  • Sie sind schnell, wiederholbar und liefern direktes Feedback.
  • Gute Unit Tests sind unabhängig, deterministisch und fokussiert auf ein Verhalten.
  • Sie bilden die breite Basis der Testpyramide.

Kompakte Fachbeschreibung

Ein Unit Test überprüft die kleinste testbare Einheit einer Software in Isolation. Typischerweise wird eine Funktion oder Methode mit definierten Eingaben aufgerufen und das Ergebnis mit einem erwarteten Wert verglichen. Abhängigkeiten wie Datenbanken, Dateisysteme oder externe Dienste werden durch Stubs oder Mocks ersetzt, sodass der Test ausschließlich die Logik der Einheit prüft.

Aufbau eines Unit Tests

Ein klassischer Unit Test folgt dem Arrange-Act-Assert-Muster:

  1. Arrange: Vorbereitung der Eingaben, Objekte und Abhängigkeiten.
  2. Act: Ausführung der zu testenden Funktion.
  3. Assert: Prüfung des Ergebnisses gegen eine Erwartung.

Best Practices

  • Ein Test, ein Konzept: Jeder Test sollte genau ein Verhalten prüfen.
  • Unabhängigkeit: Tests dürfen nicht voneinander abhängig sein.
  • Determinismus: Gleiche Eingaben müssen immer gleiche Ergebnisse liefern.
  • Lesbarkeit: Testnamen beschreiben das Verhalten, nicht die Methode.
  • Mocks sparsam einsetzen: Zu viele Mocks verbergen echte Fehler.
  • Edge Cases nicht vergessen: Leere Eingaben, Nullwerte und Grenzwerte testen.

Praxisbeispiel: Preisberechnung mit Rabatt

import unittest

def calculate_price(base_price, discount_percent):
    if base_price < 0:
        raise ValueError("Preis darf nicht negativ sein")
    if discount_percent < 0 or discount_percent > 100:
        raise ValueError("Rabatt muss zwischen 0 und 100 liegen")
    return base_price * (1 - discount_percent / 100)

class TestPriceCalculation(unittest.TestCase):
    def test_no_discount(self):
        self.assertEqual(calculate_price(100, 0), 100)

    def test_with_discount(self):
        self.assertEqual(calculate_price(100, 20), 80)

    def test_full_discount(self):
        self.assertEqual(calculate_price(100, 100), 0)

    def test_invalid_price(self):
        with self.assertRaises(ValueError):
            calculate_price(-10, 10)

    def test_invalid_discount(self):
        with self.assertRaises(ValueError):
            calculate_price(100, 110)

if __name__ == '__main__':
    unittest.main()

Vorteile und Nachteile

Vorteile

  • Schnelles Feedback: Unit Tests laufen in Millisekunden bis Sekunden.
  • Fehler lokalisieren: Probleme werden direkt auf eine konkrete Einheit eingegrenzt.
  • Sicherheit beim Refactoring: Bestehende Tests zeigen, ob Refactorings fehlerfrei sind.
  • Bessere Code-Struktur: Testbarer Code ist oft besser modularisiert.
  • Dokumentation: Tests zeigen, wie eine Einheit verwendet werden soll.

Nachteile

  • Aufwand zu Beginn: Tests müssen geschrieben und gepflegt werden.
  • Nicht alles abdeckbar: Komplexe UI-Logik oder externe Systeme lassen sich schwer isoliert testen.
  • Falsche Sicherheit: Hohe Code-Coverage sagt nichts über die Qualität der Tests aus.
  • Testpflege: Schlecht geschriebene Unit Tests bremsen Entwicklung aus.

Prüfungsrelevante Stichpunkte

  • Definition und Zweck von Unit Tests.
  • Arrange-Act-Assert-Muster.
  • Unterschied zwischen Unit Tests und Integration Tests.
  • Vorteile und Grenzen von Unit Tests.
  • Gängige Frameworks: JUnit, NUnit, pytest, Jest.

Typische Prüfungsfragen (mit Kurzantwort)

  1. Was ist ein Unit Test? Ein Test, der eine kleinste testbare Einheit isoliert prüft.

  2. Welches Muster wird häufig für Unit Tests verwendet? Arrange-Act-Assert.

  3. Was ist ein Mock? Ein Ersatzobjekt für eine Abhängigkeit, das kontrolliertes Verhalten simuliert.

  4. Warum sollten Unit Tests deterministisch sein? Damit gleiche Eingaben immer das gleiche Ergebnis liefern und Tests zuverlässig sind.

  5. Nenne ein Vorteil von Unit Tests beim Refactoring. Sie zeigen sofort, ob eine Änderung bestehendes Verhalten zerstört.

Weiter im Software Testing Lernpfad

Der nächste Artikel im Software Testing Lernpfad behandelt Integration Tests Grundlagen — wie das Zusammenspiel mehrerer Komponenten getestet wird.

Wichtigste Quellen

  1. https://martinfowler.com/bliki/UnitTest.html
  2. https://testing.googleblog.com/2015/04/just-say-no-to-more-end-to-end-tests.html
  3. https://en.wikipedia.org/wiki/Unit_testing
Zurück zum DEV Blog
Share:

Ähnliche Beiträge