Aftestning

(af Birger Nielsen , Datalogisk Institut - Aarhus Universitet) Aftestning

Kunsten at teste edb programmer

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.
  1. 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.
  2. Har du et testforsøg, som repræsenterer en gyldig ligesidet trekant?
  3. Har du et testforsøg, som repræsenterer en gyldig ligebenet trekant?
    Bemærk at testforsøg som 2,2,4 ikke må medregnes
  4. 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)
  5. Har du et testforsøg, hvor en af siderne har værdien nul?
  6. Har du et testforsøg, hvor en af siderne har negativ værdi?
  7. 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)
  8. 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)
  9. 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)
  10. 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)
  11. Har du et testforsøg, hvor alle sider er nul?
    (dvs 0,0,0)
  12. Har du mindst et testforsøg, der indeholder værdier, der ikke er heltal?
  13. Har du mindst et testforsøg, der angiver et forkert antal værdier?
    (fx to i stedet for tre)
  14. 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.

  1. Define the problem completely
  2. Think first; program later
  3. Use the top-down approach
  4. Beware of other approaches
  5. Construct the program in logical units
  6. Use procedures
  7. Avoid unnecessary goto's
  8. Avoid side effects
  9. Get the syntax correct now, not later
  10. Use good mnemonic names
  11. Use intermediate variables properly
  12. Leave loop variables alone
  13. Do not recompute constants within a loop
  14. Avoid implementation-dependent features
  15. Avoid tricks
  16. Build in debugging techniques
  17. Never assume the computer assumes anything
  18. Use comments
  19. Prettyprint
  20. Provide good documentation
  21. Hand-check the program before running it.
  22. Get the program correct before trying to produce good output
  23. When the program is correct, produce good output
  24. Reread the manual
  25. Consider another language
  26. Don't be afraid to start over

Kilder