Leren Programmeren in Python: Checklists

Welke checklists aan bod komen:


Eerste hulp bij fouten

  1. De plaats in een programma waar je merkt dat het faalt, is vaak niet de plaats waar een defect zit.
  2. Als er een Python foutmelding is verschenen, raadpleeg dan de checklist voor veelvoorkomende Python foutmeldingen.
  3. Als het programma niet goed werkt, maar er geen Python foutmelding wordt gegeven, lees dan eerst het programma na aan de hand van de checklist hieronder en controleer het op defecten.
  4. Lees de specificatie en het ontwerp na. Misschien heb je iets over het hoofd gezien.
  5. Ga na of het falen reproduceerbaar is.
  6. Voer ook andere testgevallen uit.
  7. Bedenk eventueel nieuwe testgevallen. Voeg ze toe aan het testplan als ze bijgedragen hebben tot het vinden van een defect.
  8. Inspecteer na eindiging van het programma interactief de relevante variabelen (als de IDE dat toelaat). Voeg eventueel tijdelijk een print-opdracht toe om de waarden van variabelen te tonen.
    Beëindig eventueel tijdelijk het programma voortijdig door de opdracht assert False tussen te voegen, of assert conditie om alleen te stoppen als conditie NIET geldt.
    Als de tussengevoegde opdrachten niet meer nodig zijn, dan kun je ze "uitschakelen" door er een # voor te zetten.

Code nalezen

Bij nalezen van code kun je defecten ontdekken die bij testen onopgemerkt blijven of moeilijk te localiseren zijn. Een falende test wijst op een defect, maar een programma dat zelfs bij herhaald gebruik niet faalt kan toch defecten bevatten. Zelfs als een programma faalt, is vaak niet duidelijk waar de defecten zitten.

Hier is een eenvoudige checklist om je te leiden bij het nalezen.

  1. Is de opmaak systematisch?
    Spatiëring, lege regels, inspringen, regellengte, geen TAB.
  2. Is het commentaar in orde?
    Aanhef van programma ("""...""", __author__ = "...") en ontwerpverwijzingen (##).
    Waar nodig interpretaties (#) en asserties (#@).
    Geen overbodig commentaar.
    Specificatie bij definitie van routine ("""...""").
  3. Zijn alle namen zinvol en zijn ze correct gespeld?
    In Python zijn hoofdletters en kleine letters verschillend.
  4. Zijn de relevante variabelen goed geïnitialiseerd?
    Beginwaarde toekennen, m.n. vóór herhalingen (for en while).
  5. Kloppen de condities in selecties (if) en herhalingen (while)?
    Is het duidelijk waarom een while-herhaling zal eindigen?
    Introduceer hulpvariabelen om ingewikkelde condities te vereenvoudigen.
  6. Kloppen de uitdrukkingen in toekenningen en routine-aanroepen?
    Staan er ook haakjes bij een routine-aanroep zonder argumenten, zoals rij.sort()?
    Klopt de volgorde van parameters in routine-aanroepen?
    Introduceer eventueel hulpvariabelen om ingewikkelde uitdrukkingen te vereenvoudigen.
  7. Zijn karakterrijen precies volgens specificatie geschreven?
    M.n. in uitvoer met print en bij formaataanpassing met %.
  8. Zijn bestanden goed geopend met file(name, mode)?
    Juiste name; juiste mode: lezen ('r'), schrijven ('w'), uitbreiden ('a').
  9. Zijn de globale variabelen, die een routine moet kunnen wijzigen, erin aangekondigd met global?
  10. Zijn slechte stijlfiguren vermeden?
    Zie hieronder.
  11. Voor geavanceerdere controle:

Slechte stijlfiguren

De volgende tabel bevat voorbeelden van slechte stijl en hoe het beter kan.

Slechte stijlBeterOpmerkingen
if conditie :
    blok1
if not conditie :
    blok2
if conditie :
    blok1
else :
    blok2
De "verbetering" is niet van toepassing indien uitvoering van blok1 de waarde van conditie wijzigt. Maar dan moet er wel commentaar bij om hier op te wijzen.
if conditie1 :
    blok1
else :
    if conditie2 :
        blok2
    else :
        blok3
if conditie1 :
    blok1
elif conditie2 :
    blok2
else :
    blok3
De "verbetering" is niet van toepassing indien het onderscheid o.g.v. conditie2 heel anders van aard is dan bij conditie1. Extra commentaar is dan gewenst.
conditie == True
conditie
De toevoeging == True is overbodig. Je schrijf toch ook niet (conditie == True) == True?
conditie == False
not conditie

Testen

Testen is het doelgericht zoeken naar defecten in een programma door het programma systematisch te gebruiken en het gedrag ervan te controleren tegen de specificatie. Hoe je van plan bent een programma te testen staat in het testplan (voorbeeld).

Opstellen van een testplan

Let bij het opstellen van een testplan op de volgende zaken.

  1. Is het testplan vooraf helemaal "op schrift" gezet?
  2. Is elk testgeval voorzien van een identificatie, zoals een volgnummer?
  3. Is concrete invoer vermeld?
    Kun je die letterlijk overnemen (kopiëren/plakken)?
  4. Is de bijbehorende verwachte uitvoer vermeld?
    Is duidelijk waarom die goed is?
    Is duidelijk hoe je de werkelijke uitvoer hiertegen controleert?
    Hoe zit het met verwachte nauwkeurigheid en snelheid?
  5. Is bij elk testgeval een motivatie vermeld?
  6. Is het duidelijk in welke volgorde in- en uitvoer elkaar dienen af te wisselen?
  7. Is er voldoende variatie in de testgevallen?
    Wordt elke opdracht van het programma in ten minste één testgeval uitgevoerd?
    Wordt elke "tak" van een selectie in ten minste één testgeval doorlopen?
    Zijn minimale en maximale waarden net binnen de grenzen geprobeerd?
  8. Is het testplan bijgesteld na het maken van aanpassingen aan de code?
    M.n. vanwege defecten die ontdekt zijn buiten het testplan om.
  9. Voor geavanceerder testen:

Uitvoeren van een testplan

Let bij het uitvoeren van een testplan op de volgende zaken.

  1. Doorloop de testgevallen precies volgens het testplan:
  2. Zijn alle testgevallen van het testplan uitgevoerd?
    N.B. Localiseren en verwijderen van defecten is geen onderdeel van het testen zelf, maar een aparte activiteit.
    Na het verwijderen van defecten is het zaak opnieuw alle testgevallen uit te voeren.
  3. Is bij elk testgeval de uitvoer gecontroleerd volgens het testplan?
  4. Zijn er bijzonderheden opgevallen buiten het testplan om?
  5. Heb je de testuitslag en geproduceerde uitvoer bewaard in een testrapport?
    Vermeld ook de identificatie (volgnummer) van het falende testgeval.
  6. Als een testgeval faalt, is dat dan reproduceerbaar?
  7. Zijn er redenen om het testplan aan te passen?

Foutendiagnose

Foutendiagnose is het localiseren van defecten bij een falende test.

Controleer eerst of de code in orde is volgens bovenstaande checklist.

Veelvoorkomende Python foutmeldingen

AttributeError
Bij gebruik van een object werd een onbekend attribuut aangesproken.
EOFError
Het lezen van invoer met input() of raw_input() stuitte voortijdig op het einde van het bestand (End-Of-File).
IndexError
Bij het indexeren van een rij viel de index buiten de grenzen.
IOError
Probleem m.b.t. in- of uitvoer.
NameError
Er werd een naam gebruikt die niet gedefinieerd is. De naam kan ook in de invoer gestaan hebben.
SyntaxError
Het programma klopt niet qua syntax (vorm).
TypeError
Bij het evalueren van een uitdrukking klopte het type van een object niet bij de toegepaste bewerking of routine.
ZeroDivisionError
Bij de bewerking /, // of % op getallen is het tweede argument nul.

Veelvoorkomende defecten zonder foutmelding

Zie ook de checklist voor het nalezen van code.

Niet-eindigende executie, zonder uitvoer
De executie van het programma eindigt niet, of lijkt niet te eindigen, en er wordt geen uitvoer geproduceerd.


Copyright © 2004, Tom Verhoeff
Validate HTML