Testing Kurs Naechste Lektion

Lektion 01 - TDD

Test Driven Development: Erst Test, dann Code

Test Driven Development, kurz TDD, ist eine Arbeitsweise beim Programmieren. Du schreibst nicht zuerst die fertige Loesung, sondern zuerst einen Test, der beschreibt, was dein Code koennen soll. Danach schreibst du nur so viel Code, bis der Test erfolgreich ist.

1. Warum TDD?

Beim normalen Coden passiert oft Folgendes: Man schreibt viel Code, startet das Programm, klickt herum und merkt irgendwann, dass etwas nicht stimmt. TDD dreht diese Arbeitsweise um. Du definierst zuerst die Erwartung. Dadurch weisst du genauer, wann eine Aufgabe wirklich geloest ist.

Ohne TDDMit TDD
Code wird geraten und spaeter ausprobiert.Erwartung wird zuerst formuliert.
Fehler fallen oft spaet auf.Fehler fallen direkt beim Testlauf auf.
Aenderungen machen unsicher.Tests geben Sicherheit bei Aenderungen.
Funktionen werden schnell zu gross.Kleine testbare Funktionen entstehen natuerlicher.

2. Die TDD-Schleife: Red, Green, Refactor

TDD arbeitet in kleinen Wiederholungen. Diese Schleife ist das Herz von TDD. Du gehst nicht direkt zur perfekten Loesung, sondern arbeitest Schritt fuer Schritt.

Red:
  Schreibe einen Test.
  Der Test muss erst fehlschlagen, weil der Code noch fehlt.

Green:
  Schreibe die kleinste Menge Code, damit der Test besteht.

Refactor:
  Raeume den Code auf.
  Die Tests muessen danach weiterhin bestehen.

Wichtig: Wenn ein neuer Test sofort gruen ist, prueft er wahrscheinlich nicht das, was du wirklich testen wolltest.

3. Beispiel: Punktebewertung testen

Stell dir vor, du brauchst eine Funktion hasPassed. Sie soll true zurueckgeben, wenn mindestens 50 Punkte erreicht wurden. Bei weniger Punkten soll sie false liefern.

import 'package:test/test.dart';

bool hasPassed(int points) {
  return points >= 50;
}

void main() {
  test('gibt true zurueck, wenn Punkte mindestens 50 sind', () {
    expect(hasPassed(50), true);
    expect(hasPassed(80), true);
  });

  test('gibt false zurueck, wenn Punkte unter 50 sind', () {
    expect(hasPassed(49), false);
    expect(hasPassed(0), false);
  });
}

test beschreibt einen einzelnen Testfall. expect beschreibt, welches Ergebnis erwartet wird. Wenn die Funktion etwas anderes zurueckgibt, ist der Test rot.

4. Was testest du genau?

Ein guter Test ist konkret. Er testet nicht "alles irgendwie", sondern einen klaren Fall. Besonders wichtig sind normale Faelle, Grenzwerte und ungueltige Werte.

TestfallBeispiel
Normalfall80 Punkte ergibt bestanden.
Grenzwert50 Punkte ergibt bestanden.
Knapp daneben49 Punkte ergibt nicht bestanden.
Ungueltig-1 Punkte ergibt Fehler oder ungueltig.

5. TDD bei Flutter

In Flutter kannst du Logik und Widgets testen. Logiktests sind meist einfacher, weil sie keine Benutzeroberflaeche brauchen. Widget-Tests pruefen, ob ein Widget richtig angezeigt wird oder auf Klicks reagiert.

flutter test

Dieser Command startet die Tests im Projekt. Typisch liegen Tests im Ordner test/. Eine Testdatei heisst oft zum Beispiel counter_test.dart.

6. Uebungen

  1. Schreibe eine Funktion isAdult(int age).
  2. Schreibe zuerst Tests fuer 17, 18 und 25.
  3. Implementiere danach die Funktion.
  4. Schreibe eine Funktion calculateBonus(int points).
  5. Teste Grenzwerte: 0, 99, 100.
  6. Erklaere schriftlich, welcher Schritt Red, Green und Refactor war.
Weiter zu Regressionstests