0%

Een echt project testen · oefening

Repareer terwijl de test blijft meekijken

De rode suite is al specifiek: één verzamelde tmp_path-test verwachtte een zichtbare é, terwijl het echte UTF-8-bestand de JSON-escape \\u00e9 bevatte. De test faalde niet door het vinden van tests, een import of een oud bestand in de repository.

Open het productiebestand pas nadat die feiten vaststaan:

nano catalog.py

Verander in write_catalog_json alleen de JSON-optie van ensure_ascii=True naar ensure_ascii=False. Dat herstelt het bestaande contract uit hoofdstuk 7 tot en met 9: niet-ASCII-tekst blijft zichtbaar in het UTF-8-bestand.

Voer elke test opnieuw uit:

python -m pytest -q

Nu is het aantal verzamelde tests groter dan nul, slaagt elke test en sluit pytest af met 0. Zwak de verwachting niet af om zowel escapes als zichtbare tekst te accepteren. Een regressietest is alleen een vangnet zolang die het bedoelde gedrag blijft eisen.

Voeg nog een controle met tmp_path toe voor de bestaande grens van foutafhandeling. Voeg run_catalog toe aan de import uit catalog en gebruik daarna deze kleine opzet:

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}:")

Net als tmp_path wordt capsys door pytest geleverd wanneer je het als testparameter noemt. capsys.readouterr() geeft de tot dan toe opgevangen uitvoer terug: .out bevat stdout en .err bevat stderr. De aanroep maakt die buffer ook leeg. Hier onderzoekt de test .err om de verwachte foutmelding te controleren. Beide bestandspaden blijven onder tmp_path. De assertie op de herkenbare begininhoud controleert het belangrijke contract: een leesfout vindt plaats voordat de schrijver bestaande uitvoer raakt.

Bewijs nu dat het vangnet nog werkt. Zet ensure_ascii=True terug, voer de suite uit en zie dezelfde test weer rood worden. Zet het daarna op False en zie de test groen worden.

Die cyclus van rood, groen, rood en groen is de hele waarde van de test. Een test die je alleen ooit hebt zien slagen, heeft nog niets aangetoond; je hebt nog niet gezien dat die een probleem opmerkt.

De nieuwe Unicode-test faalt op "\\u00e9" not in raw. Welke reparatie behoudt een bruikbare regressietest?

Opdracht

Herstel na het lezen van de fout uit les 4 ensure_ascii=False in write_catalog_json en laat de volledige behouden suite opnieuw groen draaien. Voeg een leesfouttest met tmp_path toe waarin de herkenbare begininhoud van bestaande uitvoer precies ongewijzigd blijft. De beoordelaar brengt de Unicode-regressie buiten je werkruimte opnieuw aan en vereist dat de relevante groep tmp_path-tests faalt.