Testing Kurs TDD wiederholen

Lektion 03 - Testverfahren

Testverfahren: Welche Art von Test brauchst du?

Nicht jeder Test prueft dasselbe. Manche Tests pruefen eine kleine Funktion, andere pruefen mehrere Bausteine zusammen, wieder andere pruefen die ganze App aus Sicht eines Users. In dieser Lektion lernst du die wichtigsten Testverfahren.

1. Die Testpyramide

Die Testpyramide ist ein Denkmodell. Unten stehen viele schnelle kleine Tests. Oben stehen wenige grosse Tests, die naeher am echten Nutzerverhalten sind, aber laenger dauern und aufwendiger sind.

Testpyramide:

        End-to-End Tests
      Integrationstests
    Widget- / Komponententests
  Unit-Tests

Als Lernregel gilt: Viele Unit-Tests, einige Integrations- oder Widget-Tests, wenige sehr grosse End-to-End-Tests.

2. Unit-Tests

Unit-Tests pruefen eine kleine Einheit. Das ist oft eine Funktion, Methode oder Klasse. Sie sind schnell, klar und gut fuer Logik geeignet.

int add(int a, int b) {
  return a + b;
}

test('addiert zwei Zahlen', () {
  expect(add(2, 3), 5);
});

Unit-Tests sind ideal fuer Berechnungen, Validierung, Formatierung, Statuslogik und Klassenmethoden.

3. Widget-Tests in Flutter

Widget-Tests pruefen Flutter-Oberflaechen. Du kannst testen, ob Text sichtbar ist, ob ein Button existiert oder ob sich die Anzeige nach einem Klick aendert.

testWidgets('Counter startet bei 0', (tester) async {
  await tester.pumpWidget(const MyApp());

  expect(find.text('0'), findsOneWidget);
  expect(find.text('1'), findsNothing);
});

tester.pumpWidget baut das Widget fuer den Test auf. Mit find.text suchst du nach sichtbarem Text.

4. Integrationstests

Integrationstests pruefen, ob mehrere Teile zusammen funktionieren. Zum Beispiel: Eine Eingabe wird gemacht, ein Service verarbeitet Daten und die UI zeigt danach das Ergebnis.

BeispielWas wird zusammen getestet?
LoginFormular, Validierung, Auth-Service.
Todo speichernUI, State, Speicherlogik.
Liste ladenAPI, Model, Anzeige.

5. Systemtests und End-to-End-Tests

Systemtests pruefen ein komplettes System. End-to-End-Tests gehen noch staerker aus Nutzerperspektive vor: User oeffnet App, klickt, gibt Daten ein und sieht ein Ergebnis. Diese Tests sind realistisch, aber langsamer und empfindlicher.

End-to-End-Idee:
  App starten
  Login-Daten eingeben
  Login klicken
  Dashboard muss sichtbar sein
  Neue Aufgabe anlegen
  Aufgabe muss in Liste erscheinen

6. Weitere Testverfahren

VerfahrenBedeutung
Black-Box-TestDu testest nur Eingabe und Ausgabe, nicht den inneren Code.
White-Box-TestDu kennst den Code und testest gezielt innere Pfade.
AkzeptanztestPrueft, ob eine Anforderung aus Usersicht erfuellt ist.
Smoke-TestPrueft grob, ob die wichtigste Funktion ueberhaupt startet.
Manueller TestEine Person prueft bewusst per Hand.

7. Welcher Test fuer welchen Zweck?

Du willst pruefen...Passender Test
Berechnung oder kleine FunktionUnit-Test
Flutter-Widget zeigt richtigen TextWidget-Test
Mehrere Module arbeiten zusammenIntegrationstest
Kompletter NutzerflussEnd-to-End-Test
Alter Bug darf nicht wiederkommenRegressionstest

8. Uebungen

  1. Ordne zehn Beispieltests den Kategorien Unit, Widget, Integration oder End-to-End zu.
  2. Schreibe drei Unit-Test-Ideen fuer eine Klasse LearningTask.
  3. Schreibe zwei Widget-Test-Ideen fuer eine Counter-App.
  4. Schreibe einen Akzeptanztest fuer: User kann eine Aufgabe als erledigt markieren.
  5. Entscheide fuer jeden Test, ob er eher Black-Box oder White-Box ist.
Zur Testing-Uebersicht