bild
Skolan för
elektroteknik
och datavetenskap

Föreläsning 12 - Dokumentering, testning och kryptering

  • Dokumentering
  • Testning
  • Kryptering, gästföreläsare: Mikael Goldmann

Dokumentering

Varför dokumenterar man kod? Måste man alltid dokumentera kod? Om man vet att koden man skriver ska köras mer än en gång av någon annan än en själv behövs någon form av dokumentation. I stora system finns flera typer av dokument som ska skrivas.

Man skriver ofta kommentarer i programkod. Väl skött är den ovärderlig vid själva utvecklingen. I ett större projekt med många inblandade kan inte alla ta del av all kod eller ens någon kod alls. Därför måste också ytterligare dokumentation skrivas.

Man kan säga att alla dokumentation skrivs för att fungera som beslutsunderlag och/eller beskrivning av systemet på någon nivå.

Beslutsunderlag

Dokument utgör ofta beslutsunderlag till om projektet ska få fortsätta eller t.o.m. om det överhuvudtaget ska få starta. Natulrigtvis används dokument även vid mindre beslut.

Beskrivning

System som inte är dokumenterade går varken att använda eller underhålla. Vid slutlig leverans måste systemet vara fullständigt dokumenterat. Det är inte bara slutanvändaren som behöver dokumentation. Även inom projektet behöver olika komponenter, kod, delsystem och utvecklingsverktyg dokumenteras. Tänk på att den kod du skriver kanske behöver underhållas i flera decennier framöver.

Dokumenttyper

Det finns massor av olika typer av dokument som skrivs före, under och efter ett stort mjukvaruprojekt. Det skiljer sig naturligtvis lite mellan olika organisationer och projekt. Här är några typer som ofta finns med:

  • Systembeskrivning (på många olika nivåer)
  • Designdokument (detaljerade beskrivningar av de i projektet utvecklade programmen)
  • Leveransdokument (delleveranser och slutleveranser)
    Bör innehålla bla en beskrivning av kända begränsningar och fel.
  • Bruksanvisningar
  • Kvalitetsdokument (ibland enligt någon vedertagen standard)

Kodkommentarer i Python

I Python skriver man funktionskommentarer (och klasskommentarer) direkt efter deklarationen. Man skriver kommentaren som en vanlig flerradssträng (inleds och avslutas med tre dubbelfnuttar """), tex:

def print_schedule(data):
	"""
	The function prints the schedule on stdout (standard out)
	data - a dictionary containing the schedule
	"""
	
	# Här kommer koden

Med modulen pydoc kan man sedan generera dokumentation, t.ex. i html-format.



Testning

Att testa sina program är en självklarhet. Annars vet man ju inte om de fungerar. Det är en sak att få sitt program att kompilera, en annan att sak att det verkligen gör det man vill att det ska göra.

Det är väldigt svårt att veta om man testat allt.

Kodtestning i python

Det finns en modul i python - doctest - som kan tolka tester i kodkommentaren. Man kan klistra in en testkörning av funktionen och den kommer att utföras. Här följer ett exempel på get()-funktionen i en köklass (se labb 2).

class Queue:
    "En köklass"
    
    # Kod i köklassen

    def get(self):
        """
        Returnerar och tar bort det som står först i kön.
        
        >>> q=Queue()
        >>> q.put(5)
        >>> q.put(3)
        >>> 5==q.get()
        True
        """

	# Här börjar koden i funktionen

        retnode=self.head
        if self.head==self.tail:
            self.head=self.tail=None
        else:
            self.head=self.head.next
        return retnode.info

     # Mer kod i köklassen

def _test():
    import doctest
    doctest.testmod()

if __name__ == "__main__":
    _test()

Kör vi funktionen _test() får vi inget svar. Det är normalt eftersom testet fungerar. Vore köklassen felaktigt implementerad så get() returnerade något annat än 5 skulle vi få följande svar:

**********************************************************************
File "queue.py", line 28, in __main__.Queue.get
Failed example:
    5==q.get()
Expected:
    True
Got:
    False
**********************************************************************
1 items had failures:
   1 of   4 in __main__.Queue.get
***Test Failed*** 1 failures.

Utöver att detta ger en möjlighet att testa sin kod är det också bra att använda ett anrop för att beskriva användningen.

Unit test

Det behövs många tester för att testa stora system och alla dessa går inte att skriva i kodkommentarer för då blir inte kommentaren läslig. Istället skriver man egna testklasser som bara har till uppgift att testa en eller flera klasser i systemet. För att testa igenom hela systemet kör man sedan alla testfall i alla testklasser. I python finns ett paket - unittest - som man använder för detta.

Ett viktigt skäl till testning är att göra regressionstest, d.v.s. att kontrollera att den befintliga koden inte påverkas i oönskad riktning då man tillför eller ändrar någon annanstans. Om systemet är stort medför det ofta att många tusentals test måste göras varje gång något ändras i koden. Att automatisera testningen är nödvändigt.

Testdokument

Odokumenterade tester är värdelösa! Får man under utvecklingen av ett system en felrapport från ett test måste man snabbt kunna få veta vad för slags fel det är, helst så noggrant beskrivet som möjligt. All testkod måste alltså också dokumenteras så det är lätt att felsöka.

Kom ihåg att...

...det är lätt att skriva program som fungerar när användaren gör som man tänkt sig ... det är dock inte alltid fallet...

Här nedanför: egna anteckningar om kryptering

Sidansvarig: Magnus Rosell <rosell@csc.kth.se>
Uppdaterad 2006-10-04