0%

Ein echtes Projekt testen · Übung

Reparieren, während der Test weiter prüft

Die rote Testsuite ist bereits eindeutig: Ein gefundener tmp_path-Test erwartete ein sichtbares é, während die echte UTF-8-Datei die JSON-Escape-Sequenz \\u00e9 enthielt. Der Test scheiterte nicht an der Erkennung, einem Import oder einer alten Datei im Repository.

Öffne die Anwendungsdatei erst, nachdem du diese Tatsachen geklärt hast:

nano catalog.py

Ändere in write_catalog_json nur die JSON-Option von ensure_ascii=True zu ensure_ascii=False. Damit stellst du die übernommene Vorgabe aus Kapitel 7 bis 9 wieder her: Nicht-ASCII-Text bleibt in der UTF-8-Datei sichtbar.

Führe alle Tests erneut aus:

python -m pytest -q

Jetzt werden mehr als null Tests gefunden, alle bestehen und pytest endet mit Status 0. Schwäche die Erwartung nicht so ab, dass sie sowohl maskierten als auch sichtbaren Text akzeptiert. Ein Regressionstest ist nur so lange ein Sicherheitsnetz, wie er weiterhin das beabsichtigte Verhalten verlangt.

Ergänze eine weitere Prüfung mit tmp_path für die bestehende Fehlergrenze. Ergänze run_catalog im Import aus catalog und verwende dann dieses kleine Muster:

def test_missing_input_preserves_existing_output(tmp_path, capsys):
    missing = tmp_path / "missing.csv"
    output = tmp_path / "existing.json"
    output.write_text("keep me\n", encoding="utf-8")

    result = run_catalog(missing, output, 0)

    assert result == 1
    assert output.read_text(encoding="utf-8") == "keep me\n"
    assert capsys.readouterr().err.startswith(f"Could not read {missing}:")

Wie tmp_path wird auch capsys von pytest bereitgestellt, wenn du es als Testparameter angibst. capsys.readouterr() gibt die bisher aufgefangene Ausgabe zurück: .out enthält stdout und .err stderr. Der Aufruf leert zugleich diesen Ausgabepuffer. Hier untersucht der Test .err, um die erwartete Diagnose zu prüfen. Beide Dateipfade liegen unter tmp_path. Die Assertion für den Kontrollinhalt prüft die entscheidende Zusage: Ein Lesefehler tritt auf, bevor der Schreiber bestehende Ausgaben berührt.

Belege jetzt, dass das Netz noch fängt. Setze ensure_ascii=True wieder ein, führe die Suite aus und beobachte, wie derselbe Test erneut rot wird. Setze die Option dann auf False und beobachte, wie er grün wird.

Dieser Zyklus aus Rot, Grün, Rot und Grün macht den ganzen Wert des Tests aus. Ein Test, den du bisher nur hast bestehen sehen, hat noch nichts bewiesen; du hast noch nicht beobachtet, wie er ein Problem bemerkt.

Der neue Unicode-Test scheitert an "\\u00e9" not in raw. Welche Reparatur erhält einen nützlichen Regressionstest?

Aufgabe

Nachdem du den Fehler aus Lektion 4 gelesen hast, stelle ensure_ascii=False in write_catalog_json wieder her und führe die vollständige beibehaltene Testsuite erfolgreich aus. Ergänze einen Lesefehler-Test mit tmp_path, dessen vorher vorhandener Kontrollinhalt in der Ausgabedatei exakt unverändert bleibt. Die Bewertung führt den Unicode-Fehler außerhalb deines Arbeitsbereichs wieder ein und verlangt, dass die relevante Teilmenge der tmp_path-Tests fehlschlägt.