Glenford J Myers udmærkede bog om aftestning af programmer rummer
en nydelig lille øvelse i hvor svær denne kunst er.
For altid at have den ved hånden har jeg tilladt mig at skrive
den af her.
Opgave
Skriv på et stykke papir et antal tests (dvs specifikke data, fx 3,4,5),
som du mener ville teste det følgende program fyldestgørende.
Programmet indlæser tre heltal. De tre værdier skal opfattes
som repræsenterende siderne i en trekant.
Programmet udskriver en meddelelse, som angiver om trekanten
er uligesidet, ligesidet eller ligebenet.
Vurdering af løsningen
Kig nu på dit testsæt og brug det til at besvare følgende spørgsmål.
Tæl ja-svarene sammen til sidst.
Har du et testforsøg, som repræsenterer en gyldig uligesidet trekant?
Bemærk at testforsøg som 1,2,3 og 2,5,10 ikke berettiger til et ja-svar, fordi
der ikke findes en trekant med sådanne sider.
Har du et testforsøg, som repræsenterer en gyldig ligesidet trekant?
Har du et testforsøg, som repræsenterer en gyldig ligebenet trekant?
Bemærk at testforsøg som 2,2,4 ikke må medregnes
Har du mindst tre testforsøg, som repræsenterer gyldige, ligebenede trekanter, sådan
at alle tre ombytninger af to lige sider testes (fx 3,3,4 3,4,3, og 4,3,3)
Har du et testforsøg, hvor en af siderne har værdien nul?
Har du et testforsøg, hvor en af siderne har negativ værdi?
Har du et testforsøg med tre heltal større end nul, hvor summen af de to sider
er lig den tredje? (hvis programmet siger at 1,2,3 repræsenterer en uligesidet
trekant, er det en fejl)
Har du mindst tre testforsøg af kategorien i pkt 7, således at alle tre
variationer af hvilken side, der er summen af de to andre, er prøvet?
(fx 1,2,3 1,3,2 og 3,1,2)
Har du et testforsøg med tre heltal større end nul, hvor
summen af de to af tallene er mindre end det tredje?
(fx 1,2,4 eller 12,15,30)
Har du mindst tre testforsøg af typen i pkt 9, så alle tre variationer
er afprøvet?
(fx 1,2,4 1,4,2 og 4,1,2)
Har du et testforsøg, hvor alle sider er nul?
(dvs 0,0,0)
Har du mindst et testforsøg, der indeholder værdier, der ikke er heltal?
Har du mindst et testforsøg, der angiver et forkert antal værdier?
(fx to i stedet for tre)
Har du for hvert testforsøg specificeret både inddataværdier og det forventede resultat?
Og hvad så?
Ifølge Myers scorer selv professionelle programmører i gennemsnit
kun 7-8 ud af de mulige 14 points.
Den indlysende konklusion er at når det er så svær at teste
et så banalt eksempel, så ser det sløjt ud med aftestning af
virkeligt komplekse programmer.
En checkliste
Henry F. Ledgard gennemgår i sin lille bog, Programming Proverbs,
en lille liste over gode råd, når man programmerer. Den er stadig
aktuel.
Define the problem completely
Think first; program later
Use the top-down approach
Beware of other approaches
Construct the program in logical units
Use procedures
Avoid unnecessary goto's
Avoid side effects
Get the syntax correct now, not later
Use good mnemonic names
Use intermediate variables properly
Leave loop variables alone
Do not recompute constants within a loop
Avoid implementation-dependent features
Avoid tricks
Build in debugging techniques
Never assume the computer assumes anything
Use comments
Prettyprint
Provide good documentation
Hand-check the program before running it.
Get the program correct before trying to produce good output
When the program is correct, produce good output
Reread the manual
Consider another language
Don't be afraid to start over
Kilder
Kunsten at teste edb-programmer af Glenford J. Myers