Testverfahren in der Softwareentwicklung#

Softwaretests prüfen, ob ein Programm korrekt funktioniert. Sie helfen, Fehler frühzeitig zu finden und die Qualität zu sichern.


Übersicht der Testarten#

                    Softwaretests
                         │
          ┌──────────────┼──────────────┐
          ▼              ▼              ▼
     Whitebox-       Blackbox-       Greybox-
       Test            Test            Test
  (Code bekannt)  (Code unbekannt) (teilweise bekannt)

Blackbox-Test#

Der Tester kennt den internen Code nicht – er sieht nur Eingabe und Ausgabe (wie eine schwarze Box).

        Eingabe ──► [███████] ──► Ausgabe
                    (Code
                  unbekannt)

Vorgehen:

  • Testfälle werden aus den Anforderungen / Spezifikationen abgeleitet
  • Geprüft wird: „Verhält sich das System wie erwartet?"
  • Kein Wissen über Algorithmen, Datenstrukturen oder Implementierung nötig

Techniken:

TechnikBeschreibungBeispiel
ÄquivalenzklassenanalyseEingaben in gleichwertige Gruppen einteilen, eine Eingabe je Gruppe testenAltersfeld: gültig (18–99), zu jung (<18), zu alt (>99)
GrenzwertanalyseWerte an den Grenzen testen (oft fehleranfällig)Für Bereich 18–99: testen mit 17, 18, 99, 100
Zustandsbasiertes TestenSystemzustände und Übergänge testenLogin: angemeldet/abgemeldet, gesperrt

Wer testet: QA-Tester, Kunden, externe Tester

VorteileNachteile
Kein Code-Wissen nötigInnere Logik wird nicht geprüft
Testet aus NutzerperspektiveTestabdeckung unklar
Unabhängig von ImplementierungRedundante Tests möglich

Whitebox-Test#

Der Tester kennt den kompletten Quellcode und testet gezielt interne Strukturen und Logikpfade.

        Eingabe ──► [if x > 0    ] ──► Ausgabe
                    [  return x  ]
                    [else        ]
                    [  return -x ]
                    (Code bekannt)

Vorgehen:

  • Testfälle werden direkt aus dem Code abgeleitet
  • Ziel: Alle Pfade, Verzweigungen und Schleifen mindestens einmal durchlaufen
  • Misst Codeabdeckung (Code Coverage)

Coverage-Arten:

Coverage-TypZielBeispiel
Statement CoverageJede Codezeile mind. einmal ausführen100% = alle Zeilen getestet
Branch CoverageJede Verzweigung (if/else) in beide Richtungen testenif-Zweig UND else-Zweig
Path CoverageJeden möglichen Ausführungspfad testenAlle Kombinationen von Verzweigungen

Beispiel: Testfälle für Whitebox

def berechne_rabatt(preis, menge):
    if menge >= 10:           # Branch 1: True
        return preis * 0.9    # → Testfall: menge=10
    else:                     # Branch 1: False
        return preis          # → Testfall: menge=5

Mindestens 2 Testfälle für 100% Branch Coverage:

  • berechne_rabatt(100, 10) → erwartet: 90
  • berechne_rabatt(100, 5) → erwartet: 100

Wer testet: Entwickler selbst

VorteileNachteile
Interne Logik wird vollständig geprüftErfordert Code-Kenntnis
Ungenutzte Codepfade werden gefundenKein Test aus Nutzerperspektive
Messbare TestabdeckungAufwendig bei komplexem Code

Greybox-Test#

Kombination aus Black- und Whitebox: Tester hat teilweise Einblick in den Code (z.B. Datenbankstruktur, API-Dokumentation, Architekturwissen).

Typischer Einsatz: Integrationstests, Sicherheitstests (Penetrationstests)


Unittest (Modultest)#

Ein Unittest (auch: Komponenten- oder Modultest) testet eine einzelne Funktion oder Klasse isoliert von anderen Systemteilen.

System
 ├── Modul A  ← isoliert testen
 ├── Modul B  ← isoliert testen
 └── Modul C  ← isoliert testen

Eigenschaften:

  • Testet die kleinste testbare Einheit (eine Funktion, eine Methode)
  • Läuft automatisiert (kein manueller Aufwand nach dem Schreiben)
  • Unabhängig von Datenbank, Netzwerk, anderen Modulen (ggf. mit Mocks/Stubs)
  • Sehr schnell ausführbar

Beispiel (Python mit unittest):

import unittest

def addiere(a, b):
    return a + b

class TestAddiere(unittest.TestCase):
    def test_positive_zahlen(self):
        self.assertEqual(addiere(2, 3), 5)

    def test_negative_zahlen(self):
        self.assertEqual(addiere(-1, -1), -2)

    def test_null(self):
        self.assertEqual(addiere(0, 5), 5)

Aufbau eines Testfalls (AAA-Pattern):

Arrange  → Testdaten vorbereiten
Act      → Funktion aufrufen
Assert   → Ergebnis prüfen (assertEqual, assertTrue, ...)
VorteileNachteile
Frühe FehlererkennungSchreiben dauert Zeit
Automatisierbar (CI/CD)Testet keine Zusammenspiele
Dokumentiert erwartetes VerhaltenMocking komplexer Abhängigkeiten aufwendig
Refactoring sicherer

Teststufen im Überblick#

          ▲ Systemtest         (ganzes System, Blackbox)
          │ Integrationstest   (Zusammenspiel mehrerer Module)
          │ Unittest           (einzelne Funktion, Whitebox)
          └──────────────────────────────────────────────
          Je höher, desto mehr Komponenten beteiligt
          Je niedriger, desto schneller und isolierter
TeststufeWas wird getestetWer testetMethode
UnittestEinzelne Funktion/KlasseEntwicklerWhitebox
IntegrationstestZusammenspiel von ModulenEntwickler / QAGrey-/Whitebox
SystemtestGesamtes SystemQA / TesterBlackbox
Abnahmetest (UAT)Erfüllung der AnforderungenKunde / AuftraggeberBlackbox

Vergleich: Black- vs. Whitebox vs. Unittest#

BlackboxWhiteboxUnittest
Code-KenntnisNicht nötigVollständigVollständig
PerspektiveNutzerEntwicklerEntwickler
TestobjektGesamtes FeatureCodepfadeEinzelne Funktion
AutomatisierbarTeilweiseJaJa
FindetFunktionale FehlerLogikfehler, tote PfadeFehler in Einzelfunktionen

Prüfungsbeispiele#

„Eine Funktion soll Zahlen von 1–100 akzeptieren. Welche Testfälle würde die Grenzwertanalyse vorschlagen?"

→ Testfälle: 0 (ungültig), 1 (Untergrenze), 2 (knapp über Untergrenze), 99 (knapp unter Obergrenze), 100 (Obergrenze), 101 (ungültig) – die Grenzen und ihre direkte Umgebung.

„Was ist der Unterschied zwischen einem Blackbox-Test und einem Unittest?"

Blackbox-Test: Tester kennt den Code nicht, testet aus Nutzersicht anhand der Spezifikation. Unittest: Entwickler kennt den Code, testet eine einzelne Funktion isoliert auf korrekte Logik.

„Warum sind automatisierte Unittests besonders wertvoll bei der Weiterentwicklung von Software?"

→ Bei jeder Änderung können alle Tests sofort erneut ausgeführt werden (Regressionstests) – so werden neu eingeführte Fehler sofort erkannt, ohne manuell alles neu testen zu müssen.


Siehe auch#

  • softwaredokumentation — Unittests dokumentieren gleichzeitig das erwartete Verhalten (lebende Dokumentation)
  • uml — Aktivitätsdiagramme helfen, Testfälle (Pfade) zu identifizieren
  • [[../09_projektmanagement/agile_methoden]] — Testgetriebene Entwicklung (TDD) und CI/CD in agilen Projekten
  • [[../06_it-sicherheit/schutzbedarfsanalyse_ISMSLF4]] — Sicherheitstests (Penetrationstests) als Greybox-Tests

Ressourcen#