Avancerad användning av JUnit
|
|
- Linnéa Dahlberg
- för 5 år sedan
- Visningar:
Transkript
1 Avancerad användning av JUnit David Meyer, Adam Wamai Egesa D07, Lunds Tekniska Högskola 28 februari 2012 Abstract Denna djupstudie om avancerad använding av JUnit går närmare in på fyra avancerade användingsområden av JUnit, Mock Objects, exception testning, theories och parameterized testning. Dessa områden valdes efter granskring av flertalet artiklar som behandlade olika avancerade användningsområden för JUnit. Målet var att hitta bra avancerade användningsområden och verktyg för dessa samt att utvärdera dess användbarhet för oss själva och programmeringsprojekt i universitetskurser. Verktyg för alla områden utom Mock Objects och Theory Explorer i theories finns inbyggda i JUnit även om dokumentationen för vissa av dem var mycket bristfällig. För att generera Mock Objects användes verktyget Mockito[3]. Resultatet av studien blev fyra verktyg som kommer vara till nytta i framtiden för oss och eventuellt även för programmeringsprojekt i universitetskurser. 1 Introduktion 1.1 Bakgrund Denna rapport behandlar en djupstudie utförd i kursen Coaching för programvaruteam vid Lunds tekniska högskola (LTH) under läsperioderna /2012. Syftet med djupstudien är att utforska olika avancerade användningsområden för JUnit och undersöka dess relevans. JUnit används för att underlätta testning av Javaprogram. Genom ett ramverk av klasser för att skriva testfall gör JUnit att utvecklaren kan skriva testfall på ett bekvämare sätt och sedan köra alla tester på 1 av 19
2 en gång. Det finns en del i JUnit som heter Testrunner. Denna del tolkar testerna och utför själva testningen. Återkoppling för vilka tester som går igenom och vilka som fallerar ges sedan på ett bekvämt vis direkt i din IDE eller terminal. När ett testfall inte går igenom skrivs ett Failure Trace ut vilket ger detaljerad information om vad som gått fel och vart felet inträffat. 1.2 Syfte Valet av ämne beror på intresset att ta reda på om det finns avancerade testtekniker för JUnit som kan vara användbara i framtida projekt, både ute i arbetslivet och under studietid. I kursen ingår även ett projekt där vi agerar coacher för ett programvaruteam som skall ta fram programvara för ett tidtagningssystem. Teamet arbetar med Extreme Programming[17] där Test Driven Development (TDD) är ett viktigt inslag. Extreme programming är en agil utvecklingsmetod som kännetecknas av bla pair programming, continuous integration och Test Driven Development (TDD)[15]. Test driven development innebär att utvecklarna skriver testfallen före själva implementationen av programmet. Detta gör att själva designen av koden blir mer genomtänkt eftersom utvecklaren tvingas tänka igenom vad det egentligen är man vill uppnå. Det hade därför varit mycket tillfredsställande att finna verktyg och tekniker som kan hjälpa teamet i sitt arbete med TDD. Detta är ett ypperligt tillfälle att experimentera lite med avancerad användning av JUnit. Teamet som coachas består av programmerare som antagligen har mycket lite erfarenhet av testning. Därför är det viktigt att de verktyg som testas med teamet inte blir för avancerade och förstör istället för att hjälpa till. 1.3 Metod Metoden som används i denna djupstudie är att olika avancerade användningsområden för JUnit identifieras. Dessa användningsområdens relevans kommer sedan bedömas, främst genom en utvärdering av hur användbart vi själva bedömer att en viss mekanism är men vi kommer även att kolla på hur utbredd själva användningen är. Om det visar sig att ett verktyg eller en metod inte är något som används idag så betyder det antagligen att de inte är bra. För de användningsområden och verktyg som är relevanta kommer en referenssökning genomföras för att hitta säker information. Vissa mindre verktyg kanske inte behandlas i några vetenskapliga artiklar och tidskrifter. I sådana fall kommer information från utvecklare och community att användas. Efter att olika områden identifierats som relevanta kommer tester genom praktisk användning att genomföras. Detta är huvudsakligen tänkt att ske genom en enkel implementering. Därefter kommer en slutgiltig utvärdering att ske. Utvärderingen kommer gå in på relevans för användning i teamets arbete samt generell användning. 2 Användning av JUnit s standardmetoder Detta stycke syftar till att ge en snabb introduktion av JUnit för de läsare som inte är bekanta med verktyget. Om läsaren sedan tidigare använt JUnit kan denna del av uppsatsen hoppas över. För att kunna skriva testfall i JUnit behövs en import av org.junit.test;. Vanlig praxis är att göra en separat testklass för att testa en klass. En testmetod inleds med public 2 av 19
3 void testbankaccount(). I testmetoden skrivs sedan kod för att testa en viss del av originalkoden. För att ett testfall skall gå igenom eller misslyckas och för att TestRunner skall kunna ge en tydlig feedback används så kallade assert-metoder. Dessa metoder används för att definera hur utgången av ett lyckat testfall skall se ut. Den enklaste assert-metoden är asserttrue(boolean villkor). Om villkoret är sant kommer testet gå igenom, annars kastas ett AssertionError och ett felmeddelande skrivs ut med information om vilket assertion som misslyckts. Förutom asserttrue finns det också assertmetoder som assertnull(object obj) och assertarrayequals(int[] expecteds, int[] actuals). Ibland kan det vara användbart att anropa metoden fail(string felmeddelande), denna metod gör att ett AssertionError generars vilket leder till att testet direkt avbryts. Ett felmeddelande kan anges om så önskas. Enhetstester inleds vanligtvis med initiering av de objekt som används i det aktuella testfallet(fixtures), därefter görs anrop till assert-metoder för att kontrollera om de beter sig som det är tänkt. Istället för att initiera dessa objekt i varje testmetod kan en initieringsmetod skapas med Denna metod kommer då att anropas före varje testmetod och objekten kommer alltså initieras före varje test. Då det krävs någon form av städning efter varje testmetod kan även en metod med deklareras. Dessa två notationer kräver import av org.junit.before respektive org.junit.after. 3 Mock Objects och dess användning Själva idén med Enhetstestning är att testa varje del av koden för sig. Ett problem med att skriva enhetstester är att den del av koden som skall testas oftast använder objekt som ligger utom ramen för just den testade enheten. När andra objekt används i ett enhetstest så bygger alltså utgången av testningen på implementationen av dessa objekt. Om något objekt som används är buggat eller felaktigt implementerat kan det alltså resultera i att enhetstestet ger felaktigt resultat. Ett annat problem med beroende av yttre objekt är att testfall inte kan skrivas för än de objekt som skall användas i testet är implementerade. Detta kan leda till att programmerare som tillämpar Test Driven Development (TDD), tvingas frångå sina principer och skriva tester i efterhand eller vänta med att implementera just denna del av koden. I vissa fall är det till och med så att de objekt som behövs inte kan tilldelas de egenskaper som krävs i testmiljön med de publika metoder som finns.[2] Dessa problem kan lösas med hjälp av Mock Objects. Metoden går ut på att dummy Objekt skapas som ersätter de objekt man behöver vid själva enhetstestningen. Mock Objects kan alltså göra enhetstestet helt oberoende av andra delar av koden[2] vilket alltså kan vara till stor fördel. Mock Objects har många olika användningsområden där det kan förenkla testningen och lösa problem. Ett viktigt sådant område är program som använder sig av en speciell infrastruktur som är jobbig att sätta upp när testning sker. Det kan till exempel handla om en server eller en lokal databas. Ett Mock Object som härmar beteendet av en sådan infrastruktur kan skapas. Till exempel kan man då skicka meddelanden till Mock Objectet och få samma svar som om detta meddelande skickats till servern. 3 av 19
4 En annan aspekt av Mock Objects användning är att själva testerna tenderar att bli bättre då man med Mock Objects kan kontrollera värden mer frekvent genom att anropa JUnit metoden fail() då ett fel upptäcks. Detta gör att fel kan upptäckas snabbare och att ett mer specifikt felmeddelande kan genereras[2]. 3.1 Verktyg och praktisk användning Idag finns det verktyg som automatiskt kan generera MockObject för existerande klasser. Dessa verktyg är lätta att komma igång med och att använda. Det mest omtalade verktyget i denna kategori om man söker på internet är EasyMock. Det finns även ett lite nyare verktyg som heter Mockito.[3] Mockito är ett öppen källkod projekt under MIT License[4] vilket innebär att det är fritt att modifiera och använda. EasyMock och Mockito har mycket snarlik syntax och basen av mockitoutvecklare kommer ursprungligen från EasyMock. I denna djupstudie är det Mockito som vi har studerats lite närmare. För att komma igång med Mockito behövs bara en jar-fil som laddas ner på den officiella hemsidan och sedan länkas med ett Javaprojekt.[3] När detta är gjort krävs enbart en statisk import av org.mockito.mockito.*; i klassen där Mock Objects skall användas. Koden nedan visar hur ett Mock Object av klassen BankAccount skapas. BankAccounts -metod, public boolean insert(int sum), ställs in så att den alltid returnerar värdet public void TestInsert(){ BankAccount mockaccount=mock(bankaccount.class); when(mockaccount.insert()).thenreturn(true); asserttrue(mockaccount.insert()); Användingen av mockaccount Objektet i koden ovan visar enbart hur enkelt ett verktyg som Mockito är. Detta exempel visar inte på den styrka som själva användningen av Mock Objects är kapabelt till. Då Mockito visat sig vara mycket lättanvänt kommer det att testats på det team som coachas i kursen. 4 Testa Exceptions i JUnit Vanligtvis när enhetstester skrivs i JUnit används assertion metoder för att kontrollera om en metod beter sig så som det är tänkt. Till exempel kan ett test av en metod int sum(int a, int b) testas med hjälp av assertequal(a+b,sum(a,b)). När assert metoder används ges en tydlig feedback på vad som gått fel, vilka värden som förväntades och vilka värden resultatet gav. Exceptions kan testas genom användning av asserttrue(boolean b). Först defineras en boolean exceptionboolean och sedan skrivs den kod som skall testas inom en try catch sats. I catch blocket sätts exceptionboolean till true. Därefter körs asserttrue(exceptionboolean) för att kontrollera om ett exception har kastats eller inte. Detta sätt att testa exceptions var vanligt förekommande före junit 4 och Kent Beck beskriver denna metod i sin pocket guide för junit.[1] 4 av 19
5 I JUnit version 4 tillkom ett nytt sätt för att testa exceptions. Detta ger möjligheten att definiera en metod specifikt för att testa en viss typ av exceptions. Notationen är enligt följande exempel: import org.junit.test; import static public void numberformatexception() { String s="this is a string"; Integer.parseInt(s); Ett test går igenom om koden avbryts med det Exception som är angivet i (expected=). I detta exempel är det alltså NumberFormatException som förväntas vilket kastas då parseint() metoden inte lyckas konvertera strängen s till en Integer. Testet kommer alltså gå igenom. 5 I avsnitt 2 Användning av JUnits standardmetoder, diskuterades användning av för att definiera testmetoder vilka i sin tur innehåller själva testkoden. Det finns två andra sätt skriva tester med JUnit. Dessa två sätt använder sig av istället Båda metoderna kräver en ovanför klassdeklarationen där det anges om man vill använda sig av parameterized testning eller theories. Metoderna kan inte användas samtidigt i en testklass. För att reda ut exakt vilka begränsningar och funktioner som användning kunde innebära så producerades testkod. Denna testkod bearbetades och sammanställdes till exempelkod för denna uppsats. Koden finns under appendixen A.1 Theories exempelkod och A.2 Parameterized exempelkod. 5.1 Theories Bakgrund Theories är ursprungligen tänkt att användas som någon slags definition eller specifikation av ett givet beteende för en viss funktionalitet[13]. Detta kan jämföras med hur traditionella testfall vanligtvis endast testar ett fåtal scenarion [6]. Theories funktionaliteten skulle åstadkommas genom att analysera specifikationen. Med hjälp av denna analys skulle villkor sättas på den möjliga indatan till testmetoden. Villkoren skulle användas för att automatisk generera och sedan exekvera testet med alla möjliga 5 av 19
6 kombinationer av indata. Till en början var det tänkt att villkorsprogrammering 1 [16][8] skulle användas för att uppnå detta [6]. Givet att specifikationen är korrekt definierad så ger denna metod en bättre testning än vid traditionell testning eftersom programmeraren då riskerar att missa vissa viktiga kombinationer av indata [6]. Att använda theories är alltså tänkt att innebära användning av villkorsprogrammering för generering av indata samt att automatiskt kombinera och exekvera alla möjliga kombinationer av indata. Vilket alltså kan leda till att fler buggar hittas i koden snabbare. Implementationen i JUnit I JUnit har theories vidareutvecklats och producerat funktionaliteten bakom runnern Theory Metoder och variabler deklarerade definierar den indata som skall användas medan metoderna som är deklarerade tar in varje kombination som argument och testar dem. kan endast användas framför en publikt och statiskt deklarerad variabel eller metod. Skillnaden mellan dem är förväntar sig endast en variabel istället förväntar sig en array [9][10]. Där det kan noteras att tex list klasser som de skapade i Javas Collection hierarki endast räknas som objekt och inte som array. Generering av indata Till skillnad från den ursprungliga formuleringen om theories så ingår ingen villkorsprogrammering för att generera indata i JUnits implementation av theories. Däremot så är det möjligt att använda tex biblioteket Jacop för att utföra villkorsprogrammeringen nödvändig för att generera tänkt indata [8][16]. Det enda som krävs är att detta implementeras under Det går även att använda andra testmetodiker för att generera indata såsom Equivalence classes och Boundary value analysis beskrivet bl.a. i Implementationen av theories analyserar varje metod med och räknar ut alla möjliga kombinationer som indatan för varje metod kan anta utifrån det antal parametrar deklarerade för varje metod samt typerna för varje parameter. Varje möjlig kombination för en metod exekveras i egna instanser på samma sätt som metoder exekveras. Dvs att även metod exekveras före respektive efter varje anrop av en kombination för metod. Dessutom fungerar alla assert*-metoder, (se avsnitt 2 Användning av JUnits standardmetoder) på samma sätt som metoder. 1 Se avsnitt 6 Villkorsprogrammering för en utförligare förklaring om ämnet. 6 av 19
7 Avbrott med assume*-satser En av de främsta sakerna som skiljer exekveringen av metod från metod är hur de statiska assume*-metoderna i JUnit biblioteket såsom tex assumetrue(boolean b) fungerar. Där de i traditionella testfall fungerar precis som vanliga assertmetoder medan istället fungerar som ett filter. För det som händer när en assume*- metod exekveras i metod är att om en sats rapporteras inte stämma, dvs det som skulle motsvara ett rött testfall, så terminerar metoden sin exekvering av den givna kombinationen. Detta gör även att noggrannare analys kan producera villkor från assume*- metoder och sedan vidare automatiskt generera indata. Detta är dock inte någonting som ingår direkt i JUnit men det fristående verktyget Theory Explorer gör just detta[7]. I exempelkoden används detta för att inte utföra assert-satserna för strängar som inte har längden 8, vilket alltså utesluter en av variablerna som används som indata från att användas. Metodanrop för varje kombination Theories runnern kombinerar alltså alla möjliga variationer av den indata som definierats i samband och gör ett metodanrop för varje sådan kombination på metod. Antalet metodanrop som utförs på metod följer alltså som mest nedan beskrivna form: ( ) Då viss uteslutning sker när olika typer på parametrar används så kan dock antal metodanrop vara betydligt mindre. Detta kan tex observeras i exempelkoden där testsamedaywiththeory endast exekveras 16 gånger. Medan 125 exekveringar ges ifall alla typer istället anges till Object då implementeringen i så fall ej kan filtrera bort vissa resultat. Detta bekräftades via strategiskt placerade System.out.prints. Vidare så exekveras inte hela metoder vid de tillfällen då assume*-satserna inte går igenom och metoden terminerar tidigt. Det är även värt att nämna att används direkt vid deklareringen av en metod så fungerar inte den typ av filtrering av kombinationer innan exekvering Då författarna ej kunde få tillgång till dokumentationen så kunde de ej bekräfta vidare detta var en bugg eller en avsedd inkonsekvens i implementeringen. Som exempelkoden visar så är det dock möjligt att deklarera en statisk variabel och ta in data från en annan statisk metod och därmed bibehålla den huvudsakliga funktionaliteten. Försök att direkt utan att ändra deklararationen av parametertypen resulterar annars i ett java.lang.illegalargumentexception som kastas av Javas VM. I appendixet A.1 Theories exempelkod så observeras att metoden testsamedaywithtest testar motsvarande assert-satser som metoden 7 av 19
8 kommer att köra. Vilket visar på att theories implementationen betydligt förenklar läsbarheten och reducerar mängden kod som behöver skrivas. Exempel Följande deklaration som används i exempelkoden som syns i appendix A.1 Theories public static String[] sometimes = sometimes(); public static String[] sometimes() { return new String[] { " ", " ", " ", "-1" public static Integer adaynbr() { return new Integer(1); Som kan observeras så deklareras en String-array statiskt som sedan läser in resultatet från en annan statiskt deklarerad metod. Detta är främst gjort för att poängtera att även om runnern kan skicka in fel typer metoder (genom att med metoder som nämnts ovan) så kan detta undvikas genom att istället deklarera arrayer direkt i koden och sedan delegera värdet genom ett metodanrop, som i koden. Detta resulterar i exakt samma funktionalitet som skulle funnits om det inte funnits en bugg för metoder. Som även är synligt så returnerar en annan funktion ett Integer värde som alltså används för att sedan vidarebefodras till theory runnern som vidare använder alla andra variabler hämtade för att exekvera metoderna i exempelkoden Följande deklaration som används i exempelkoden som syns i appendix A.1 Theories public void testsamedaywiththeory(integer day, String timeinput1, String timeinput2) { assumetrue(timeinput1.length() == 8); assumetrue(timeinput2.length() == 8); MyTime mytime1 = new MyTime(day, timeinput1); MyTime mytime2 = new MyTime(day, timeinput2); asserttrue(mytime1.issameday(mytime2)); Givet att ovan har blivit inlästa sker alltså 16 metodanrop. Då det endast finns 1 variabel av typen Integer och totalt 4 variabler av typen String kombineras dessa 4 helt enkelt på alla möjliga sätt tillsammans med Integer variabeln. Det kan vidare ses att varje kombination som innehåller variabeln deklarerad som -1 i String arrayen inte kommer att passera en av assumetrue- 8 av 19
9 satserna då de kräver att båda String variabler har längden 8. Just denna filtrering har ingen egentlig mening utan är bara ett exempel på hur theories kan användas. asserttrue-satsen kommer vidare i detta exemplet alltid att vara sanna för alla variabler då samma dag används för båda objekten som jämförs. Deklarativa och konstruktiva theories Som även beskrivs i [14] så kan theories främst användas på två olika sätt. Detta är på ett deklarativt (eng. declarative) respektive konstruktivt (eng. constructive) sätt. Deklarativ användning av theories innebär att använda theories mer likt hur den ursprungligen tänktes användas, som ett sätt att skriva specifikationer. Där skall hålla för all möjlig indata, förutom den indata som inte håller för de angivna assume*-satserna. Varvid det främst menas att hela dimensionen av möjlig indata skall genereras automatiskt. Som nämnts kan det göras allmänt med någon form av villkorsprogrammering där ett exempel är det verktyg som utvecklats parallellt med theories, Theory Explorer. I vilket det valts att inte söka igenom alla möjliga lösningar utan istället försöka hitta en mer konsekvent hanterlig mängd indata som istället täcker en stor del av indatan som kan ge upphov till buggar. Vilket det i [14] vidare beskrivs ge upphov till att Theory Explorer kan skala bra vid användning i större projekt. Det andra sättet att använda theories på, det konstruerande sättet, är mer analogt med den traditionella scenariobaserade testning som annars används i JUnit. Varvid alla DataPoint(s) istället används som exempel på giltig indata för ett visst påstående. Ovan visad exempelkod är främst skriven på ett konstruerande sätt då endast en väldigt liten mängd indata används. Exempelkoden är dock samtidigt ett typexempel för theories som kan omvandlas, eller utvidgas till att skrivas på ett mer deklarativt sätt. Detta genom att autogenerera indata på tidigare beskrivet vis, via Theory Explorer eller liknande sätt. Eventuell användning av testmetodiker för att generera indata kan istället igen beskrivas som en konstruerande användning av theories. Jämförelse med exempelbaserad testning I [14] så observeras det att många utvecklare ofta tänker i form av specifikationer och inte bara i form av exempel som exempelbaserad testning annars bygger på. Där konstateras att omkring 25% av tester i de undersökta opensource projekten kunde direkt översättas till det mer generella, theories. Medan så mycket som 67% av de testfall som de som utvecklade theories naturligt kunde uttryckas i theories utan nämnvärd ökning i utvecklingskostnader. Det var i stor utsträckning även möjligt att skriva dessa theories på ett konstruktivt sätt. Det var därför vidare möjligt att använda deras verktyg Theory Explorer för att hitta indata som bröt mot den specifikation skrivits och därmed hitta buggar som annars kan förbises i exempelbaserad testning pga den mänskliga faktorn. 5.2 Parameterized Sammanfattning av funktionalitet Beteckningen parameterized beskriver funktionaliteten i JUnit. Funktionaliteten som parameterized tillför är att kunna köra konstruktorn före varje testfall och Vidare så körs konstruktorn och varje testfall en gång för varje Object-array som returneras av metoden. Vilket till viss del förklarar varför alla 9 av 19
10 @Parameters-annoterade metoder måste returnera Collection<Object[]>. Där alltså varje Object[] skickas in till konstrukturn före varje vanlig exekvering av testfallen. Mer specifikt så skickas varje element i Object-array:en in som argument i den ordning som de är lagda i array:en. Det objekt på index 0 i array:en skickas alltså som det första argumentet och det med index 1 som det andra metoder måste även deklareras statiskt och vara publika[5][11]. Utförligare förklaring av funktionalitet Efter alla importer inleds testklassen i exempelkoden som syns i avsnittet A.2 Parameterized exempelkod med public class TestingParameters Som tidigare nämnt gör detta att funktionaliteten används i klassen. Mer specifikt så medför denna deklaration att klassen org.junit.runners.parameterized körs istället för JUnits standard runner som annars används i JUnit. Deklarationen av klassen efterföljs av några få variabeldeklarationer och sedan de metoder som exekveras av parameterized public static Collection<Object[]> allformats() { ArrayList<Object[]> allformats = new ArrayList<Object[]>(); allformats.addall(somecorrectformats()); allformats.addall(someincorrectformats()); return public static Collection<Object[]> somecorrectformats() { return Arrays.asList(new Object[][] { { true, " ", { true, " ", { true, " " public static Collection<Object[]> someincorrectformats() { return Arrays.asList(new Object[][] { { false, "-1", { false, " ", { false, " " ); Utan en inblick av hur runnern fungerar så skulle det lätt gå att tro att den kommer att behandla alla metoder annoterade på samma vis. Detta är dock inte fallet. Endast den första metoden med annotationen används senare i programmet. Detta medför alltså att metoderna somecorrectformats och someincorrectformats endast används till allformats -metoden när den exekveras av runnern för parameterized och inte annars. Som i exemplet måste metod både vara statisk och publik, samt returnera en Collection av Objectarrayer. 10 av 19
11 Metodanrop Exemplet fortsätter på följande sätt (JavaDoc har public void setuptest() { System.out.println(" before method"); public TestingParameters(boolean iscorrectformat, String timeinput) { System.out.print("Constructor executed with values: [" + iscorrectformat + ", " + timeinput + "]"); this.timeinput = timeinput; this.hascorrectformat = public void testformats() { MyTime mytime = new MyTime(timeInput); assertequals(mytime.hascorrectformat(), hascorrectformat); Dessa metoddeklarationer medför att runnern kallar alla dessa metoder i ordningen TestingParameters(boolean iscorrectformat, String timeinput) (konstruktorn), setuptest (@Before), testformats (@Test) och om den funnits med. De körs alla i individuella instanser på samma annars körs av standard runnern. Vidare så exekveras konstruktorn och därmed hela kedja för varje element i den Collection som returneras från metoden annoterad och förhåller sig alltså på följande sätt: Då varje element i den Collection som används innehåller en Object-array så tar parameterized runnern alla elementen i den arrayen och lägger de som argument till varje konstruktoranrop. Där det första argumentet matchas till det första elementet i varje Object-array, andra argumentet till andra argumentet i varje Object-array etc. I exempelkoden används denna funktionalitet till att spara argumenten som privata variabler för att sedan användas i annoterade metoden. Utskrifter från exempelkoden Exekvering av testklassen genererar följande utskrifter: Constructor executed with values: [true, ] before method Constructor executed with values: [true, ] before method Constructor executed with values: [true, ] before method Constructor executed with values: [false, -1] before method Constructor executed with values: [false, ] before method Constructor executed with values: [false, ] before method 11 av 19
12 Endast metod räknas Som nämnts ovan så används endast den första metoden annoterad av parameterized runnern. Då endast en konstruktor kan deklareras i varje klass med en parameterized runner så används alltid alla variabler som deklarerats för en given testmetod. För mer varierande utdata måste därför extra argument som beskriver detta anges. I exempelkoden exemplifieras detta genom att två variationer på olika utdata förväntas från den givna indatan. Indatan förväntas mer konkret vara antingen i korrekt respektive inkorrekt format. I exempelkoden separeras detta i testmetoden genom att ett extra booleskt värde anges som argument som alltså anger om indatan förväntas vara i korrekt eller inkorrekt format. För att undvika detta extra argument för att skilja på vilken utdata som förväntas för ett test så är det också naturligtvis möjligt att göra en egen klass för all indata som genererar en förväntad utdata som kan testas. Vilket alltså tex hade delat in exempelkoden i två klasser. En som testade indata som genererar korrekta format och en som testade indata som generar inkorrekta format. 6 Villkorsprogrammering Kortfattat går det att konstatera att villkorsprogrammering (eller engelska constraint programming) används för att lösa olika kombinatoriska (optimerings) problem. Detta görs genom att modellera problemen med diverse villkor på variabler och därefter hitta lösningar som uppfyller dessa villkor. Att hitta dessa lösningar görs av en så kallad solver och kan separeras från språket det skrivs i. Ett exempel är att villkoren både kan skrivas i ett programmeringsspråk kallat MiniZinc och i java, där det i det senare fallet kan göras m.h.a. biblioteket som finns till Jacop[8][16]. Program som är skrivna med villkor kan sedan båda använda solvern Jacop[8][16] för att hitta lösningar som uppfyller ett givet kombinatoriskt problem. 7 Framåtblickar och diskussion Under denna djupstudie valde vi att gå närmare in på fyra områden. Mock Objects, Exception testning, theories och parameterized testning. Det finns direkt stöd i JUnit för alla dessa metoder förutom Mock Objects. För att autogenerera Mock Objects användes tredjeparts verktyget Mockito som visade sig vara mycket enkelt att komma igång med. Det fanns bra dokumentation på sidan för utveckling av Mockito. Värre var det med de inbyggda testfunktionerna theories och parameterized. Dokumentationen var mycket bristfällig och de kodexempel som hittades var inte så enkla att tolka direkt för att förstå exakt vilka begränsningar de led av. Detta berodde bland annat på saker som att asumethat() har en annorlunda funktion när theories används än vid traditionell testning. Att testa exceptions visade sig vara trivialt eftersom det finns ett inbyggt stöd för just detta sedan JUnit version 4. Till en början verkade theories och parameterized testning lite onödigt på grund av att det var lite svårare att sätta sig in i. Med facit i hand kan man dock konstatera att det är användbart för vissa tillämpningar. Parameterized är som bäst när ett värde på utdata håller för en godtyckligt stor mängd 12 av 19
13 indata. Och då varierad utdata, vid användning av parameterized, kräver ett extra argument för konstruktorn och därmed ett mer element för varje array som skickas in. Det kan i sådana fall genereras renare kod än traditionell testning utan att ta mera tid att utveckla, då det är mindre att skriva än traditionell testning. Konstruerande theories kan användas som exempelbaserad testning och kan analogt med parameterized då också producera enklare kod att läsa utan att ökade utvecklingskostnader. En konstruktiv theory kan emellertid användas som specifikationer på beteende i programmet. Det kan istället vara ett bra komplement för utvecklare de gånger det kan vara ännu naturligare att skriva test som specifikationer. Med verktyg som Theory Explorer är det sedan möjligt att automatiskt generera indata som skall täckas och utan extra utvecklingskostnader på det sättet hitta flera buggar. Då mänskliga faktorer kan leda till missade scenarion som inte testas i vanlig exempelbaserad testning. Anledningen till att vi valde just detta ämne var intresset av att hitta funktioner och verktyg för testning som vi senare skulle kunna använda i framtida skolprojekt och i arbetslivet. De verktyg som vi tittade närmare på verkar lovande för dessa ändamål och vi kommer med största sannolikhet att tillämpa det vi lärt oss. Ett annat mål med djupstudien var att undersöka om det fanns några avancerade användningsområden i JUnit som skulle kunna användas av det team vi coachar. Vi anser att det är lämpligt ta upp resultatet av denna studie med teamet och låta dem avgöra om det är något som känns användbart. För att kommunicera inom gruppen används en wiki sida. Denna sida skulle kunna fungera som ett lämpligt medium för att förmedla delar av djupstudien till gruppen, tex genom kodexempel och lite kort förklarande text. I vårt sökande efter bra avancerade användningsområden i JUnit stötte vi på många verktyg som inte länge uppdaterades eller verkade användas aktivt. Det finns dock några verktyg som ser lovande ut vars användbarhet inte hunnit undersökas inom tidsramen för detta projekt. Tre saker vi hade velat kollat ännu närmare på är Hamcrest, Categories och JUnitMax. Det hade även varit intressant att fördjupa sig ännu mer på theories området genom att testa och utvärdera Theory Explorer mer grundligt. Ytterligare experimenterande med kod hade också kunnat vara nyttigt då det är det bästa sättet att utvärdera hur användbart ett verktyg egentligen är. 7 Referenser [1] Kent Beck. JUnit Pocket Guide. O Reilly Media, Gravenstein Heigh North, Sebastopol, 2004 [2] Mackinnon, T., Freeman, S., Craig, P. Endotesting: Unit Testing with Mock Objects. In Extreme Programming Examined, G. Succi and M. Marchesi, Eds. The XP Series, pages Addison-Wesley Longman Publishing Co., Boston, MA, [3] Szczepan Faber and friends. Hämtad senast 26 februari [4] Hämtad senast 26 februari [5] Isa Goksu. using-junit-parameterized-annotation/. Hämtad senast 26 februari [6] D. Saff. Theory-infected: or how I learned to stop worrying and love universal quantification. In OOPSLA 07: Companion to the 22nd ACM SIGPLAN conference on Object oriented programming systems and applications companion, pages , New York, NY, USA, ACM. 13 av 19
14 [7] David Saff. From Developer s Head to Developer Tests Characterization, Theories, and Preventing One More Bug. In OOPSLA 07: Companion to the 22nd ACM SIGPLAN conference on Object oriented programming systems and applications companion, pages , New York, NY, USA, ACM. [8] Krzysztof Kuchcinski, Radosław Szymanek. Hämtad senast 26 februari [9] Hämtad senast 26 februari [10]Jacob Childress. Hämtad senast 26 februari 2012 [11] Hämtad senast 26 februari 2012 [12] Hämtad senast 26 februari 2012 [13] David Saff, Marat Boshernitsan. The Practice of Theories: Adding For-all Statements to There- Exists Tests. December 7, Hämtad senast 26 februari [14] Saff, D., Boshernitsan, M., Ernst, M.D. Theories in practice: Easy-to-write specifications that catch bugs. Technical Report MIT-CSAIL-TR , MIT Computer Science and Artificial Intelligence Laboratory, Cambridge, MA, January 14, [15] Kent Beck. Test-Driven Development: By Example. Addison-Wesley, Boston, [16] Krzysztof Kuchcinski. Constraints-Driven Scheduling and Resource Assignment. ACM Transactions on Design Automation of Electronic Systems, Vol. 8, No. 3, pages , July [17]K. Beck. Extreme Programming Explained: Embrace Change, Addison-Wesley, Boston, September av 19
15 A Exempelkod A.1 Theories exempelkod TestingTheories.java import static org.junit.assert.*; import static org.junit.assume.*; import org.junit.test; import org.junit.experimental.theories.datapoint; import org.junit.experimental.theories.datapoints; import org.junit.experimental.theories.theories; import org.junit.experimental.theories.theory; import org.junit.runner.runwith; import public class TestingTheories { * Times to be used method. * Times to be used public static String[] sometimes = sometimes(); * Method to statically determine the input times to be used. * The input to be used by methods. public static String[] sometimes() { return new String[] { " ", " ", " ", "-1" ; * Variable to be used public static Integer adaynbr() { return new Integer(1); * Asserts that two time objects with same day are considered to be on the * same day. * 15 av 19
16 day * The day to be used by both time objects. Should be sent in as * Integer. Declared as an Object parameter to avoid type * mismatch error from conversion from String to Integer. timeinput1 * Time to be used by first time object. timeinput2 * Time to be used by second time public void testsamedaywiththeory(integer day, String timeinput1, String timeinput2) { assumetrue(timeinput1.length() == 8); assumetrue(timeinput2.length() == 8); MyTime mytime1 = new MyTime(day, timeinput1); MyTime mytime2 = new MyTime(day, timeinput2); asserttrue(mytime1.issameday(mytime2)); * Asserts that two time objects with the same day are considered to be on * the same day. Does the same thing as method * public void testsamedaywithtest() { ArrayList<Object> inputs = new ArrayList<Object>(); inputs.add(adaynbr()); for (int i = 0; i < sometimes.length; i++) { inputs.add(sometimes[i]); MyTime mytime1, mytime2; String timeinput1, timeinput2; Integer daynbr; for (int i = 0; i < inputs.size(); i++) { for (int j = 0; j < inputs.size(); j++) { for (int k = 0; k < inputs.size(); k++) { timeinput1 = inputs.get(j).tostring(); timeinput2 = inputs.get(k).tostring(); if (!(timeinput1.length() == 8)!(timeInput2.length() == 8)!(inputs.get(i) instanceof Integer)) { continue; daynbr = (Integer) inputs.get(i); mytime1 = new MyTime(dayNbr, timeinput1); mytime2 = new MyTime(dayNbr, timeinput2); asserttrue(mytime1.issameday(mytime2)); 16 av 19
17 MyTime.java import java.util.regex.matcher; import java.util.regex.pattern; public class MyTime { protected int daynbr; protected String timeinput; protected Pattern timepattern; protected static final String REGEX_FORMAT = "(([0-1]?[0-9]) ([2][0-3])).[0-5]?[0-9].[0-5]?[0-9]"; public MyTime(int daynbr, String timeinput) { this.daynbr = daynbr; this.timeinput = timeinput; this.timepattern = Pattern.compile(REGEX_FORMAT); public MyTime(String timeinput) { this.daynbr = 0; this.timeinput = timeinput; this.timepattern = Pattern.compile(REGEX_FORMAT); * Checks if the timeinput value stored in this object has a correct time * format. A correct time format has the form "hh.mm.ss", clock starts at * " " and ends at " ". * Returns true if the timeinput value has the the correct time * format. public boolean hascorrectformat() { Matcher matcher = timepattern.matcher(timeinput); return matcher.matches(); * Compares another time object's day with own day, returns true if equal. * mytime2 * Another time object. boolean value from comparison between this object daynbr with * value from other time object. public boolean issameday(mytime mytime2) { return daynbr == mytime2.daynbr; 17 av 19
18 A.2 Parameterized exempelkod import static org.junit.assert.*; import java.util.arraylist; import java.util.arrays; import java.util.collection; import org.junit.before; import org.junit.test; import org.junit.runners.parameterized; import org.junit.runners.parameterized.parameters; import public class TestingParameters { protected String timeinput; protected boolean hascorrectformat; * List of Object arrays that are individually given as arguments to the * constructor before execution of method. * The list of Object arrays to be used as public static Collection<Object[]> allformats() { ArrayList<Object[]> allformats = new ArrayList<Object[]>(); allformats.addall(somecorrectformats()); allformats.addall(someincorrectformats()); return public static Collection<Object[]> somecorrectformats() { return Arrays.asList(new Object[][] { { true, " ", { true, " ", { true, " " public static Collection<Object[]> someincorrectformats() { return Arrays.asList(new Object[][] { { false, "-1", { false, " ", { false, " " public void setuptest() { System.out.println(" before method"); 18 av 19
19 * The constructor is executed for method for each Object * array returned by method. If there is a * * The constructor will be executed before method. * iscorrectformat * Index 0 of the Object array given by method. timeinput * Index 1 of the Object array given by method. public TestingParameters(boolean iscorrectformat, String timeinput) { System.out.print("Constructor executed with values: [" + iscorrectformat + ", " + timeinput + "]"); this.timeinput = timeinput; this.hascorrectformat = iscorrectformat; * Asserts that the the private String variable timeinput creates a MyTime * object with the correct format if the private boolean variable is true. * If false it is asserted that the MyTime object has an incorrect public void testformats() { MyTime mytime = new MyTime(timeInput); assertequals(mytime.hascorrectformat(), hascorrectformat); 19 av 19
Att skriva till och läsa från terminalfönstret
Att skriva till och läsa från terminalfönstret Oftast används grafiska komponenter i Java för att kommunicera med användaren (användargränssnitt), men det finns objekt i standardbiblioteken för de tillfällen
LUNDS TEKNISKA HÖGSKOLA EDAA01 Programmeringsteknik fördjupningskurs Institutionen för datavetenskap HT 2015
LUNDS TEKNISKA HÖGSKOLA EDAA01 Programmeringsteknik fördjupningskurs Institutionen för datavetenskap HT 2015 Testning med JUnit 1 Inledning JUnit är ett ramverk för enhetstestning av Javakod. Det är utvecklat
Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.
Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Föreläsning 3 Innehåll Lite om felhantering och Exceptions Mer om variabler och parametrar
JUnit 4 - användning. Grunderna. org.junit. org.junit.test. Henrik Bergström DSV SU/KTH. Innehåller bland annat:
JUnit 4 - användning Grunderna Henrik Bergström DSV SU/KTH org.junit org.junit.test Innehåller bland annat: Test Assert Obs! Inte ett paket annotation som berättar att den efterföljande metoden är ett
Institutionen för datavetenskap HT 1 2007/2008. Testning med JUnit
LUNDS TEKNISKA HÖGSKOLA EDA690 Algoritmer och datastrukturer Institutionen för datavetenskap HT 1 2007/2008 Enhetstestning Testning med JUnit När man implementerat en klass måste man, innan den kan användas,
Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering
Föreläsning 1 Objektorienterad programmering DD1332 Introduktion till Java Kompilering, exekvering, variabler, styrstrukturer Kompilering och exekvering Ett program måste översättas till datorns språk
Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.
Programmering med Java Programmering med Java Programspråket Java Källkodsexempel Källkod Java API-exempel In- och utmatning Grunderna Ann Pan panda@nada.kth.se Rum 1445, plan 4 på Nada 08-7909690 Game.java
Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod
Föreläsning 3-4 Innehåll Diskutera Vad gör programmet programmet? Föreslå vilka satser vi kan bryta ut till en egen metod. Skriva egna metoder Logiska uttryck Algoritm för att beräkna min och max Vektorer
Föreläsning 3-4 Innehåll
Föreläsning 3-4 Innehåll Skriva egna metoder Logiska uttryck Algoritm för att beräkna min och max Vektorer Datavetenskap (LTH) Föreläsning 3-4 HT 2017 1 / 36 Diskutera Vad gör programmet programmet? Föreslå
Objektorienterad programmering i Java
Objektorienterad programmering i Java Föreläsning 4 Täcker i stort sett kapitel 6 i kursboken Java Software Solutions 1 Läsanvisningar Den här föreläsningen är uppbyggd som en fortsättning av exemplet
JUnit. Junit Unit Testing. JUnit 3. JUnit 3 forts. Villkorskontroller i test. Exempel JUnit3
Johan Eliasson JUnit Junit Unit Testing Unit testing för java Används för att testa att metoder/klasser beter sig som det var tänkt Många IDE:er tex Eclipse har inbyggt stöd för detta. JUnit 3 Vi skriver
F4. programmeringsteknik och Matlab
Programmeringsspråk Föreläsning 4 programmeringsteknik och Matlab 2D1312/ 2D1305 Introduktion till Java Kompilering, exekvering, variabler, styrstrukturer 1 Ett program är en eller flera instruktioner
Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2
AID-nummer: Datum: 2014-12-18 Kurskod: 725G61 Provkod: LAB1 Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2 Skrivningstid: 2014-12-18 klockan 8.00-10.00. Hjälpmedel: Inga. För varje fråga
Typkonvertering. Java versus C
Typer Objektorienterad programmering E Typkonvertering Typkonvertering Satser: while, for, if Objekt Föreläsning 2 Implicit konvertering Antag att vi i ett program deklarerat int n=3; double x = 5.2; Då
Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser
Föreläsning 5-6 Innehåll Exempel på program med objekt Skapa och använda objekt Skriva egna klasser public class DrawSquare { public static void main(string[] args) { SimpleWindow w = new SimpleWindow(600,
TENTAMEN OOP
TENTAMEN OOP 2013-08-08 ANVISNINGAR Påbörja varje ny uppgift på nytt blad. Skriv endast på ena sidan av bladen. Skriv tydligt - oläsbara svar beaktas ej. BETYGSÄTTNING Max antal poäng är 30. För att bli
Tentamen OOP 2015-03-14
Tentamen OOP 2015-03-14 Anvisningar Fråga 1 och 2 besvaras på det särskilt utdelade formuläret. Du får gärna skriva på bägge sidorna av svarsbladen, men påbörja varje uppgift på ett nytt blad. Vid inlämning
Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016
Command line argumenter Objektorienterad Programmering (TDDC77) Föreläsning VI: eclipse, felsökning, felhantering Ahmed Rezine IDA, Linköpings Universitet Hösttermin 2016 /* Cla. java * Programmet illustrerar
Objektorienterad Programmering (TDDC77)
Objektorienterad Programmering (TDDC77) Föreläsning VI: eclipse, felsökning, felhantering Ahmed Rezine IDA, Linköpings Universitet Hösttermin 2016 Outline Felhantering Eclipse Felsökning Command line argumenter
Föreläsning 5-6 Innehåll
Föreläsning 5-6 Innehåll Skapa och använda objekt Skriva egna klasser Datavetenskap (LTH) Föreläsning 5-6 HT 2017 1 / 32 Exempel på program med objekt public class DrawSquare { public static void main(string[]
Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering
och metoder Introduktion till objektorienterad programmering Markus Saers markus.saers@lingfil.uu.se orientering Deklarativ programmering Beskriver förutsättningarna för något Prolog Imperativ programmering
Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.
Bankkonto - övning Övningar att göra efter lärardemostration. Filen bankkonto.zip innehåller ett projekt med klassen Bankkonto. Zippa upp denna fil och öppna projektet i BlueJ och skriv vidare på klassen
Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!
Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering! Gränssnitt igen För att kunna ändra på olika delar av programmet utan att andra delar
1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.
1 Uppgift 1 Klassen Company Banken FinanceTrust som tidigare bara haft privatpersoner som kunder vill nu bygga ut sitt datasystem så att även företag kan registreras som kunder. Skriv klassen Company som
Metoder (funktioner) Murach s: kap Winstrand Development
(funktioner) Murach s: kap 6 2013-01-23 1 Winstrand Development Metoder I C# kan vi dela in koden i block en kodsekvens ska köras likadant på flera ställen i applikationen. Detta block kallas för en metod
LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p
UMEÅ UNIVERSITET Datavetenskap 010530 LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p Betygsgränser 3 21,5-27 4 27,5-33,5 5 34-43 Uppgift 1. (4p) Hitta de fel som finns i nedanstående klass (det
Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering
Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering Institutionen för Datavetenskap CTH HT-7, TDA540 Dag: 208-0-3, Tid: 4.00-8.00 Uppgift a) class används för en klassdeklaration som
Versionshantering. Jan Erik Moström
Versionshantering Jan Erik Moström Johan Eliasson Versionssystem Gjorda för att användas av en eller flera personer på en eller flera platser, exempelvis: För en ensam användare som jobbar med ett projekt
Föreläsning 8 - del 2: Objektorienterad programmering - avancerat
Föreläsning 8 - del 2: Objektorienterad programmering - avancerat Johan Falkenjack johan.falkenjack@liu.se Linköpings universitet Sweden December 4, 2013 1 Innehåll Arv och andra viktiga begrepp Abstrakta
Objekt, Klasser, Paket m. m.
Objekt, Klasser, Paket m. m. Bildserie 3 Objekt Ett objekt karakteriseras av - Identitet, det som gör det möjligt att särskilja objektet från andra objekt - Tillstånd, den data som finns i objektet - Beteende,
Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016
Objektorienterad Programkonstruktion Föreläsning 2 2 nov 2016 Objekt - klass Namn Fält1 Fält2 Fält3 Metod1 Metod2 Metod3 Metod4 Objekt - klass Objekt - klass Objekt - klass + Objekt - klass public class
Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel
Idag Ett exempel Undantag Substitutierbarhet, subtyper, subklasser När val av metod beror av typerna hos två objekt Lite om överlagring Exempel, version 2 Notera: för samtliga figurer gäller: arean av
TUTORIAL: KLASSER & OBJEKT
TUTORIAL: KLASSER & OBJEKT I denna tutorial lär vi oss att använda klasser och objekt samt hur vi bygger en enkel applikation kring dessa. I tutorialen kommer det finnas en mängd kod som du antingen kan
Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?
Programmeringsteknik och Matlab Övning 4 Dagens program Övningsgrupp 2 (Sal Q22/E32) Johannes Hjorth hjorth@nada.kth.se Rum 4538 på plan 5 i D-huset 08-790 69 02 Kurshemsida: http://www.nada.kth.se/kurser/kth/2d1312
Objektsamlingar i Java
1 (6) Objektsamlingar i Java Objektorienterad programmering 3 Syfte Att ge träning i att använda objektsamlingar i Java. Mål Efter övningen skall du kunna använda objektsamlingsklasserna ArrayList och
tentaplugg.nu av studenter för studenter
tentaplugg.nu av studenter för studenter Kurskod Kursnamn UU-76062 Inledande programmering i Java Datum 2014-07-13 Material Tentamen Kursexaminator Betygsgränser Tentamenspoäng G 30; VG 36 40 (VG) Övrig
Classes och Interfaces, Objects och References, Initialization
Classes och Interfaces, Objects och References, Initialization Objekt-orienterad programmering och design (DIT953) Niklas Broberg/Johannes Åman Pohjola, 2018 Abstract class En abstract class är en class
Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:
Att skapa en klass kvadrat Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här: public class Kvadrat { private int sida; Det var väl inte
Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010
Programsystemkonstruktion med C++: Övning 1 Karl Palmskog palmskog@kth.se september 2010 Programuppbyggnad Klassens uppbyggnad en C++-klass består av en deklaration och en definition deklaration vanligtvis
DAT043 - föreläsning 8
DAT043 - föreläsning 8 Paket, generics, Java collections framework 2017-02-07 Paket och tillgänglighet Ovanför klasser finns en hierarkisk namespace med paket. Filer som inte deklareras i något paket finns
Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder
Introduktion TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder OO är den mest använda programmeringsparadigmen idag, viktigt steg att lära sig och använda OO. Klasser är byggstenen i
Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt
Föreläsning 2 Programmeringsteknik och C DD1316 Mikael Djurfeldt Föreläsning 2 Programmeringsteknik och C Python introduktion Utskrift Inläsning Variabler Datatyp Aritmetiska operatorer Omvandling
Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier
Arv Fundamental objekt-orienterad teknik arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier Programmeringsmetodik -Java 165 Grafisk respresentation: Arv
Tentamen , Introduktion till Java, dtaa98, dtea53
Mittuniversitetet 2007-09-01 Institutionen för informationsteknologi och medier Sid:1(3) dtaa98, dtea53 Martin Kjellqvist; Linda Karlsson, Ulf Reiman Lösningsansatser Tentamen 2007-09-01, Introduktion
DAT043 - Föreläsning 7
DAT043 - Föreläsning 7 Model-View-Controller, mer om klasser och interface (arv, ) 2017-02-06 Designmönstret Observer avläser Observer Observable meddelar Observer avläser En eller flera objekt registrerar
Tentamen ID1004 Objektorienterad programmering May 29, 2012
Omtentamen för ID1004 Objektorienterad programmering HT11, 29 maj 2012, 09-13 Denna tentamen examinerar 3 högskolepoäng av kursen. Inga hjälpmedel är tillåtna. Tentamen består av 12 frågor. Varje fråga
Tentamen i Algoritmer & Datastrukturer i Java
Tentamen i Algoritmer & Datastrukturer i Java Hjälpmedel: Skrivhjälpmedel, miniräknare. Ort / Datum: Halmstad / 2008-05-27 Skrivtid: 4 timmar Kontakt person: Nicolina Månsson, tel. 035-167487 Poäng / Betyg:
Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper
Tentamen Programmeringsteknik I 2016-03-17 Skrivtid: 1400 1900 Tänk på följande Skriv läsligt. Använd inte rödpenna. Skriv bara på framsidan av varje papper. Lägg uppgifterna i ordning. Skriv uppgiftsnummer
1 Comparator & Comparable
1 Comparator & Comparable 1.1 Implementation av Comparable Att implementera Comparable innebär att man gör objekt av sin klass jämförbara med andra och att det därmed antas existera en naturlig ordning
Arrayer med primitiva datatyper
Arrayer med primitiva datatyper Pellets_utan_array.java class Pellets_utan_array // Programmet inleds med deklarationer av variabler int pellets_1; int pellets_2; int pellets_3; int pellets_4; int pellets_5;
Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc
Föreläsning 5 (6) Metoder Metoder Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc Metoder Deklarera public void setnamn(string n) Åtkomstmodifierare Returtyp
"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde
Föreläsning 7 "Har en"-relation Arv "Har en" "Är en" Superklassen Object Överskuggning Fordonsexempel Seminarium 2 Relevanta uppgifter Uppgift 31 I exemplet Boll från förra föreläsningen gällde följande
TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P
UME UNIVERSITET Datavetenskap 981212 TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P Datum : 981212 Tid : 9-15 HjŠlpmedel : Inga Antal uppgifter : 9 TotalpoŠng : 60 (halva pošngtalet kršvs normalt fšr
Repetition av OOP- och Javabegrepp
ArrayList Repetition av OOP- och Javabegrepp En lista i vilken man kan lagra objekt Implementerar List-interfacet Skiljer sig från ett vanligt endimensionellt fält: Dynamisk expanderar när den blir
Laboration: Whitebox- och blackboxtesting
Tilda11 höstterminen 2011 Laboration: Whitebox- och blackboxtesting Mål med laborationen Du ska lära dig begreppen white-box testing och black-box testing Du ska öva dig på att konstruera testfall Du ska
Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel
Föreläsning 3 Innehåll Generiska klasser Implementera generiska klasser Exceptions Dokumentationekommentarer javadoc Enhetstestning - junit Man kan deklarera en eller flera typparametrar när man definierar
2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik
2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det riktiga provet tar 45 minuter (en lektionstimme) och det
Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering
Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering Institutionen för Datavetenskap CTH HT-6, TDA540 Dag: 207-0-24, Tid: 4.00-.00 Uppgift a) En abstrakt klass kan inte instansieras,
TDDC77 Objektorienterad Programmering
TDDC77 Objektorienterad Programmering Föreläsning 5 Sahand Sadjadee IDA, Linköpings Universitet Hösttermin 2018 Outline Arrayer Metoder Räckvidd och Livslängd Arrayer Vända om inlästa värdena Vända om
Modeller, Objekt och Klasser
Modeller, Objekt och Klasser Bildserie 3 Objekt Orienterad Programmering OO-programmering bygger på att vi som människor uppfattar tillvaron i termer av objekt - Bastu, pizza, öl,... Det borde vara lättare
Repetition av OOP- och Javabegrepp
ArrayList Repetition av OOP- och Javabegrepp En lista i vilken man kan lagra objekt Implementerar List-interfacet Skiljer sig från ett vanligt endimensionellt fält: Dynamisk expanderar när den blir
Innehåll. 5. More sophisticated behavior. Javas klassbibliotek. Arbete med klassbibliotek. A Technical Support System. Huvudloopens struktur
Objects First With Java A Practical Introduction Using BlueJ 5. More sophisticated behavior Innehåll Användning av bibliteksklasser Skriva och läsa dokumentation Biblioteksklasser för ökad funktionalitet
Testning av program. Verklig modell för programutveckling
Fel i program När man skriver program uppkommer alltid fel. Felen kan indelas i följande kategorier: Under kompileringen upptäcker kompilatorn fel som handlar om att man använt konstruktionerna i programspråket
Tentamen ID1004 Objektorienterad programmering April 7, 2015
Ordinarie tentamen för ID1004 Objektorienterad programmering, 7 april 2015 Denna tentamen examinerar 3.5 högskolepoäng av kursen. Inga hjälpmedel är tillåtna. Tentamen består av en obligatorisk del och
TENTAMEN OOP
TENTAMEN OOP 2014-03-15 ANVISNINGAR Påbörja varje ny uppgift på nytt blad. Skriv endast på ena sidan av bladen. Skriv tydligt - oläsbara svar beaktas ej. BETYGSÄTTNING Max antal poäng är 30. För att bli
Anteckningar 1: Grundläggande saker
UPPSALA UNIVERSITET Institutionen för lingvistik och filologi Mats Dahllöf http://stp.ling.uu.se/ matsd/uv/uv11/pst1/ Programmering för språkteknologer I Anteckningar 1: Grundläggande saker 1 Programmering
Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)
Föreläsning 10 STRING OCH STRINGBUILDER; VARIABLERS SYNLIGHET Att deklarera och att använda variabler När vi deklarerar en variabel, t ex int x; inför vi en ny variabel med ett namn och en typ. När namnet
Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.
-Algoritmer och Datastrukturer- Abstrakt datatyp Datatyp för en variabel Betecknar i ett programmeringsspråk den mängd värden variabeln får anta. T ex kan en variabel av typ boolean anta värdena true och
2 b) Bodega bodegan = new Bodega(); double moms = 0.235; String namn = "Vargtass"; System.out.println(namn + " " + moms + bodegan.ändra(moms, namn); S
Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för M1, K2, Media1 och I1 (1p) 16 december 2000 Hjälpmedel: En Javabok. System.out är ett objekt kopplat till skärmen, dvs samma sak som i labbarna
725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack
725G61 - Laboration 7 Implementation av ett API Johan Falkenjack December 13, 2013 1 Inledning Hittills i kursen har vi tittat på grundläggande programmering och grundläggande objektorientering. I den
F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander
F6 Objektorienterad design ID1004 Objektorienterad programmering Fredrik Kilander fki@kth.se långa ord AKTIVITETER I PROGRAMVARUUTVECKLING Iterativ utveckling Kravspecifikation Design Implementation Testning
Objektorienterad programmering D2
Objektorienterad programmering D2 Laboration nr 2. Syfte Att få förståelse för de grundläggande objektorienterade begreppen. Redovisning Källkoden för uppgifterna skall skickas in via Fire. För senaste
Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output
Programmering hh.se/db2004 Föreläsning 5: Fält samt Input/Output Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Lite mer om Javas stöd för fält Hur många element har ett fält?
Tentamen ID1004 Objektorienterad programmering October 29, 2013
Tentamen för ID1004 Objektorienterad programmering (vilande kurs), 29 oktober 2013, 9-13 Denna tentamen examinerar 3.5 högskolepoäng av kursen. Inga hjälpmedel är tillåtna. Tentamen består av tre sektioner.
Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer
Programmering hh.se/db2004 Föreläsning 3: Java. Grundtyper, variabler och arrayer Hej Då, Karel! Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Center for Research on Embedded
Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper
Tentamen Programmeringsteknik I 2018-03-16 Skrivtid: 8:00 13:00 Tänk på följande Skriv läsligt. Använd inte rödpenna. Skriv bara på framsidan av varje papper. Lägg uppgifterna i ordning. Skriv uppgiftsnummer
FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl
Högskolan Dalarna sid 1 av 6 DI-institutionen Hans-Edy Mårtensson Sten Sundin FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY2 2001-03-16, kl 14.00-18.00 1. Grunderna i
Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34
Tentamen Datalogi I, grundkurs med Java 10p, 2D4112, 2002-2003 Lördagen den 30 november 2002 kl 9.00 14.00, salar E33, E34 Inga hjälpmedel 30 poäng ger säkert godkänt, 40 poäng ger betyg 4 50 poäng ger
F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander
F5 Selektion och iteration ID1004 Objektorienterad programmering Fredrik Kilander fki@kth.se Boolska uttryck Boolska uttryck använder sig av jämförelseoperatorer < > = ==!= Resultatets datatyp är boolean
Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?
Algoritmer och datastrukturer Allmänt om kursen Kort javagrund repetition - Klasser, metoder, objekt och referensvariabler, - Hierarkiska klass strukturer - Arrayer och arrayer av objekt - Collection ramverket
Tentamen, EDAA10 Programmering i Java
LUNDS TEKNISKA HÖGSKOLA 1(6) Institutionen för datavetenskap Tentamen, EDAA10 Programmering i Java 2019 08 21, 08.00 13.00 Anvisningar: Preliminärt ger uppgifterna 25 + 15 + 5 = 45 poäng. För godkänt betyg
Testautomatisering. Labbar, FitNesse, TDD, BDD
Testautomatisering Labbar, FitNesse, TDD, BDD Lab 4 Utökad deadline? Lab 4 FM: Lab 1-3 snack FitNesse TDD BDD EM: Handledning Idag Watir::Wait.until {"OK"} Lab 1-3 I Ruby: False: false eller nil True:
Den som bara har en hammare tror att alla problem är spikar
Introduktion Föreläsning (Weiss kap. -4) Många begrepp blir det Introduktion till kursen Exempel: Datastrukturen mängd Generiska Den som bara har en hammare tror att alla problem är spikar Vilken
Lite om reella tal. Programmering. I java. Om operatorers associativitet och prioritet
Programmering hh.se/db2004 Föreläsning 4: Fält samt Input/Output Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Lite om reella tal Vad kan man göra med reella tal? Utöver de
DAT043 Objektorienterad Programmering
DAT043 Objektorienterad Programmering Detta är en exempeltenta som innehåller gamla tentauppgifter av ungefär liknande slag som ni kan förvänta er se på ordinarie tenta i Del 1 respektive Del 2. Dock är
2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning
2I1049 Föreläsning 5 Objektorienterad programmering i Java KTH-MI Peter Mozelius Objektorientering Världar uppbyggda av objekt Inte helt olikt vår egen värld Ett sätt att modularisera våra system Objekten
Föreläsning 13 Innehåll
Föreläsning 13 Innehåll Arv Repetition Om tentamen Datavetenskap (LTH) Föreläsning 13 HT 2017 1 / 32 Diskutera Här är början på klassen MemoryWindow som använts på en lab. Vad kan menas med extends SimpleWindow?
Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?
Föreläsning 10 Datalogi 1 DA2001 python introduktion Variabler Datatyp Aritmetiska operatorer av typer Reserverade ord logiska operatorer If-sats kommentarer på skärmen print( Hej ) print( Hur är det?
Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016
Objektorienterad Programkonstruktion Föreläsning 4 8 nov 2016 Nästade klasser I Java går det att deklarera en klass inuti en annan klass. Vi kallar detta för att en yttre klass innehåller en inre klass.
Några principer för effektiv enhetstestning
Peter Lindberg Computer Programmer, Oops AB mailto:peter@oops.se http://oops.se/ Några principer för effektiv enhetstestning Enhetstester ( unit tests ) är en central del av extremprogrammering (XP). Man
Objektorienterad programmering med Java, Generics
Generics i Java Generic: allmän, genersisk. På menyn på en asiatisk restaurang: Denna rätt serveras med valfritt kött, fisk eller skalddjur Bakgrund Generics i Java ger oss att skriva kod, klasser och
TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3
TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3 Pelle Evensen, Daniel Wetterbro 16 oktober 2012 Sammanfattning Denna vecka ska vi titta på polymorfism, dynamisk kontra statisk
Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp
Föreläsning 4 Innehåll Abstrakta datatypen lista Definition Abstrakta datatypen lista egen implementering Datastrukturen enkellänkad lista Nästlade klasser statiska nästlade klasser inre klasser Listklasser
TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU
TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU På denna föreläsning: Mer om Interface Generiska klasser Undantag Nästlade klasser 1
Objektorienterad Programmering (TDDC77)
Objektorienterad Programmering (TDDC77) Föreläsning V: arrayer, metoder, räckvidd (scope), eclipse Ahmed Rezine IDA, Linköpings Universitet Hösttermin 2016 Outline Arrayer Metoder Räckvidd (Scope) Eclipse
Tentamen, EDA501/EDAA20 Programmering M MD W BK L
LUNDS TEKNISKA HÖGSKOLA 1(6) Institutionen för datavetenskap Tentamen, EDA501/EDAA20 Programmering M MD W BK L 2017 05 31, 8.00 13.00 Anvisningar: Preliminärt ger uppgifterna 9 + 12 + 10 + 9 = 40 poäng.
LÖSNINGSFÖRSLAG TENTAMEN
LÖSNINGSFÖRSLAG TENTAMEN OBJEKTORIENTERAD PROGRAMMERING I JAVA 5P FRISTÅENDE KURS, DAG (ITM - ÖSTERSUND) MÅNDAG 2 JUNI, 2003, KL. 8-13 TID: 5 TIMMAR ANTAL UPPGIFTER: 8 MAX POÄNG: 43 BETYGSKALA: UNDERKÄND
Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }
En klassdefinition class A extends B {... Arv definierar en klass A som ärver av B. Klassen A ärver alla fält och metoder som är definierade för B. A är en subklass till B. B är en superklass till A. class
732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning
Varför? 732G11 Linköpings universitet 2011-02-08 Varför? 1 2 3 Varför? 4 5 Medelvärde av 5000 tal Varför? while-loopen int nrofints = 5000; int [] integers = new int [ nrofints ]; int pos = 0; while (
Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016
Static vs Dynamic binding Polymorfism Objekt-orienterad programmering och design Alex Gerdes, 2016 Diagnostiskt prov Shape + overlaps(shape): int return 1; Shape shape = new Shape(); Polygon tripoly =