Kurt Nørmark ©
Department of Computer Science, Aalborg University, Denmark
September 2001
Abstract Previous lecture Next lecture Index References Contents | I denne lektion er emnet programtest og programdokumentation. Begge emner repræsenterer meget vigtige områder i praktisk softwareudvikling. I delafsnittet om test lægger vi os rimeligt tæt op ad fremstillingen i Pressman's bog om software engineering. I delafsnittet om dokumentation fremstiller vi kortfattet værktøjet javadoc. Derefter diskuterer vi intern program dokumentation med såkaldt 'literate programming' som konkret eksempel. Begge delafsnit indledes på det generelle niveau og de afrundes med nogle praktiske råd rettet mod en objekt-orienteret programmeringssituation |
Introduktion til programtest |
Introduktion til test Slide Note Contents Index References | Vi starter her med en bred introduktion til det at teste et program |
The concept test af program: Test af et program er en aktivitet, som har til formål at afsløre evt. defekter i programmet i forhold til programspecifikationen eller i forhold til intentionen bag programmet | Programtest er en aktivitet i udviklingsprocessen, der har til formål at afsløre evt. defekter i et program. Defekterne er ideelt set i forhold til en præcis programspecifikation, eller i fravær af en sådan, i forhold til intentionen bag programmet |
|
|
|
Testabilitet Slide Note Contents Index References | Testabilitet er oversættelsen af den engelske term 'testability', som refererer til 'det at kunne teste et program' |
|
|
|
|
Testenheder Slide Note Contents Index References | Det er vigtigt at være sig bevidst, hvilke enheder vi tester. Når vi interesserer os for objekt-orienteret programmering er der flere muligheder. |
|
|
Testutopi Slide Note Contents Index References | Vi vil her se på det umulige i at kunne gennemføre en totaltest af et program, som sikrer at der ikke er fejl |
|
The concept totaltest: En totaltest er en kombinatorisk komplet test af alle mulige stier gennem et program | En totaltest indebærer, at alle mulige stier gennem et program testes |
|
|
Programbevis Slide Note Contents Index References | Et programbevis er et matematisk ræsonnement som overbeviser os om korrektheden af et program. Dette står i modsætning til en test, som er en empirisk sandsynliggørelse af, at der ikke er fejl i programmet. Vi ser, at der er tale om to vidt forskellige aktiviteter |
|
Den form for bevis, vi diskuterer her, kaldes partiel korrekthed. Årsagen er at vi forudsætter at programmet terminerer (kører til ende). Hvis vi ikke forudsætter terminering taler vi om en endnu stærkere form for korrekthed, nemlig total korrekthed |
|
White box testteknik |
White box test Slide Note Contents Index References | Umiddelbart melder spørgsmålet sig, hvilke enheder vi tænker på når vi taler white og black box test. Svaret er ikke oplagt, og slet ikke når vi dyrker objekt-orienteret programmering. Man kan tænke på at enhederne, som vi omtaler i denne del af lektionen, er enkelt operationer, eller operationer som kalder andre operationer. Man kan naturligvis også tænke på en enhed som et helt program, men i langt de fleste situationer vil det være helt uoverkommeligt at gennemføre en whitebox test af en så stor enhed. Materialet i denne del af lektionen er baseret på lærebogen i Software engineering, som refereret herunder |
|
The concept programenhed: En programenhed er i denne lektion en fællesbetegnelse for et programfragment (procedure, metode, klasse, modul, program) som er en test kandidat | Betegnelsen 'programenhed' benyttes i denne lektion som en fællesbetegnelse for f.eks. procedurerer og klasser, som vi skal teste |
|
|
|
Test af uafhængige stier Slide Note Contents Index References | Som det fremgår af de forrige sider, er begrebet 'uafhængig sti' central for basal white box test. Vi ser nærmere på begrebet her |
The concept sti: En sti gennem en programenhed er en sekvens af primitive kommandoer og betingelser, som gennemføres i en programudførelse. Stien starter ved indgang til enheden og slutter ved udgangen af programenheden | Intuitivt er en sti gennem en programenhed en bestemt rækkefølge af primtive kommandoer og primtive betingelser, som udføres fra start til slut af programenheden | |
The concept uafhængig sti: En uafhængig sti i en programenhed er en sti som tilføjer mindst én ny kommando eller betingelse relativt til de hidtil identificerede uafhængige stier i programenheden | En uafhængig sti gennem en programenhed er en sti (i ovennævnte betydning) som tilføjer mindst én ny primitiv kommando eller betingelse i forhold til de andre uafhængige stier |
Ovennævnte definitioner er relativt upræcises, omend intuitionen burde være klar nok. Når vi indfører kontrol flow grafer kan vi formulere en noget mere præcis definition af en uafhængig sti |
|
Fra programenhed til flow graph (1) Slide Note Contents Index References |
Program: Et simpelt, stilistisk program med en løkke og to forgreninger i løkken.
Programmet skal bruges til at illustrerer antallet af uafhængige stier med henblik
på whitebox test af programmet |
|
Figure. Et flow chart (rutediagram) som modsvarer ovenstående program | ![]() |
Fra programenhed til flow graph (2) Slide Note Contents Index References |
Figure. Fire uafhængige stier i hosstående flow graph: A, r A, X, B, C, Y, p, q, A, r A, X, B, C, Z, p, q, A, r A, X, B, V, W, q, A, r | ![]() |
Et rutediagram (en flow chart) er en grafisk illustration af primitive kommandoer og kontrolstrukturer fra et programmeringssprog. En flow graph er en abstraktion over et rutediagram, som sætter fokus på de forskellige kontrolveje. Én eller flere kommandoer i sekvens slås sammen med det efterfølgende forgreningspunkt. Endvidere introduceres der knuder for de punkter, hvor kontrollen mødes efter en forgrening. Således repræsenterer kanterne i grafen de forskellige veje kontrollen kan forløbe. Knuderne repræsenterer forgrenings og samlingspunkter |
|
Udledning af testtilfælde til white box test Slide Note Contents Index References | Vi opsummerer her praktisk hvordan man finder 'testtilfælde' til en white box test |
The concept testtilfælde: Et testtilfælde repræsenterer bestemte input til en programenhed samt evt. det ønskede resultat. Testtilfældet skal sikre et bestemt gennemløb af enheden, og det skal tillade os at vurdere om resultatet af enhedens udførsel er korrekt | Et testtilfælde (test case) betegner de input og det forventede resultat af en programenhed, som vi tester. Testtilfældet gives til programenheden som udføres, og resultatet af udførelsen sammenlignes med det forventede resultat |
Grafteoretisk kan dette vises at være det samme som antallet af kanter minus antallet af knuder plus 2, eller antallet af 'prædikatknuder' (knuder hvor der foretages et valg mellem to muligheder) plus 1 |
|
Andre white box tests Slide Note Contents Index References | Inden vi forlader white box test vil vi nævne nogle andre og supplerende testtilfælde, som kan være fornuftigt at overveje |
|
|
|
Black box testteknik |
Black box test Slide Note Contents Index References | Black box test er i mange tilfælde et mere praktisk og overkommeligt alternativ til white box test. Vi introducerer på denne slide black box test. Detaljer følger på efterfølgende sider |
|
|
|
Exercise 6.1. Test af Kortbunke | Vi har i en opgave for nylig beskæftiget os med klassen Kortbunke.
I nærværende opgave bedes I gennemføre en black box test
af klassen Kortbunke. Jeg foreslår, at I foretager en test af min udgave af klassen Kortbunke fra sidste gang. Hvis I anstrenger jer kan
I måske afsløre en fejl eller to... Nærmere beskrevet bedes I gøre følgende under løsningen af opgaven:
|
Valg af input til black box test (1) Slide Note Contents Index References | Det kritiske element i en black box test er udvælgelse af gode og repræsentative input. Dette er emnet på denne side |
|
The concept ækvivalensopdelning: En ækvivalensopdelning af en inputtype splitter mængden af værdier i typen op i et lille antal klasser. Opdelningen skal foregå ud fra det kriterium at alle værdier i en klasse skal være 'lige gode' til at afsløre fejl i en programenhed | En ækvivalensopdeling deler en input type i et lille antal klasser. Det er filosofien at alle værdier i en klasse skal være lige gode til at afsløre evt. fejl i en programenhed, som input af den pågældende type. Derfor kan vi vælge at teste programenheden med repræsentanter for ækvivalensopdelingen frem for alle mulige værdier fra inputdomænet |
|
Valg af input til black box test (2) Slide Note Contents Index References | Ud over en form for ækvivalensopdelning kan man overveje andre kriterier for valg af input, hvorpå vi skal test programenheden |
|
|
Eksempel på black box test Slide Note Contents Index References | Vi ser nu på praktiske eksempler på black box test af to procedurerer, som er programmeret i Pascal |
Program: Proceduren Ombyt(var T: ArrayType; i,j: TabelInterval).
|
|
|
Program: Funktionen FindMaxIndex(var T: ArrayType; fra, til: TabelInterval): TabelInterval.
|
|
Som eksempel på et overflødigt testtilfælde, som følge af prebetingelsen af FindMaxIndex, kan vi nævne de tilfæde som indbefattr 'fra er én større end til'. |
Program: Det samlede sorteringsprogram.
| ![]() |
Teststrategi |
Teststrategi Slide Note Contents Index References | Vi går nu over til at se på de større linier i gennemførelsen af test af et program og dets bestanddele |
|
|
Enhedstest Slide Note Contents Index References | Enhedstest betegner den mest finkornede test, som vi foretager os |
The concept enhedstest: En enhedstest betegner en relativ isoleret test af den mindste enhed, som vi vælger at afprøve | Enhedstest er betegnelsen for den mest finkornede test, som vi vælger at gennemføre. Enhedstest gennemføres så isoleret og afsondret fra andre enheder som muligt |
|
|
Figure. Arrangement af en enhedstest. Testtilfældene indlæses i et driverprogram, som kalder eller anvender den enhed E, som vi tester. For at kunne afprøve enheden så isoleret som muligt anvender vi stubbe for andre enheder, som E er afhængig af. Alternativt kan vi overveje at benytte andre enheder, som vi allerede har testet | ![]() |
Integrationstest Slide Note Contents Index References | Integrationstest betegner den test, hvor vi sætter enhederne sammen til større og større dele. Der er mange måder at gøre dette på i testhenseende |
The concept integrationstest: En integrationstest betegner en samlet afprøvning af en mængde af enheder, og i sidste instans af det komplette program | Vi anvender betegnelsen 'integrationstest' om afprøvningen af en mængde af enheder, som anvender hinanden. Integrationstesten vil ultimativt rette sig mod afprøvningen af det komplette program |
|
|
|
Sammenligning af top-down og bottom-up integrationstest Slide Note Contents Index References | Her ser vi på de to yderpunkter i det vi på forrige slide kaldte 'bevægelsesretningen' |
|
|
Code Review |
Code Review Slide Note Contents Index References | Materialet på denne side er inspireret fra kapitel 9, 'Code review' i Bashir og Goel's bog - referet andetsteds på denne side |
|
The concept Code review: Et 'Code review' er et formelt møde hvor en gruppe af kvalificerede personer (udviklere) - om mulig med forskellig baggrund - identificerer fejl i et program |
|
|
Test af objekt-orienterede programmer |
Observationer Slide Note Contents Index References | I forhold til dette kursus er det naturligvis interessant, om der gør sig særlige forhold gældende når man tester objekt-orienterede programmer. Dette er emnet på denne og de næste få slides |
|
|
Test af klasse 'skiver' Slide Note Contents Index References | Ideerne på denne side stammer fra bogen 'Testing Object-oriented Software - Life Cycle Solutions', som er referert andet steds på denne side. |
|
The concept Slice: En slice (skive) af en klasse udgøres af én instansvariabel og alle de metoder som tilgår variablen | En slice (eller på dansk skive) af en klasse tager udgangspunkt i en variabel. Med variablen følger alle de metoder, som direkte eller indirekte læser fra eller assigner til variablen. |
|
White box aspektet udgøres af dannelsen af skiver (slices). Dette kræver at vi studerer klassen internt. Resten af testen er helt igennem efter black box ideen. |
|
Detaljer om slice-baseret klasse enhedstest Slide Note Contents Index References | Vi ser her på nogle mere detaljerede anvisninger på en slice baseret klasse enhedstest |
En observationsmetode er en funktion, der aflæser egenskaber et objekt. En report må ikke på nogen måde påvirke objektets tilstand. En mutationsmetode en en metode, som ændrer et objekts tilstand. I de fleste klasser er det de metoder der er til rest, når vi har set bort fra observationsmetoderne. |
Klassen som testenhed: Praktiske problemer Slide Note Contents Index References | Vi vil her diskutere nogle praktiske aspekter af enhedstest af klasser |
|
|
Test i forhold til kontraktideen (1) Slide Note Contents Index References | Vi har tidligere i kurset studeret kontraktbegrebet, pre- og postbetingelser og klasseinvarianter. Vi indså at kontrakter er værdifulde under design til fastlæggelse af ansvar mellem klasser i et objekt-orienteret program. Vi konstaterede imidlertid også, at ideerne omkring kontrakter påvirker mange andre faser i programudviklingsprocessen. Her sætter vi fokus på værdien af (og naturligvis også begrænsningerne ved) kontrakter i en testaktivitet |
|
Selv om ideen om kontrakter reducerer antallet af testtilfælde er der stadig store udfordringer i at vælge hensigtsmæssig test input til en black box test af et program med kontrakter |
|
Test i forhold til kontraktideen (2) Slide Note Contents Index References | Der er også en række aspekter af test, hvor der ikke er hjælp at hente fra kontraktideen. På denne side kaster vi lys på disse. |
|
|
|
|
Opsummering Slide Note Contents Index References | Vi afrunder med en synopsis over nogle praktiske råd om test af objekt-orienterede programmer |
|
Introduktion til programdokumentation |
Hvorfor programdokumentation Slide Note Contents Index References | Vi går nu over til lektionens andet store emne, programdokumentation |
|
|
|
Moduldokumentation Slide Note Contents Index References | Moduldokumentation er på helt naturlig måde dokumentation af klasser når vi taler objekt-orienteret programmering |
|
|
Dokumentation: Strukturering i tid og rum Slide Note Contents Index References | Vi ser her på hvornår i udviklingsprocessen vi skriver dokumentation, og hvordan denne struktureres og organiseres i forhold til programmet |
|
Dokumentation i forhold til test Slide Note Contents Index References | Vi vil her kort diskutere forholdet mellem denne lektions to dele: test og dokumentation |
|
|
Javadoc |
Introduktion til javadoc Slide Note Contents Index References | Javadoc er et eksempel på et simpelt værktøj, som kan gøre stor nytte når vi skal definere eksternt rettet moduldokumentation af et objekt-orienteret programmet |
|
|
Javadoc materiale Slide Note Contents Index References | Vi giver her en række henvisninger til detaljeret materiale og dokumentation om javadoc |
|
Literate Programming |
Intern programdokumentation ala literate programming Slide Note Contents Index References | Her til sidst i lektionen vil vi kort se internt rettet programdokumentation |
|
|
|
Citatet stammer fra Kristen Nygaard, oprindelig ophavsmand til objekt-orienteret programmering i Simula |
Det klassiske literate programming værktøj Slide Note Contents Index References | Literate programming er en forholdsvis generel ide, som kan understøttes på mange forskellige måder. Her ser vi på et klassisk værktøj, som har været benyttet til en sådan understøttelse. Værktøjet, eller rettere værktøjsfamilien, kaldes WEB efter det første sådanne, lavet af Donald Knuth |
|
Figure. Organiseringen af værktøj i WEB systemer, der understøtter literate programming. | ![]() |
|
|
Intern struktur af et literate WEB dokument Slide Note Contents Index References |
|
Figure. Den interne struktur af et WEB dokument. De grå pile repræsenterer den lineære dokumentationsstruktur. Den lilla pile repræsenterer hierarkisk programstruktur. Herunder ses programtræet trukket ud af nettet, og sat sammen til en helhed | ![]() |
Figure. Programstrukturen som defineret ovenfor af de røde bokse og de lilla pile | ![]() |
Opsummering Slide Note Contents Index References |
|
Collected references Contents Index |
|
Chapter 6: Test og Dokumentation
Course home Author home About producing this web Previous lecture (top) Next lecture (top) Previous lecture (bund) Next lecture (bund)
Generated: March 31, 2008, 12:08:36