Programma’s plannen, bouwen en testen · oefening
Zoek bewust naar randgevallen
Een normaal voorbeeld laat zien dat een programma in een vertrouwd geval werkt. Een randgeval controleert een waarde dicht bij de grens van een regel.
Het quizplan vereist dat elke titel, vraagtekst en elk verwacht antwoord bruikbare tekst bevat:
def has_usable_text(text):
return len(text.strip()) > 0
"Ocean Facts" testen is nuttig, maar laat niet zien of de functie met lege tekst of tekst met extra spaties omgaat. Geef die randgevallen ook een beurt:
assert has_usable_text("") is False
assert has_usable_text(" ") is False
assert has_usable_text("?") is True
Het geval met één teken is belangrijk, omdat de eis niet-leeg zegt en niet “minstens twee tekens”.
Veelvoorkomende plekken om te zoeken
Voor het quizprogramma vind je randgevallen vaak bij:
precies drie vragen, het kleinste geldige plan;
nul goede antwoorden of een perfecte score;
een lege string, lijst of dictionary;
tekst met alleen spaties;
een vraagtekst of antwoord van één teken;
twee vraagteksten die na het opschonen overeenkomen;
een antwoord met spaties of andere hoofdletters.
Voeg deze gevallen niet allemaal blind toe. Kies gevallen die het gedrag dat de eisen beloven kunnen veranderen.
Grenswaardetabellen leggen gaten bloot
Schrijf voor een tekstregel een kleine tabel voordat je code schrijft:
| Oorspronkelijke tekst | Na strip() | Bruikbaar? |
|---|---|---|
"" | "" | False |
" " | "" | False |
"?" | "?" | True |
" honey " | "honey" | True |
De tabel maakt de grens zichtbaar: na het opschonen zijn nul tekens onbruikbaar en is één teken bruikbaar.
Testgegevens moeten een reden hebben
Elk testgeval moet een vraag beantwoorden:
Telt tekst met alleen witruimte als leeg?
Wordt de kortste niet-lege vraagtekst geaccepteerd?
Blijft gewone tekst behouden bij het opschonen?
Willekeurige waarden kunnen problemen losmaken, maar een bewust gekozen grensgeval vertelt je precies welk punt je test.
De controle op het aantal vragen slaagt vanaf drie vragen. Welk geval controleert het meest direct of de grenswaarde is inbegrepen?
Opdracht
Implementeer en test has_usable_text(text) volgens deze afspraak:
na het verwijderen van witruimte aan de buitenkant geeft lege tekst
Falseterug;één of meer overgebleven tekens geven
Trueterug.
De startcode bevat een functie met twee fouten in randgevallen en een lijst cases met kleine dictionaries. Vervang elke None in cases door de verwachte booleaanse waarde.
Behoud de lus die de velden "text" en "expected" van elk geval met assert controleert. Druk dit af zodra alle controles slagen:
Boundary checks passed.
Je functie moet ook werken voor tekst die niet in cases staat.