Fouten, validatie en debuggen · oefening
Reproduceer een fout betrouwbaar
Een melding zoals “de prijs klopt soms niet” is lastig te onderzoeken. Een reproductie maakt er een concreet experiment van:
de exacte startcode;
de exacte invoer of functieaanroep;
het verwachte resultaat;
het werkelijke resultaat.
Als dezelfde stappen elke keer hetzelfde probleem veroorzaken, kun je mogelijke oplossingen testen zonder te gokken of de fout toevallig verdwenen is.
Kies het kleinste falende geval
Stel dat een functie pakketgewichten indeelt:
def shipping_label(weight):
if weight < 10:
return "standard"
return "heavy"
Een nuttige melding is:
De aanroep
shipping_label(10)zou"standard"moeten teruggeven, omdat standaardverzending gewichten tot en met 10 omvat. De functie geeft in werkelijkheid"heavy"terug.
Het getal 10 ligt precies op de grens van de regel. Door het te testen ontdek je of de vergelijking die waarde meeneemt of uitsluit.
Test rond een grens
Controleer bij een grens van 10:
print(shipping_label(9))
print(shipping_label(10))
print(shipping_label(11))
Waarden direct onder, op en boven een grens brengen vaak fouten met <, <=, > en >= aan het licht.
Dit geeft meer informatie dan allerlei losse waarden proberen. Je test steeds één aanname.
Bewaar de reproductie tijdens het herstel
Een gericht voorbeeld kan een regressiecontrole worden: voer na de oplossing hetzelfde voorbeeld opnieuw uit. Controleer ook nabije waarden om zeker te weten dat de oplossing de fout niet heeft verplaatst.
De werkwijze is:
Formuleer de eis nauwkeurig.
Zoek een kleine invoer die de eis schendt.
Bevestig het verkeerde resultaat.
Beperk je onderzoek tot de relevante code.
Verander één oorzaak.
Voer het falende geval en nabije gevallen opnieuw uit.
Die laatste herhaling verandert “ik heb iets aangepast” in bewijs dat het gedrag nu aan de eis voldoet.
Volgens de regel krijgen kinderen van 12 jaar en jonger een kinderkaartje. Welke testset controleert de grens het meest direct?
Opdracht
De prijsregel van de locatie is:
bezoekers jonger dan 18 betalen
$8;bezoekers van 65 jaar en ouder betalen
$10;alle anderen betalen
$14.
De startfunctie behandelt één grenswaarde verkeerd. Voer de drie voorbereide gevallen uit om het probleem te reproduceren en corrigeer daarna de vergelijking.
De uiteindelijke uitvoer moet zijn:
14
10
10
Voeg geen speciaal geval toe alleen voor de voorbereide aanroepen. Zorg dat de regel voor elke leeftijd werkt.