Test och kvalitetsrapport Projektgrupp 1 Användaranpassat interface till Studiehandboken Version 1.0
Sida 2 av 231 Innehållsförteckning 3.1 Parter... 6 3.2 Dokumenthistorik... 7 3.3 Inledning... 7 3.3.1 Syfte... 7 3.3.2 Dokumentöversikt... 8 3.3.3 Begrepp... 8 3.3.3.1 Symfony... 8 3.3.3.2 Enhetstest... 8 3.3.3.3 Integrationstest... 8 3.3.3.4 Systemtest... 8 3.3.3.5 Acceptanstest... 8 3.3.3.6 Bugg... 8 3.3.4 Testnotation... 9 3.3.4.1 Testspecifikation... 9 3.3.4.2 Testprotokoll... 9 3.3.4.3 Felrapport... 9 3.3.5 Testdatabas... 9 3.4 Planerade tester... 10 3.4.1 Enhets- och Integrationstest... 10 3.4.1.1 Kommentarer och tabellförklaringar... 10 3.4.1.2 Arbetsordning till integrationstest... 11 3.4.1.3 Gemensamma (.lib)... 22 3.4.1.4 Studievy... 86 3.4.1.5 Utbildningsledarvy... 91 3.4.1.6 Parser... 103 3.4.1.7 Examensvy... 112 3.4.2 Systemtest... 115 3.4.2.1 Tabellförklaring... 115 3.4.2.2 Studievy... 116 TNM021 2
Sida 3 av 231 3.4.2.3 Utbildningsledarvy... 133 3.4.2.4 Examensvy... 154 3.4.2.5 Parser... 175 3.4.3 Acceptanstest... 181 3.5 Utförda tester med resultat... 181 3.5.1 Enhetstest... 181 3.5.1.1 Databaskopppling... 181 3.5.2 Integrationstest... 181 3.5.3 Systemtest... 181 3.5.3.1 Kalenderår, akademiska år och studieuppehåll... 181 3.5.3.2 Sökmotor... 183 3.5.3.3 Programsökning med profil... 184 3.5.4 Acceptanstest... 184 3.5.4.1 Gemensamma... 184 3.5.4.2 Parser... 190 3.5.4.3 Utbildningsledarvy... 194 3.5.4.4 Examensenhetsvy... 195 3.5.4.5 Studentvy... 198 3.6 Kvalitet... 199 3.6.1 Planerade mätningar... 199 3.6.1.1 Tillförlitlighet... 199 3.7 Användbarhet... 202 3.7.1 Användbarhet... 202 3.7.2 Prototyping... 202 3.7.3 Frågor och scenarier... 203 3.7.4 Användbarhetstester i det färdiga systemet... 204 3.7.5 Förberedelser inför tester i det färdiga systemet... 204 3.7.6 Sammanfattning av mätningsresultat... 206 3.7.6.1 Utbildningsledarna... 206 3.7.6.2 Studenterna... 207 3.7.6.3 Examensenheten... 208 3.7.7 GUI... 209 TNM021 3
Sida 4 av 231 3.7.7.1 Översikt... 209 3.7.7.2 Prototyper... 210 3.7.7.3 Ikoner... 213 3.7.7.4 Färgval och illustrationer... 213 3.7.7.5 Hjälp... 213 3.7.7.6 Kontakt... 214 3.7.7.7 Utbildningsledarvy Start... 214 3.7.7.8 Utbildningsledarvy Programplan, ett antagningsår... 215 3.7.7.9 Utbildningsledarvy - Programplan, ett antagningsår, sökresultat... 216 3.7.7.10 Utbildningsledarvy Programplan, flera antagningsår... 216 3.7.7.11 Utbildingsledarvy-Programplan, flera år Sökresultat... 217 3.7.7.12 Utbildningsleadrvy Sök kurser... 217 3.7.8 Examination... 218 3.7.9 Student... 220 3.7.10 Sök kurser... 221 3.7.11 Sökmotor (search)... 221 3.7.11.1 Sökmotor... 221 3.7.12 Formulärelement... 221 3.7.12.1 Studiehandbok... 221 3.7.12.2 Program... 222 3.7.12.3 Profil... 222 3.7.12.4 Termin... 222 3.7.12.5 Kurskod... 222 3.7.12.6 Kursnamn... 222 3.7.12.7 Huvudområde... 222 3.7.12.8 Block... 223 3.7.12.9 VOF... 223 3.7.12.10 Nivå... 223 3.7.12.11 Högskolepoäng (hp)... 223 3.7.12.12 Sök... 223 3.8 Dokumentgranskning... 223 3.8.1 Syfte... 223 TNM021 4
Sida 5 av 231 3.8.2 Granskningsprocess... 223 3.8.3 Checklistor... 224 3.8.4 Felstatistik... 224 3.8.5 Jämförelser av felstatistik... 230 3.9 Sammanfattning... 231 3.10 Bilagor... 231 TNM021 5
Sida 6 av 231 3.1 Parter Projektgrupp 1, Ht 2007 Linköpings Tekniska Högskola, Institutionen för teknik och naturvetenskap Namn Ansvar Telefon E-post Magnus Adnerhill Dan Eidmark Filip Gruvstad Marcus Andersson Projektledare, Studievy Projektledare, Examensvy Projektledare, Parser Projektledare, Utbildningsledarvy 070-41 00 515 magad271@student.liu.se 073-43 43 129 danei157@student.liu.se 070-89 69 065 filgr175@student.liu.se 070-86 06 836 maran840@student.liu.se Kund: Jonas Detterfelt Kursansvarig: Martin Karlsson Handledare: Sara Johansson TNM021 6
Sida 7 av 231 3.2 Dokumenthistorik Version Datum Utförda ändringar (utförda av:) Granskad 0.1 2007-11-17 Johan Jörtsö Ett första utkast med rubriker. 0.2 2007-12-04 Johan Jörtsö, Daniel Eriksson, Eirik Fredäng, Ulf Davidsson Första versionen för inlämning med planerade tester. 1.0 2007-12-15 Johan Jörtsö, Daniel Eriksson, Ulf Davidsson, Eirik, Fredäng, Anna Chung, Isac Jinton, Kristofer Höglund, Mats Karlsson Reviderad version med utförda tester och kvalitetsmätningar. Kund Handledare 3.3 Inledning 3.3.1 Syfte Att göra tester är nödvändigt för att kontrollera hur väl systemet utför de uppgifter som förväntas av det. Genom att göra tester kontinuerligt, så detekteras fel av olika svårighetsgrad. Dessa fel kan utvärderas och rättas till i prioritetsordning. Med mätningar på hur ofta ett fel påträffas kan även ett approximativt mått fås, på hur många, ännu inte upptäckta, fel som systemet innehåller. Beräkningar kan även göras på hur återkommande ett fel är och denna information är nödvändig då prioriteringar om vad som i första hand bör åtgärdas ska göras samt i ändamål för förebyggande av fel. Syftet med att skriva en testrapport är att ge utomstående en överblick över vilka tester som gjorts och vilka resultat de gett. Detta presenteras i testspecifikationer och felrapporter, där även åtgärder till uppkomna fel presenteras. Alla tester är beroende av en fungerande testdatabas. Efter i testpecifikation angivna förberedelser, så förklaras vart och hur ett test ska utföras samt för vilka funktioner dessa tester är skrivna för. I dessa anges även indata och förväntade utdata. I en felrapport specificeras uppkomna fel hierarkiskt i en prioritetsskala och vilka åtgärder som måste vidtagas för att felet ska rättas till. TNM021 7
Sida 8 av 231 3.3.2 Dokumentöversikt Detta dokument innehåller beskrivningar av vilka tester som är planerade att utföras samt de tester som utförts med tillhörande resultat. Dokumentet innehåller även en sammanställning av det arbete som utförts för att upprätthålla god dokument-, kod-, och produktkvalité under projektets gång. Som bilagor finns med vilka testdata som använts i testdatabasen, testkod, checklistor för dokumentgranskning, felstatistik samt prototyper. 3.3.3 Begrepp 3.3.3.1 Symfony Symfony är ett ramverk skrivet i programmeringsspråket PHP som underlättar och möjliggör att projektet fokuseras på att implementera den funktionalitet som användaren efterfrågat. Dokumentation och mer information om Symfony finns på http://www.symfony-project.com 3.3.3.2 Enhetstest Enhetstest skall testa de minsta delarna i systemet. Vilket betyder att varje klass och dess metoder testas separat. Detta för att säkerställa att de fungerar som de ska enligt designspecifikationen. I dessa tester har vi använt Symfonys inbyggda system för automatiserad enhetstestning. Enhetstest och integrationstest kan då på ett enkelt sätt köras genom ett knapptryck. 3.3.3.3 Integrationstest Integrationstest är till för att testa flöden av information mellan klasser och dess metoder. Detta används med andra ord för att klasser fungerar tillsammans med varandra och inte bara enskilt. Konflikter mellan olika delar i systemet kan således lättare upptäckas på ett tidigare stadium i projektprocessen. För att integrationstest skall kunna göras bör enhetstest ha utförts tidigare för de klasser som skall integrationstestas. 3.3.3.4 Systemtest Efter de use-case (användningsscenarion) som beskrivits i kravspecifikationen skrivs systemtest. De testar om systemet kan utföra vad det skall kunna utföra. 3.3.3.5 Acceptanstest Denna typ av test baserar sig på hur användaren eller kunden uppfattar systemet. Gör systemet vad det ska göra enligt kraven? Användbarhet (se under 3.8 Användbarhet) innefattas också här, är systemet lätt och smidigt att använda? Uppfattar till exempel användaren systemet som lätt att använda och lätt att lära sig? 3.3.3.6 Bugg I programmeringssammanhang vanlig benämning på ett fel i koden som gör att systemet inte fungerar som det ska. TNM021 8
Sida 9 av 231 3.3.4 Testnotation 3.3.4.1 Testspecifikation En testspecifikation beskriver ett eller flera testfall som skall utföras för att testa något, till exempel en klass. Testspecifikationen skrivs före testet utförs och specificerar hur testet skall utföras, vilka förberedelser som behövs, vad det har för indata och förväntade utdata. Om något speciellt behöver göras när testet har utförts och fel upptäcks, till exempel återställa saker i databasen eller liknande står det också med. 3.3.4.2 Testprotokoll För varje test som utförts skrivs ett testprotokoll. Testprotokollet är en utvärdering av testet och skrivs efter att testet är utfört. Testprotokollet beskriver om testet var lyckat eller ej. 3.3.4.3 Felrapport Om fel upptäckts skrivs en felrapport som graderar felet enligt: Remark Små lättlösta fel som enkla syntaxfel och väldigt enkla logiska fel. Fault Vanliga logiska fel, det som testas gör inte det som det är meningen att det ska göra. Serious fault Allvarliga fel som resulterar i att designen fallerar och man måste göra om den, eller resulterar i förstörda data eller liknande Felet och hur det sedan eventuellt korrigerats beskrivs sedan tillsammans med kodversion, datum och tid. Om felet har korrigerats noteras tiden som gått åt för detta. 3.3.5 Testdatabas Under implementation- och testfasen har en databas med testdata använts. Detta för att parsern som är den komponent i systemet som är mest avancerad och därför antogs bli klar sist. Användandet av en testdatabas möjliggör att tester som är beroende av en fungerande databas kan köras innan parsern blivit klar. Tanken med själva testdatan är att med ett antal exempelkurser från programmet Civilingenjör Medieteknik representera så många olika fall som möjligt. Till exempel: Översiktsvy baserat på olika startår (2005, 2006, 2007) och program (Medieteknik TCMEN och Medieteknik master 6CMEN) Valbara kurser (TEIE61 Industriell ekonomi) Profilkurser (TNM053 VR-teknik och TNM067 Vetenskaplig visualisering för Visualisering, TNM065 Dokumentstrukturer för Publicering) Ändringar i kursplanen för olika startår (TNM055 Databaser för MT2 VT2008 byts mot TNG033 Programmering i C++ för MT2 vårterminen 2008) TNM021 9
Sida 10 av 231 Testdatan är inte "fullständig", det vill säga, alla kurser finns inte med, men minst en kurs från varje schemablock varje år skall finnas med för Medieteknik startår 2005/2006 programkod TCMEN och 2007 programkod 6CMEN. 3.4 Planerade tester 3.4.1 Enhets och Integrationstest 3.4.1.1 Kommentarer och tabellförklaringar Ett enhetstest skall egentligen vara helt oberoende av andra klasser. Enligt den tänkta implementationsordningen skall klasser som ej beror på andra klasser implementeras först och sedan testas. Sedan implementeras de som beror på de klasser som är färdiga. Detta betyder att våra enhetstest egentligen testar både klassens funktioner och till viss del dess interaktion med andra klasser. Förklaring Testspecifikationer Nedan följer förklaringar till testspecifikationerna för enhets- och integrationstesten. Övertabell: Överst i en testspecifikation skall en övertabell finnas som är allmän för en hel klass. TestSpec.[vilken modul].[vilken klass] Förutsättningar Datum Här ska det stå vad som förutsätts för att testet skall kunna köras. Vilken typ av test specifikationen behandlar. När testspecifikationen skrevs. Undertabeller: Efter övertabellen skall det finnas undertabeller för varje funktion i klassen. En undertabell tar upp hur en funktion testas. Om funktionen kan göra flera saker så skall undertabellen delas upp i flera, en för varje sätt funktionen kan användas. TestSpec.[vilken modul].[vilken klass].[vilken funktion]([typ])-[nummer] TNM021 10
Sida 11 av 231 Här ska kraven (om funktionen utgår från några krav) som funktionen utgått från skrivas. Syfte: Varför detta test behövs. Indata : Vad som skickas in till funktionen (om något skickas in). Förväntade utdata: Vad som funktionen returnerar (om något returneras). Kriterier för lyckat test: Vad som gör att testet kan räknas som lyckat. Vad som måste göras innan testet kan utföras. Hur testet, steg för steg, skall utföras. Åtgärder om inga fel upptäckts: Vad som skall göras om inga fel upptäcks. Åtgärder om fel upptäckts: Vad som skall göras om fel upptäcks. 3.4.1.2 Arbetsordning till integrationstest För att testa systemet systematiskt så testar man komponenterna i en viss ordning för att man mer exakt ska veta vilken komponent i systemstrukturen som felar. Här använder vi oss av testtypen bottom up, en variant där vi börjar med att testa de klasserna som bara är beroende av enstaka andra klasser för att fungera. Sedan arbetar vi oss uppåt i systemet med de klasser som är beroende av flera klasser, på samma sätt som med implementationsordningen vid enhetstest. Syftet är här att se hur de olika klasserna interagerar med varandra och att flödet med information verkligen flyter utan problem genom systemet. Trädet i fältet struktur förklarar vilka andra underklasser som den behandlade klassen är beroende av och fältet Test refererar till testets testspecifikation. Test no.1: lib.profile Struktur lib.profile lib.course Test TestSpec.lib.Profile TNM021 11
Sida 12 av 231 Test no.2: lib.block Struktur lib.block lib.course Test TestSpec.lib.Block Test no.3: lib.period Struktur lib.period lib.block Test TestSpec.lib.Period Test no.4: lib.program Struktur lib.program lib.profile lib.course Test TestSpec.lib.Program Test no.5: lib.extensivecalenderyear Struktur lib.extensivecalenderyear lib.period lib.block Test TestSpec.lib.ExtensiveCalenderYear TNM021 12
Sida 13 av 231 Test no.6: lib.simplecalenderyear Struktur lib.simplecalenderyear lib.calenderyear lib.course Test TestSpec. lib.simplecalenderyear Test no.7: lib.coursemapper Struktur lib.coursemapper lib.basemapper lib.course Test TestSpec. lib.coursemapper Test no.8: lib.simplecalenderyearmapper Struktur lib.simplecalenderyearmapper TNM021 13
Sida 14 av 231 lib.simplecalenderyear lib.calenderyear lib.course Test TestSpec. lib.simplecalenderyearmapper Test no.9: lib.programmapper Struktur lib.programmapper lib.basemapper lib.profile lib.course lib.program lib.profile lib.course Test TestSpec. lib.programmapper Test no.10: lib.extensivecalenderyearmapper Struktur lib.extensivecalenderyearmapper lib.extensivecalenderyear? lib.period lib.period lib.block lib.block TNM021 14
Sida 15 av 231 lib.course lib.course Test TestSpec. lib.extensivecalenderyearmapper Test no.11: lib.studyplan Struktur lib.studyplan lib.program lib.profile lib.course lib.profile lib.course lib.extensivecalenderyear lib.period Test TestSpec. lib.studyplan Test no.12: lib.studyplanmapper Struktur lib.studyplanmapper lib.extensivecalenderyearmapper lib.extensivecalenderyear? lib.period lib.period TNM021 15
Sida 16 av 231 lib.block lib.block lib.course lib.course lib.extensivecalenderyear lib.period lib.program lib.profile lib.course lib.profile lib.course Test TestSpec. lib.studyplanmapper Test no.13: shared.sharedactions Struktur shared.sharedactions lib.profilemapper lib.basemapper lib.profile lib.course Test Test no.14: shared.studyplanformsuccess TNM021 16
Sida 17 av 231 Struktur shared.studyplanformsuccess symfony.formhelper symfony.ajaxhelper lib.program lib.profile lib.course lib.profile lib.course Test Test no.15: shared.studyplanformcomponent Struktur lib.program lib.profile lib.course lib.programmapper lib.basemapper lib.profile lib.course lib.program lib.profile lib.course lib.profile lib.course lib.profilemapper lib.basemapper lib.profile TNM021 17
Sida 18 av 231 lib.course lib.studyplan lib.program lib.profile lib.course lib.profile lib.course lib.extensivecalenderyear lib.period Test Test no.16: search._course Struktur search._course PartialHelper ( Symfony) Test Test no.17: search.simplesearchformsuccess Struktur search.simplesearchformsuccess symfony.formhelper TNM021 18
Sida 19 av 231 Test Test no.18: search._simplecalendaryear Struktur search._simplecalendaryear PartialHelper ( Symfony) search._course PartialHelper ( Symfony) Test Test no.19: serach.searchactions Struktur serach.searchactions lib.simplecalendaryearmapper search.searchformcomponent symfony.sfactions TNM021 19
Sida 20 av 231 Test Test no.20: search.indexsuccess Struktur search.indexsuccess symfony.partialhelper shared.searchformcomponent.advancedsearchform search._simplecalendaryear PartialHelper ( Symfony) search._course PartialHelper ( Symfony) Test Test no.20: search. advancedsearchformsuccess Struktur search. advancedsearchformsuccess symfony.formhelper lib.program lib.profile lib.course TNM021 20
Sida 21 av 231 lib.profile lib.course Test Test no.21: search.searchformcomponent Struktur search.searchformcomponent lib.program lib.profile lib.course lib.programmapper lib.basemapper lib.profile lib.course lib.program lib.profile lib.course lib.profile lib.course lib.profilemapper Test TNM021 21
Sida 22 av 231 3.4.1.3 Gemensamma (.lib) TestSpec.lib.Block Förutsättningar Förutsett att classen Course är skapad. Enhetstest/Integrationstest Datum 2007-11-28 TestSpec.lib.Block.Block(int)-1 Syfte: För att kunna guppera kurser efter block Indata : Block numret (1-4) Förväntade utdata: - Kriterier för lyckat test: variabeln number ska få det värde som matas in som indata. Kontrollera att classen Course är skapad. 1. skriv konstruktorn Block. 2. Kontrollera om number har blivit tilldelad det värde(samma som indata) som förväntas. TestSpec.lib.Block.getNumber-1 Syfte: För att kunna retunera block numret. Indata: - Förväntade utdata: det indata som används i TestSpec.lib.Block.Block(int)-1 Kriterier för lyckat test: Korrekt utdata retuneras. TNM021 22
Sida 23 av 231 Skriv konstruktor lib.block.block(int) 1. skriv getnumber() 2. kontrollera om utdata är korrekt. TestSpec.lib.Block.setNumber-1 Syfte: För att kunna sätta nya blocknummer. Indata: number Förväntade utdata: - Kriterier för lyckat test: Kontrollera med hjälp av getnumber om klassvariabeln number har samma värde som indatan. Förutsätt att getnumber redan är skriven 1. skriv setnumber() 2. kontrollera om klasvariabeln number är den samma som indatan. TestSpec.lib.Block.getCourses-1 Syfte: För att kunna få ut vilka kurser som liggeri ett visst block. Indata: - Förväntade utdata: En array med de kurser som finns i ett block Kriterier för lyckat test: Korrekt utdata retuneras. Skriv konstruktor lib.block.block(int) 1. skriv getcourse() 2. kontrollera om arrayen innehåller alla de kurser som den ska. TNM021 23
Sida 24 av 231 TestSpec.lib.Block.addCourse-1 Syfte: För att kuna lägga til len kurs. Indata: En kurs Förväntade utdata: - Kriterier för lyckat test: Kontrollera om indata kursen läggs i arrayen Course[] Skriv konstruktor lib.block.block(int) 1. skriv addcourse() 2. Kontrollera om indata kursen läggs i arrayen Course[]. TestSpec.lib.CalendarYear Förutsättningar Enhetstest Datum 2007-12-02 TestSpec.lib.CalendarYear.CalendarYear(year : int) -1 Syfte: Kontrollera konstruktorn CalendarYear(year : int) Indata /Use-Case: 2005 Förväntade utdata: - Kriterier för lyckat test: Konstruktorn lagrar årtalet 2005 Implementera getyear() 1. Skapa ett CalendarYear-objekt med konstruktorn CalendarYear(2005) 2. Kontrollera att getyear() returnerar 2005 TNM021 24
Sida 25 av 231 TestSpec.lib.CalendarYear.getYear() -1 Syfte: Kontrollera getyear() Indata /Use-Case: - Förväntade utdata: 1984 Kriterier för lyckat test: getyear() returnerar rätt årtal Implementera konstruktorn CalendarYear() 1. Skapa ett CalendarYear-objekt med årtal 1984 2. Kontrollera att getyear() returnerar 1984 TestSpec.lib.CalendarYear.setYear(year : int) -1 Syfte: Kontrollera setyear() Indata /Use-Case: 1985 Förväntade utdata: - Kriterier för lyckat test: setyear() ändrar årtal till 1985 Implementera konstruktorn CalendarYear() och getyear() 1. Skapa ett CalendarYear-objekt 2. Anropa setyear(1985) 3. Kontrollera att getyear() returnerar 1985 TestSpec.lib.Course Förutsättningar Enhetstest Datum 2007-11-29 TNM021 25
Sida 26 av 231 TestSpec.lib.Course.Course() -1 Syfte: Testa klassens konstruktor Indata /Use-Case: code = KOD001, name = Kursnamn, points = 6.0, level = G1, vof = O, areaname = Area, subjectname = Subject, year = 2008, period = { 1, 2 }, block = 1 Förväntade utdata: Ett kursobjekt med instansvariabler satta till indata Kriterier för lyckat test: Korrekt kursobjekt skapas Implementera setcode(), setname(), setpoints(), setareaname(), setyear(), addperiod(), addblock(), getcode(), getname(), getpoints(), getareaname(), getyear(), getperiods() och getblocks() 1. Skapa ett objekt Course( KOD001, Kursnamn, 6.0, G1, O, { Area 1, Area 2 }, Subject, 2008, { 1, 2 }, { 1, 3 }) 2. Kontrollera att koden är KOD001 med getcode() 3. Kontrollera att namnet är Kursnamn med getname() 4. Kontrollera att poängen är 6.0 med getpoints(hp_points) 5. Kontrollera att huvudområdena är Area 1 och Area 2 med getareaname() 6. Kontrollera att året är 2008 med getyear() 7. Kontrollera att perioderna är { 1, 2 } med getperiods() 8. Kontrollera att blocken är { 1, 3 } med getblocks() 9. Skapa ett objekt Course() 10. Kontrollera att samtliga getmetoder ger tomma värden TNM021 26
Sida 27 av 231 TestSpec.lib.Course.getCode() -1 Syfte: Kontrollera getcode() Indata /Use-Case: - Förväntade utdata: TNM030 Kriterier för lyckat test: getcode() returnerar rätt kurskod Implementera konstruktorn Course() 3. Skapa ett Course-objekt med kurskod TNM030 4. Kontrollera att getcode() returnerar TNM030 TestSpec.lib.Course.setCode() -1 Syfte: Kontrollera setcode() Indata /Use-Case: TNA001 Förväntade utdata: - Kriterier för lyckat test: setcode() ändrar kurskod till TNA001 Implementera konstruktorn Course() och getcode() 1. Skapa ett Course-objekt 2. Anropa setcode( TNA001 ) 3. Kontrollera att getcode() returnerar TNA001 TNM021 27
Sida 28 av 231 TestSpec.lib.Course.getName() -1 Syfte: Kontrollera getname() Indata /Use-Case: - Förväntade utdata: BoB Kriterier för lyckat test: getname() returnerar rätt kursnamn Implementera konstruktorn Course() 1. Skapa ett Course-objekt med kursnamn BoB 2. Kontrollera att getname() returnerar BoB TestSpec.lib.Course.setName() -1 Syfte: Kontrollera setname() Indata /Use-Case: Grunken Förväntade utdata: - Kriterier för lyckat test: setname() ändrar kurskod till Grunken Implementera konstruktorn Course() och getname() 1. Skapa ett Course-objekt 2. Anropa setname( Grunken ) 3. Kontrollera att getname() returnerar Grunken TNM021 28
Sida 29 av 231 TestSpec.lib.Course.getPoints() -1 Syfte: Kontrollera getpoints() Indata /Use-Case: - Förväntade utdata: 6.0 Kriterier för lyckat test: getpoints() returnerar rätt poäng Implementera konstruktorn Course() 1. Skapa ett Course-objekt med poäng 6.0 2. Kontrollera att getpoints(hp_points) returnerar 6.0 3. Kontrollera att getpoints(old_points) returnerar 4.0 TestSpec.lib.Course.setPoints() -1 Syfte: Kontrollera setpoints() Indata /Use-Case: points = 12.0, typeofpoints = HP_POINTS Förväntade utdata: - Kriterier för lyckat test: setpoints() ändrar poäng till 12.0 Implementera konstruktorn Course() och getpoints() 1. Skapa ett Course-objekt 2. Anropa setpoints(12.0, HP_POINTS) 3. Kontrollera att getpoints(hp_points) returnerar 12.0 TNM021 29
Sida 30 av 231 TestSpec.lib.Course.getAreaName() -1 Syfte: Kontrollera getareaname() Indata /Use-Case: - Förväntade utdata: Secret area Kriterier för lyckat test: getareaname() returnerar rätt huvudområde Implementera konstruktorn Course() 1. Skapa ett Course-objekt med huvudområde Secret area 2. Kontrollera att getareaname() returnerar Secret area TestSpec.lib.Course.addAreaName() -1 Syfte: Kontrollera addareaname() Indata /Use-Case: Area 51 Förväntade utdata: - Kriterier för lyckat test: addareaname()lägger till huvudområde Area 51 Implementera konstruktorn Course() och getareaname() 1. Skapa ett Course-objekt 2. Anropa addareaname( Area 51 ) 3. Kontrollera att getareaname() returnerar Area 51 TNM021 30
Sida 31 av 231 TestSpec.lib.Course.getYear() -1 Syfte: Kontrollera getyear() Indata /Use-Case: - Förväntade utdata: 1984 Kriterier för lyckat test: getyear() returnerar rätt årtal Implementera konstruktorn Course() 3. Skapa ett Course-objekt med årtal 1984 4. Kontrollera att getyear() returnerar 1984 TestSpec.lib.Course.setYear() -1 Syfte: Kontrollera setyear() Indata /Use-Case: 1985 Förväntade utdata: - Kriterier för lyckat test: setyear() ändrar årtal till 1985 Implementera konstruktorn Course() och getyear() 1. Skapa ett Course-objekt 2. Anropa setyear(1985) 3. Kontrollera att getyear() returnerar 1985 TNM021 31
Sida 32 av 231 TestSpec.lib.Course.getPeriods() -1 Syfte: Kontrollera getperiods() Indata /Use-Case: - Förväntade utdata: { 1, 3, 4 } Kriterier för lyckat test: getperiods() returnerar rätt perioder Implementera konstruktorn Course() 1. Skapa ett Course-objekt med perioder { 1, 3, 4 } 2. Kontrollera att getperiods() returnerar { 1, 3, 4 } TestSpec.lib.Course.addPeriod() -1 Syfte: Kontrollera addperiod() Indata /Use-Case: 2, 1, 4 Förväntade utdata: - Kriterier för lyckat test: addperiod() lägger till samtliga perioder Implementera konstruktorn Course() och getperiods() 1. Skapa ett Course-objekt 2. Anropa addperiod(2) 3. Anropa addperiod(1) 4. Anropa addperiod(4) 5. Kontrollera att getperiods() returnerar { 1, 2, 4 } TNM021 32
Sida 33 av 231 TestSpec.lib.Course.getBlocks() -1 Syfte: Kontrollera getblocks() Indata /Use-Case: - Förväntade utdata: { 1, 3, 4 } Kriterier för lyckat test: getblocks() returnerar rätt perioder Implementera konstruktorn Course() 1. Skapa ett Course-objekt med block { 1, 3, 4 } 2. Kontrollera att getblocks() returnerar { 1, 3, 4 } TestSpec.lib.Course.addBlock() -1 Syfte: Kontrollera addblock() Indata /Use-Case: 2, 1, 4 Förväntade utdata: - Kriterier för lyckat test: addblock() lägger till samtliga block Implementera konstruktorn Course() och getblocks() 1. Skapa ett Course-objekt 2. Anropa addblock(2) 3. Anropa addblock(1) 4. Anropa addblock(4) 5. Kontrollera att getblocks() returnerar { 1, 2, 4 } TNM021 33
Sida 34 av 231 TestSpec.lib.Course.getLevel() -1 Syfte: Kontrollera getlevel() Indata /Use-Case: Förväntade utdata: G1 Kriterier för lyckat test: getlevel() lägger hämtar G1 från course Implementera konstruktorn Course() och getblocks() 1. Skapa ett Course-objekt med level G1 2. Kontrollera att getlevel() returnerar G1 TestSpec.lib.Course.setLevel() -1 Syfte: Kontrollera setlevel() Indata /Use-Case: G1 Förväntade utdata: Kriterier för lyckat test: setlevel() sätter level till G1 i course Implementera konstruktorn Course() och getblocks() 1. Skapa ett Course-objekt 2. Anropa setlevel(g1) 3. Anropa getlevel() och kontrollera att den returnerar G1 TNM021 34
Sida 35 av 231 TestSpec.lib.CourseMapper Förutsättningar Datum 2007-12-03 Beroende av lib.course och lib.basemapper, test kräver tillgänglig databas med testdata Enhetstest /Integrationstest TestSpec.lib.CourseMapper.existsInDatabase(course : string[]) - 1 Syfte: Kontrollera existsindatabase() Indata /Use-Case: { TNA001 } Förväntade utdata: true Kriterier för lyckat test: existsindatabase() hittar existerande kurs i databasen Kontrollera att sökt kurs finns i databasen 1. Skapa fältet coursedata = array( TNA001 ) 2. Kontrollera att CourseMapper::existsInDatabase(courseData) returnerar true TestSpec.lib.CourseMapper.existsInDatabase(course : string[]) - 2 Syfte: Kontrollera existsindatabase() Indata /Use-Case: { KOD001 } Förväntade utdata: false Kriterier för lyckat test: existsindatabase() hittar ej icke existerande kurs i databasen Kontrollera att sökt kurs inte finns i databasen 1. Skapa fältet coursedata = array( KOD001 ) 2. Kontrollera att CourseMapper::existsInDatabase(courseData) returnerar false TNM021 35
Sida 36 av 231 TestSpec.lib.CourseMapper.studiesExistsInDatabase(course : string[]) - 1 Syfte: Kontrollera studiesexistsindatabase() Indata /Use-Case: { "TNA001", "Matematisk grundkurs", "1", "1", "O", "1", "6.0", "G1", "B", "Area", "2006", "pb", "TCMEN" } Förväntade utdata: true Kriterier för lyckat test: studiesexistsindatabase() hittar existerande kurstillfälle i databasen Kontrollera att sökt kurs finns i databasen 1. Skapa fältet coursedata = array("tna001", "Matematisk grundkurs", "1", "1", "O", "1", "6.0", "G1", "B", "Area", "2006", "pb", "TCMEN") 2. Kontrollera att CourseMapper::studiesExistsInDatabase(courseData) returnerar true TestSpec.lib.CourseMapper.studiesExistsInDatabase(course : string[]) - 2 Syfte: Kontrollera studiesexistsindatabase() Indata /Use-Case: { "TNA001", "Matematisk grundkurs", "1", "1", "O", "1", "6.0", "G1", "B", "Area", "1918", "pb", "TCMEN" } Förväntade utdata: false Kriterier för lyckat test: studiesexistsindatabase() hittar ej icke existerande kurstillfälle i databasen Kontrollera att sökt kurs inte finns i databasen 1. Skapa fältet coursedata = array("tna001", "Matematisk grundkurs", "1", "1", "O", "1", "6.0", "G1", "B", "Area", "1918", "pb", "TCMEN") 2. Kontrollera att CourseMapper::studiesExistsInDatabase(courseData) returnerar false TNM021 36
Sida 37 av 231 TestSpec.lib.CourseMapper.insertInDatabase(course : string[]) - 1 Syfte: Kontrollera insertindatabase() Indata /Use-Case: { "KOD001", "Kursnamn", "1", "1", "O", "1", "6.0", "G1", "B", "Area", "2008", "pb", "TCMEN" } Förväntade utdata: - Kriterier för lyckat test: insertindatabase() lagrar medskickad kurs i databasen Kontrollera att den kurs som ska läggas till inte redan finns i databasen 1. Skapa fältet coursedata = array("kod001", "Kursnamn", "1", "1", "O", "1", "6.0", "G1", "B", "Area", "2008", "pb", "TCMEN") 2. Kör CourseMapper::insertInDatabase(courseData) 3. Kontrollera att kurs och kurstillfälle lagrats korrekt i databasen: a. I course: "KOD001", "Kursnamn", 4, 5.0, "B", "G1" b. I educationarea: areaid, "Area" c. I belongstoeducation: "KOD001", areaid d. I studies: "pb", "TCMEN", 2008, 1, 1, "KOD001", "1", "O" TestSpec.lib.CourseMapper.storeInDatabase(course : string[]) - 1 Syfte: Kontrollera storeindatabase() Indata /Use-Case: { "KOD001", "Kursnamn", "1", "1", "O", "1", "6.0", "G1", "B", "Area", "2008", "pb", "TCMEN" } Förväntade utdata: - Kriterier för lyckat test: storeindatabase() lagrar medskickad kurs i databasen Kontrollera att den kurs som ska läggas till inte redan finns i databasen TNM021 37
Sida 38 av 231 1. Skapa fältet coursedata = array("kod001", "Kursnamn", "1", "1", "O", "1", "6.0", "G1", "B", "Area", "2008", "pb", "TCMEN") 2. Kör CourseMapper::storeInDatabase(courseData) 3. Kontrollera att kurs och kurstillfälle lagrats korrekt i databasen: a. I course: "KOD001", "Kursnamn", 4, 5.0, "B", "G1" b. I educationarea: areaid, "Area" c. I belongstoeducation: "KOD001", areaid d. I studies: "pb", "TCMEN", 2008, 1, 1, "KOD001", "1", "O" TestSpec.lib.CourseMapper.storeInDatabase(course : string[]) - 2 Syfte: Kontrollera storeindatabase() Indata /Use-Case: { "KOD001", "Kursnamn", "1", "1", "O", "1", "6.0", "G1", "B", "Area", "2008", "vi", "TCMEN" } Förväntade utdata: - Kriterier för lyckat test: storeindatabase() lägger till information om att ett program läser en kurs som redan finns i databasen Kontrollera att den kurs som ska läggas till redan finns i databasen 1. Skapa fältet coursedata = array("kod001", "Kursnamn", "1", "1", "O", "1", "6.0", "G1", "B", "Area", "2008", "vi", "TCMEN") 2. Kör CourseMapper::storeInDatabase(courseData) 3. Kontrollera att data lagrats korrekt i databasen: a. I studies: "vi", "TCMEN", 2008, 1, 1, "KOD001", "1", "O" TestSpec.lib.ExtensiveCalendarYear Förutsättningar Beror av lib.period, den måste vara implementerad Enhetstest/Integrationstest Datum 2007-12-03 TNM021 38
Sida 39 av 231 TestSpec.lib.ExtensiveCalendarYear.ExtensiveCalendarYear() -1 Syfte: Testa klassens konstruktor Indata /Use-Case: Förväntade utdata: Ett ExtensiveCalendarYear-objekt Kriterier för lyckat test: Korrekt objekt skapas 1. Skapa ett ExtensiveCalendarYear-objekt med värdet 2005 2. Kontrollera med getyear att värdet är 2005 3. Kontrollera att ExtensiveCalendarYear skapar korrekt objekt. TestSpec.lib.SimpleCalendarYear.setYear () -1 Syfte: Testa metoden setyear Indata /Use-Case: integer: 1972 Förväntade utdata: NULL Kriterier för lyckat test: NULL returneras Implementera setyear() 1. Sätt Year till 1972 med hjälp av setyear 2. Kontrollera att setyear returnerar NULL TestSpec.lib.ExtensiveCalendarYear.getYear() -1 Syfte: Testa metoden getyear Indata /Use-Case: Förväntade utdata: integer: 1984 Kriterier för lyckat test: getyear returnerar korrekt år TNM021 39
Sida 40 av 231 Implementera setyear() 1. sätt år till 1984 med metoden setyear(). 2. Kontrollera att getyear() hämtar en integer. 3. Kontrollera att getyear() hämtar korrekt year: 1984 Åtgärder om inga fel upptäckts: Åtgärder om fel upptäckts: Skriv felrapport ErrorRep.lib.ExtensiveCalendarYear.getYear-[datum,tid]. Korrigera felet. Kör ny testomgång. TestSpec.lib.ExtensiveCalendarYear.getPeriod() -1 Syfte: Testa metoden getperiod Indata /Use-Case: Förväntade utdata: periodobjekt Kriterier för lyckat test: Korrekt periodobjekt ska hämtas. Implementera getperiod(). TNM021 40
Sida 41 av 231 1. Hämta period 1. 2. Kontrollera att ett periodobjekt returneras. 3. Kontrollera att korrekt period hämtats. 4. Hämta period 2 5. Kontrollera att ett periodobjekt returneras. 6. Kontrollera att korrekt period hämtats. 7. Hämta period 3. 8. Kontrollera att ett periodobjekt returneras. 9. Kontrollera att korrekt period hämtats. 10. Hämta period 4. 11. Kontrollera att ett periodobjekt returneras. 12. Kontrollera att korrekt period hämtats. 13. Hämta period 5. 14. Kontrollera att NULL returneras. 15. Hämta period -1. 16. Kontrollera att NULL returneras. TestSpec.lib.ExtensiveCalendarYearMapper.buildSQL Förutsättningar Att indata till funktionen inte är felaktig i förhållande till förväntad indata. Enhetstest Datum 2007-12-03 TestSpec.lib. ExtensiveCalendarYearMapper.buildSQL-1 Syfte: Verifiera att funktionen bygger en korrekt SQL-fråga då användaren inte valt någon profil. Indata: årtal = 2006, programkod = TCMEN, terminer = 1,2 Förväntade utdata: En sträng (SQL-fråga). Kriterier för lyckat test: Att SQL-frågan följer korrekt SQL-syntax och att frågan kan användas för att hämta ut data för programmet TCMEN under år 2006, termin 1 och 2. TNM021 41
Sida 42 av 231 1. Matcha den returnerade strängen mot en förväntad sträng. TestSpec.lib. ExtensiveCalendarYearMapper.buildSQL-2 Syfte: Verifiera att funktionen bygger en korrekt SQL-fråga då användaren valt profil Indata: årtal = 2006, programkod = TCMEN,, profilkod = vi, terminer = 1,2 Förväntade utdata: En sträng (SQL-fråga). Kriterier för lyckat test: Att SQL-frågan följer korrekt SQL-syntax och att frågan kan användas för att hämta ut data för programmet TCMEN med profil Visualisering under år 2006, termin 1 och 2. 1. Matcha den returnerade strängen mot en förväntad sträng. TestSpec.lib. ExtensiveCalendarYearMapper.buildSQL-3 Syfte: Verifiera att funktionen bygger en korrekt SQL-fråga då användaren valt profil och en viss sorteringsordning på kurser. Indata: årtal = 2006, programkod = TCMEN,, profilkod = vi, terminer = 1,2, sortera på kurskod, sorteringsordning = fallande Förväntade utdata: En sträng (SQL-fråga). Kriterier för lyckat test: Att SQL-frågan följer korrekt SQL-syntax och att frågan kan användas för att hämta ut data för programmet TCMEN med profil Visualisering under år 2006, termin 1 och 2 och sorterar kurserna på kurskod i fallande ordning. 1. Matcha den returnerade strängen mot en förväntad sträng. TNM021 42
Sida 43 av 231 TestSpec.lib.ExtensiveCalendarYearMapper.getYearWithPeriodsBlocksCourses Förutsättningar En fungerande databas-koppling till en databas med testdata i. Enhetstest Datum 2007-12-01 15:25 TestSpec.lib.ExtensiveCalendarYearMapper. getyearwithperiodsblockscourses-1 Syfte: Verifiera att en korrekt och fullständig instans av ett kalenderårsobjekt (ExtensiveCalendarYear) returneras. Indata: Årtal = 2006, programkod = TCMEN, profilkod = vi, period = 1 Förväntade utdata: En instans av ExtensiveCalendarYear Kriterier för lyckat test: 1. Att en instans av ExtensiveCalendarYear returneras 2. Att kalenderår-objektet har korrekt årtal 3. Att kalenderår-objektet innehåller rätt kurser utifrån år, program, profil och termin Sätt upp databaskoppling, skapa instans utav klassen. 1. Kontrollera att det som returnerats är en instans av klassen ExtensiveCalendarYear 2. Kontrollera att objektet har korrekt årtal = 2006 3. Hämta kurser från de perioder och block som ingår i termin 2, år 2006. 4. Kontrollera att de kurser-objekten har samma kurskod som de i databasen. TNM021 43
Sida 44 av 231 TestSpec.lib.Period Förutsättningar beror av lib.block, den måste vara implementerad Enhetstest/Integrationstest Datum 2007-12-03 TestSpec.lib.Period.Period() -1 Syfte: Testa klassens konstruktor Indata /Use-Case: period: 1 integer Förväntade utdata: Ett periodobjekt med instansvariabler satta till indata Kriterier för lyckat test: Korrekt periodobjekt skapas Implementera 1. Sätt period till 1 i konstruktorn 2. Kontrollera att ett periodobjekt skapas med värdet 1 som integer med getnumber() TestSpec.lib.Period.setNumber() -1 Syfte: Testa metoden setnumber Indata /Use-Case: integer: 2 Förväntade utdata: Kriterier för lyckat test: Period sätts till 2 Implementera setnumber() 1. Sätt period till 2 med hjälp av setnumber() 2. Kontrollera att setnumber() returnerar NULL TNM021 44
Sida 45 av 231 TestSpec.lib.CalendarYear.getNumber() -1 Syfte: Testa metoden getnumber Indata /Use-Case: Förväntade utdata: integer: 2 Kriterier för lyckat test: Period återges som 2 Implementera getyear() 1. Kontrollera att getnumber() hämtar en integer 2. Kontrollera att getnumber() hämtar korrekt period, 2 TNM021 45
Sida 46 av 231 TestSpec.lib.Period.getBlock() -1 Syfte: Testa metoden getblock Indata /Use-Case: integer: 1, 2, 3, 4, -1 och 5 Förväntade utdata: integer: 1, 2, 3 och 4 Kriterier för lyckat test: Blockobjekt återges med nummer 1, 2, 3 och 4, samt värdet NULL Implementera getblock() 1. Kontrollera att getblock() hämtar ett blockobjekt 2. Kontrollera att getblock() hämtar blockobjekt nummer 1. 3. kontrollera att getblock() hämtar ett blockobjekt. 4. Kontrollera att getblock() hämtar blockobjekt nummer 2. 5. Kontrollera att getblock() hämtar ett blockobjekt. 6. Kontrollera att getblock() hämtar blockobjekt nummer 3. 7. Kontrollera att getblock() hämtar ett blockobjekt. 8. Kontrollera att getblock() hämtar blockobjekt nummer 4. 9. Kontrollera att getblock() returnerar NULL om block nummer 5 försöker hämtas. 10. Kontrollera att getblock() returnerar NULL om block nummer -1 försöker hämtas. TNM021 46
Sida 47 av 231 TestSpec.lib.Period.getBlocks() -1 Syfte: Testa metoden getblocks Indata /Use-Case: Förväntade utdata: array: blockobjekt Kriterier för lyckat test: Array med periodobjekt återfås. Implementera getblocks() 1. Kontrollera att getblocks() hämtar en array bestående av blockobjekt. 2. Kontrollera att getblock() hämtar korrekt array. TestSpec.lib.Period.addCourse() -1 Syfte: Testa metoden addcourse Indata /Use-Case: Förväntade utdata: Kriterier för lyckat test: En kurs läggs till i period. Implementera addcourse() 1. Skapa ett kursobjekt. 2. Sätt kursobjektet till TNA001. 3. skapa ett kursobjekt. 4. Sätt kursobjektet till TNA002. 5. Skapa ett kursobjekt. 6. Sätt kursobjektet till TNA005. 7. Lägg till kursen TNA005 med addcourse(). 8. Kontrollera att kursobjektet läggs till. TNM021 47
Sida 48 av 231 TestSpec.lib.Period.getCourses() -1 Syfte: Testa metoden getcourses Indata /Use-Case: Förväntade utdata: kursobjekt Kriterier för lyckat test: En kurs återfås som TNA005. Implementera getcourses() 1. Kontrollera att ett kursobjekt hämtas. 2. Kontrollera att korrekt kurs hämtas, TNA005. TestSpec.lib.Period.getCoursesInBlocks() -1 Syfte: Testa metoden getcoursesinblocks Indata /Use-Case: Förväntade utdata: kursobjekt Kriterier för lyckat test: Korrekta kurser returneras. Implementera addcourse() 1. Lägg till kurs TNA001 i block 1 med getblock() och addcourse(). 2. Lägg till kurs TNA002 i block 2 med getblock() och addcourse(). 3. Kontrollera att korrekt kursobjekt returneras för kurserna TNA001 och TNA002. TNM021 48
Sida 49 av 231 TestSpec.lib.Profile Förutsättningar Profile beror av lib.course, den måste vara implementerad Enhetstest/Integrationstest Datum 2007-11-28 TestSpec.lib.Profile.Profile -1 Syfte: Testa klassens konstruktor Indata /Use-Case: code = pb, name = Publicering Förväntade utdata: Ett profilobjekt med code = pb, name = Publicering Kriterier för lyckat test: Korrekt profilobjekt skapas Implementera getcode() och getname() 1. Skapa ett objekt Profile( pb, Publicering ) 2. kontrollera att koden är pb med getcode() 3. kontrollera att namnet är Publicering med getname() 4. Skapa ett objekt Profile() 5. kontrollera att koden är med getcode() 6. kontrollera att namnet är med getname() TNM021 49
Sida 50 av 231 TestSpec.lib.Profile.getCode() -1 Syfte: Kontrollera getcode() Indata /Use-Case: - Förväntade utdata: pb Kriterier för lyckat test: getcode() returnerar rätt profilkod Implementera konstruktorn Profile() och getcode() 3. Skapa ett Profile-objekt med profilkod pb 4. Kontrollera att getcode() returnerar pb TestSpec.lib.Profile.setCode() -1 Syfte: Kontrollera setcode() Indata /Use-Case: vi Förväntade utdata: - Kriterier för lyckat test: setcode() ändrar profilkod till vi Implementera konstruktorn Profile() och getcode() 1. Skapa ett Profile-objekt med profilkod pb 2. anropa setcode( vi ) 3. Kontrollera att getcode() returnerar vi TNM021 50
Sida 51 av 231 TestSpec.lib.Profile.getName() -1 Syfte: Kontrollera getname() Indata /Use-Case: - Förväntade utdata: Publicering Kriterier för lyckat test: getname() returnerar rätt profilnamn Implementera konstruktorn Profile() och getname() 1. Skapa ett Profile-objekt med profilkod Pb 2. Kontrollera att getname() returnerar Publicering TestSpec.lib.Profile.setName() -1 Syfte: Kontrollera setname() Indata /Use-Case: Visualisering Förväntade utdata: - Kriterier för lyckat test: setname() ändrar profilnamn till Visualisering Implementera konstruktorn Profile() och getname() 1. Skapa ett Profile-objekt med profilnamn Publicering 2. anropa setname( Visualisering ) 3. Kontrollera att getname() returnerar Visualisering TNM021 51
Sida 52 av 231 TestSpec.lib.Profile.addCourse() -1 Syfte: Indata /Use-Case: Förväntade utdata: Kriterier för lyckat test: Klassen Course måste vara implementerad. Implementera getcourses() 1. Skapa flera Course-objekt 2. Skapa ett Profile-objekt 3. Lägg till kurserna i profilen med addcourse() 4. Kontrollera att kurserna blev tillagda med getcourses() TestSpec.lib.Profile.getCourses() -1 Syfte: Kontrollera att getcourses() returnerar om inga kurser lagts till Indata /Use-Case: Förväntade utdata: En tom variabel för kurser ( ) Kriterier för lyckat test: getcourses returnerar och inte NULL Implementera Profile() 1. Skapa ett Profile-objekt 2. Kontrollera getcourses() returnerar en tom variabel för kurser ( ) TNM021 52
Sida 53 av 231 TestSpec.lib.ProfileMapper Förutsättningar Beroende av lib.profile och lib.basemapper Enhetstest/Integrationstest Datum 2007-11-28 TestSpec.lib.ProfileMapper.existsInDatabase(profile : string[])-1 Syfte: Testa om en profil finns i databasen Indata: array( pb, Visualisering, TCMEN ) Förväntade utdata: true Kriterier för lyckat test: databasfrågan returnerar minst en rad, dvs profilen finns Kolla att Profile( pb, visualisering, TCMEN ) existerar i databasen 7. Skapa fältet: array( pb, visualisering, TCMEN ) 8. Anropa ProfileMapper::existsInDatabase() med fältet som argument och kontrollera att returvärdet är true TestSpec.lib.ProfileMapper.existsInDatabase(profile : string[])-1 Syfte: Testa om en profil finns i databasen Indata: array( df, digital teknik i film och video, 6CMEN ) Förväntade utdata: false (nya Medieteknik MsC har inga profiler) Kriterier för lyckat test: databasfrågan returnerar 0 rader, dvs profilen finns inte Kolla att Profile( pb, visualisering, 6CMEN ) inte existerar i databasen 1. Skapa fältet: array( df, digital teknik i film och video, 6CMEN ) 2. Anropa ProfileMapper::existsInDatabase() med fältet som argument 3. Kontrollera att returvärdet är false TNM021 53
Sida 54 av 231 TestSpec.lib.ProfileMapper.insertInDatabase(profile: string[])-1 Syfte: Testa om en profil går att lägga in i databasen Indata: array( df, digital teknik i film och video, 6CMEN ) Förväntade utdata: true Kriterier för lyckat test: ProfileMapper::existsInDatabase() för profilen returnerar true, profilen har blivit inlagd i databasen. Implementera ProfileMapper::existsInDatabase() 1. Skapa fältet array( df, digital teknik i film och video, 6CMEN ) 2. Kontrollera med ProfileMapper::existsInDatabase() att profilen inte redan är inlagd (skall returnera false) 3. Anropa ProfileMapper::insertInDatabase() med fältet som argument 4. Kontrollera med ProfileMapper::existsInDatabase() att profilen blivit inlagd (skall returnera true) 5. Återställ databasen genom att ta bort Profile( df, digital teknik i film och video, 6CMEN ) (6CMEN har eg inte profiler, men det är bra testfall) TestSpec.lib.ProfileMapper.storeInDatabase(profile: string[])-1 Syfte: Testa om en profil går att lägga in i databasen Indata: array( vi, Visualisering, 6CMEN ) Förväntade utdata: true Kriterier för lyckat test: Implementera: ProfileMapper::existsInDatabase(), ProfileMapper::insertInDatabase() 1. Skapa fältet array( vi, Visualisering, 6CMEN ) 2. Kontrollera med ProfileMapper::existsInDatabase() att profilen inte redan är inlagd (skall returnera false) TNM021 54
Sida 55 av 231 3. Anropa ProfileMapper::storeInDatabase() med fältet som argument 4. Kontrollera med ProfileMapper::existsInDatabase() att profilen blivit inlagd (skall returnera true) 5. Anropa ProfileMapper::storeInDatabase() med samma fält som argument igen och kontrollera i databasen att ingen ändring skett 6. Återställ databasen genom att ta bort Profile( vi, Visualisering, 6CMEN ) (6CMEN har eg inte profiler, men det är bra testfall) TestSpec.lib.ProfileMapper.getProfile(profileCode: string, programcode: string)-1 Syfte: Testa om en det går att få ut ett Profile-objekt från databasen Indata: profilecode = pb, programcode = TCMEN Förväntade utdata: ett Profile-objekt Kriterier för lyckat test: Rätt Profile-objekt returneras Implementera: ProfileMapper::existsInDatabase(), ProfileMapper::insertInDatabase() Profile 1. Skapa ett objekt från ProfileMapper::getProfile( pb, Publicering ) 2. Kontrollera att ett Profile-objekt skapats 3. Kontrollera att profilecode är pb med profilobjekt.getcode() 4. Kontrollera att profilename är Publicering med profilobjekt.getname() TNM021 55
Sida 56 av 231 TestSpec.lib.Program Förutsättningar Program beror av lib.profile, den måste vara implementerad Enhetstest/Integrationstest Datum 2007-11-28 TestSpec.lib.Program.Program -1 Syfte: Testa klassens konstruktor Indata /Use-Case: code = TCMEN, name = Medieteknik Förväntade utdata: Ett programobjekt med code = TCMEN, name = Medieteknik Kriterier för lyckat test: Korrekt programobjekt skapas Implementera getcode() och getname() 1. Skapa ett objekt Program( TCMEN, Medieteknik ) 2. kontrollera att koden är TCMEN med getcode() 3. kontrollera att namnet är Medieteknik med getname() 4. Skapa ett objekt Profile() 5. kontrollera att koden är TCKTN med getcode() 6. kontrollera att namnet är Kommunikations- och Transportsystem med getname() TestSpec.lib.Program.getCode() -1 Syfte: Kontrollera getcode() Indata /Use-Case: - Förväntade utdata: TCMEN Kriterier för lyckat test: getcode() returnerar rätt programkod TNM021 56
Sida 57 av 231 Implementera konstruktorn Program() och getcode() 1. Skapa ett Program-objekt med programkod TCMEN 2. Kontrollera att getcode() returnerar TCMEN TestSpec.lib.Program.setCode() -1 Syfte: Kontrollera setcode() Indata /Use-Case: TCKTN Förväntade utdata: - Kriterier för lyckat test: setcode() sätter profilkod till TCKTN Implementera konstruktorn Program() och getcode() 1. Skapa ett Program-objekt med programkod TCKTN 2. anropa setcode( TCKTN ) 3. Kontrollera att getcode() returnerar TCKTN TestSpec.lib.Profile.getName() -1 Syfte: Kontrollera getname() Indata /Use-Case: - Förväntade utdata: Kommunikations- och Transportsystem Kriterier för lyckat test: getname() returnerar rätt programnamn Implementera konstruktorn Program() och getname() 1. Skapa ett Program-objekt med programkod TCKTN 2. Kontrollera att getname() returnerar Kommunikations- och Transportsystem TNM021 57
Sida 58 av 231 TestSpec.lib.Program.setName() -1 Syfte: Kontrollera setname() Indata /Use-Case: Kommunikations- och Transportsystem Förväntade utdata: - Kriterier för lyckat test: setname() ändrar programnamn till Kommunikationsoch Transportsystem Implementera konstruktorn Program() och getname() 1. Skapa ett Program-objekt med profilnamn Kommunikations- och Transportsystem 2. anropa setname( Kommunikations- och Transportsystem ) 3. Kontrollera att getname() returnerar Kommunikations- och Transportsystem TestSpec.lib.Program.addProfile() -1 Syfte: Indata /Use-Case: Förväntade utdata: Kriterier för lyckat test: Klassen Profile måste vara implementerad. Implementera getprofiles() 1. Skapa flera Program-objekt 2. Skapa ett Program-objekt 3. Lägg till profilerna i programmet med addprofile() 4. Kontrollera att kurserna blev tillagda med getprofiles() TNM021 58
Sida 59 av 231 TestSpec.lib.Program.getProfiles() -1 Syfte: Kontrollera att getprofiles() returnerar om inga profiler lagts till Indata /Use-Case: Förväntade utdata: En tom variabel för profiler ( ) Kriterier för lyckat test: getprofiles returnerar och inte NULL Implementera Program() 1. Skapa ett Program-objekt 2. Kontrollera getprofiles() returnerar en tom variabel för profiler ( ) TestSpec.lib.SimpleCalendarYear Förutsättningar Enhetstest Datum 2007-12-03 TestSpec.lib.SimpleCalendarYear.SimpleCalendarYear() -1 Syfte: Testa klassens konstruktor Indata /Use-Case: Förväntade utdata: Ett SimpleCalendarYear-objekt Kriterier för lyckat test: Korrekt objekt skapas 1. Skapa ett SimpleCalendarYear-objekt med värdet 2005 2. Kontrollera med getsimplecalendaryear att värdet är 2005 3. Kontrollera att SimpleCalendarYear skapar korrekt objekt. TNM021 59
Sida 60 av 231 TestSpec.lib.SimpleCalendarYear.setYear () -1 Syfte: Testa metoden setyear Indata /Use-Case: integer: 1972 Förväntade utdata: NULL Kriterier för lyckat test: NULL returneras Implementera setyear() 1. Sätt Year till 1972 med hjälp av setyear 2. Kontrollera att setyear returnerar NULL Åtgärder om inga fel upptäckts: Åtgärder om fel upptäckts: Skriv felrapport ErrorRep.lib.SimpleCalendarYear.setYear.-[datum,tid]. Korrigera felet. Kör ny testomgång. TestSpec.lib.SimpleCalendarYear.getYear() -1 Syfte: Testa metoden getyear Indata /Use-Case: Förväntade utdata: integer: 1972 Kriterier för lyckat test: getyear returnerar korrekt år Implementera getyear() 1. Kontrollera att getyear() hämtar en integer 2. Kontrollera att getyear() hämtar korrekt year: 1972 TNM021 60