Länkade listor och automatisk testning

Relevanta dokument
Objektinteraktion. Objektorienterad programmering Laboration 2. Syfte Att konstruera ett litet objektorienterat program med flera samverkande objekt.

Objektinteraktion. Objektorienterad programmering Laboration 2. Syfte Att konstruera ett litet objektorienterat program med flera samverkande objekt.

Arv och polymorfism i Java

Laboration 10 - Eclipse

LUNDS TEKNISKA HÖGSKOLA EDAA01 Programmeringsteknik fördjupningskurs Institutionen för datavetenskap HT 2015

Användning av datastrukturer Algoritmer och datastrukturer Obligatorisk Laboration nr 1

Objektorienterad programmering D2

Objektsamlingar i Java

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

NetBeans 5.5. Avsikt. Projektfönster

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Laboration 1 Introduktion till Visual Basic 6.0

Tentamen, EDAA10 Programmering i Java

Användning av datastrukturer Algoritmer och datastrukturer Obligatorisk Laboration nr 1

Eclipse. Avsikt. Nu ska ett fönster liknande figuren till höger synas.

Generiska klasser och funktioner

Laboration 10 - NetBeans

Här beskrivs Eclipse, den programutvecklingsmiljö som utnyttjas i programmeringskurserna. Mera information finns på:

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Laboration nr 2. Objektorienterad programmering D2. Syfte. Redovisning. Testning. Uppgift 1

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

NetBeans 7. Avsikt. Projektfönster

OOP Objekt-orienterad programmering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

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

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Eclipse en handledning

Föreläsning 1 & 2 INTRODUKTION

Objektorienterad Programmering (TDDC77)

Versionshantering. Jan Erik Moström

Objektorienterad programmering i Java I

Eclipse. Kort genomgång

Institutionen för datavetenskap HT /2008. Testning med JUnit

Datorlaboration 0, Programmering i C++ (EDA623)

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Laboration A Objektsamlingar

Den som bara har en hammare tror att alla problem är spikar

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Laboration 1. Objektorienterad programmering, Z1. Syfte

Föreläsning 4 Innehåll

Tentamen TEN1 HI

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Malmö högskola 2007/2008 Teknik och samhälle

Föreläsning 3-4 Innehåll

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Tentamen Datastrukturer (DAT037)

Innehållsförteckning. 9 Större projekt Övningsuppgifter...32

DAI2 (TIDAL) + I2 (TKIEK)

Övningsuppgift. Repeterbara citat. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Föreläsning 6: Introduktion av listor

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Användning av datastrukturer Algoritmer och datastrukturer Obligatorisk Laboration nr 1

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

2 Eclipse en handledning

Malmö högskola 2007/2008 Teknik och samhälle

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Sätt att skriva ut binärträd

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Att prova på en enkel Applet och att lära sig olika sätt att hämta data från tangentbordet. Du får även prova på att skapa din första riktiga klass.

Refaktorisering och UML med Eclipse

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Classes och Interfaces, Objects och References, Initialization

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Verktyg och Utvecklingsmiljö. Föreläsning 2 Eclipse

Tentamen Datastrukturer, DAT037 (DAT036)

Introduktionsmöte Innehåll

Tentamen, EDAA20/EDA501 Programmering

OOP Objekt-orienterad programmering

Tentamen i Programmering

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Kopiering av objekt i Java

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Tommy Färnqvist, IDA, Linköpings universitet

Översikt 732G11 PROGRAMMERING 1. Personal. Kursens mål. Litteratur. Kursens innehåll

Laboration: Whitebox- och blackboxtesting

Tentamen i Introduktion till programmering

Föreläsning 1 Datastrukturer (DAT037)

Att använda Java SE JDK 6

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Transkript:

1 (6) Länkade listor och automatisk testning Algoritmer och datastrukturer Obligatorisk nr 3 Syfte Att ge träning i programmering av länkade listor på låg abstraktionsnivå med primitiv pekarmanipulering. Även om programmen här skrivs i Java är principerna tillämpliga på andra imperativa språk, t.ex. C/C++. Dessutom ger laborationen tillfälle att tillämpa automatisk testning på den utvecklade koden. Behovet av testning är här stort eftersom programkod med mycket pekarhantering ofta är behäftad med fel. Mål Efter övningen skall du kunna arbeta med länkade listor utan skyddsnät i form av bekväma standardklasser. inse nackdelar och risker med pekarmanipulering. kunna genomföra enkel verktygsstödd regressionstestning. inse fördelar men också begränsningar med testning. Litteratur Uppgifterna bygger på exemplen i föreläsningarna om länkade listor, nr 5 och nr 6. Se för övrigt kurs-pm för litteraturhänvisning till kursboken. Färdig programkod Given programkod som behövs i uppgifterna finns på kurshemsidan under fliken er. Genomförande och redovisning Uppgifterna är obligatoriska. Redovisning sker i grupper om två personer inte färre, inte fler. Varje grupp skall självständigt utarbeta sin egen lösning. Samarbete mellan grupperna om övergripande principer är tillåtet, men inte plagiering. Gå till kurshemsidan och vidare till er->hur man använder Fire-systemet. Om du inte registrerat labbgrupp i Fire än: Gör laboration 0.0 innan du fortsätter! Redovisa filerna enligt specifikationen på sista sidan, samt README.txt med allmänna kommentarer om lösningen. Andra halvan av Redovisningsproceduren beskriver hur du postar materialet i Fire. Senaste redovisningsdag, se Fire.

2 (6) Uppgifter Klassen Lists gicks delvis igenom på föreläsning 6 om länkade listor. Uppgiften är att skriva färdigt klassen genom att implementera resterande metoder. Lösningen skall utföras i samma anda som på föreläsningen, t.ex. skall klassen ListNode se ut som nedan utan några konstruktorer. Alla listor skall vara enkellänkade och ha listhuvud. Metoderna måste klara att hantera tomma listor, d.v.s. listor som enbart består av ett listhuvud. Det är tillåtet att implementera metoderna med hjälp av andra metoder i klassen. Dock är det inte tillåtet att ta genvägar via strängoperationer, t.ex. skulle reverse kunna implementeras genom att först översätta listan till en sträng, vända strängen baklänges, för att därefter översätta den omvända strängen till en lista. En sådan lösningsmetod vore inte skalbar eftersom den bara fungerar för teckenlistor. Anledningen till att char valts som elementtyp är enbart för att förenkla exempel och testning. public class ListNode { public char element; public ListNode next; } public class Lists { // Givna metoder från föreläsningen public static ListNode tolist(string chars) public static ListNode copy(listnode l) public static ListNode remove(listnode l,char c) } // Uppgift: implementera och testa dessa public static String tostring(listnode l) public static boolean contains(listnode l,char c) public static ListNode copyuppercase(listnode l) public static ListNode addfirst(listnode l,char c) private static ListNode getlastnode(listnode l) public static ListNode addlast(listnode l,char c) public static ListNode addall(listnode l1,listnode l2) public static ListNode concat(listnode l1,listnode l2) public static ListNode reverse(listnode l) De nya metoderna public static String tostring(listnode l) Returnerar en sträng med tecknen i l. Metoden muterar ej l. public static boolean contains(listnode l,char c) Returnerar true om l innehåller c, false annars. Metoden muterar ej l. public static ListNode copyuppercase(listnode l) Returnerar en ny lista med alla tecken i l som är stora bokstäver (A-Z). Metoden muterar ej l. public static ListNode addfirst(listnode l,char c) Adderar c först i l. Metoden muterar l och returnerar en referens till l. private static ListNode getlastnode(listnode l) Returnerar en referens till den sista noden i l (listhuvudet om l refererar till en tom lista.) Metoden muterar ej l.

3 (6) public static ListNode addlast(listnode l,char c) Adderar c sist i l. Metoden muterar l och returnerar en referens till l. public static ListNode addall(listnode l1,listnode l2) Adderar alla elementen i l2 till slutet av l1. Metoden muterar l1 men ej l2, och returnerar en referens till l1. Exempel: före efter l1 = [a,b,c] l2 = [d,e] l1 = [a,b,c,d,e] l2 = [d,e] public static ListNode concat(listnode l1,listnode l2) Sätter samman l1 med l2 så att alla elementen i l2 kommer efter elementen i l1. Efter operationen refererar l2 till en tom lista. Metoden muterar både l1 och l2, och returnerar en referens till l1. Exempel: före efter l1 = [a,b,c] l2 = [d,e] l1 = [a,b,c,d,e] l2 = [] public static ListNode reverse(listnode l) Returnerar en ny lista med elementen i l i omvänd ordning. Metoden muterar ej l. Arbetsgång I den givna koden finns metodstumpar för metoderna ovan, utöver de kompletta som gicks igenom på föreläsningen. Utveckla och testa en metod i taget, lämpligen i ordning uppifrån och ner i uppräkningen ovan. Fortsätt aldrig med nästa metod innan den föregående passerat alla relevanta test (se nedan)! Testning av listklassen Enkla test Klassen SimpleListTest testar några enkla fall och skriver ut resultaten i textfönstret. Klassen har en main-metod som kör testfallen. Börja med denna! Regressionstestning med JUnit Vid testning med testramverket JUnit definieras en speciell testklass för varje klass som skall testas. I vårt exempel heter testklassen JunitListTest. 1 Testklassen innehåller testmetoder som testar metoderna i Lists. Test av en metod kan innebära att även andra metoder i klassen anropas. Man kan exekvera en testmetod åt gången, eller samtliga testmetoder i en följd. Hela testsviten kan då enkelt upprepas automatiskt med en enkel knapptryckning efter varje förändring av koden, vilket är en stor arbetsbesparing jämfört med mer ad hoc-mässiga manuella metoder. Detta kallas regressionstestning. Men kom ihåg: Testning kan påvisa närvaron av fel men i allmänhet inte bevisa frånvaron av fel. Testklassen är färdig och de givna testmetoderna får ej ändras, men definiera gärna nya. Nedan beskrivs först kortfattat hur man testar med BlueJ eller eclipse. 1 Testen i den här laborationen är skrivna i version 3 av JUnit.

4 (6) JUnit-testning med BlueJ Koden som distribueras för laborationen är utvecklad med javaverktyget BlueJ som är mycket användarvänligt. Det finns installerat på skolans datorer och kan enkelt installeras på din egen dator, se länk på kurshemsidan. En av fördelarna med BlueJ är att verktyget stöder regressionstestning med JUnit. Ett BlueJ-projekt består av en filkatalog med java- och klassfiler, samt några extra verktygsspecifika filer. Det enklaste sättet att starta programmet för att arbeta med ett färdigt projekt är att dubbelklicka på filnamnet bluej.pgk. Huvudfönstret i BlueJ visar klasserna i ett förenklat UML-diagram. Källtextfönster för klasserna öppnas genom att dubbelklicka på klassikonerna i diagrammet. Efter förändringar i koden streckmarkeras ikonerna för alla berörda klasser. Omkompilering görs då enklast med ctrl-k. Testverktygen visas genom att välja Tools->Preferences->Miscellaneous->Show unit testing tools. Testklassens ikon visas i exemplet nedan snett bakom ikonen för Lists.

5 (6) För att köra alla testmetoderna i en automatiserad följd trycker man på knappen Run Tests och får då upp ett fönster som sammanfattar resultaten Tre typer av testresultat visas: En grön bock anger lyckat test, ett grått kryss (Failures) anger att testet misslyckades därför att något villkor ej uppfylldes, och ett rött kryss (Errors) att exekveringen avbröts, t.ex. p.g.a. ett ofångat undantag, indexfel i fält etc. Vid ett dubbelklick på en rad i listan visas information om vilken kodrad i testmetoden som fallerade. Man kan då starta avlusaren och sätta en brytpunkt på raden i fråga, och därefter exekvera den specifika testmetoden igen (högerklicka på testklassikonen och välj metoden där). När exekveringen stannar vid brytpunkten är det enkelt att exekvera stegvis med avlusaren för att försöka hitta källan till felet. Alltså: Testning kan påvisa närvaron fel och avlusning avslöja orsaken till felen.

6 (6) JUnit-testning med eclipse Om du föredrar att använda eclipse finns motsvarande funktionalitet för testning även i detta verktyg. Skapa ett nytt projekt och importera klasserna, inklusive JunitListTest. Högerklicka på projektnoden och välj Properties->Java Build Path->Libraries->Add Library->JUnit->Next->JUnit3->Finish Visa testpanelen (fliken) för JUnit: Window->Show View->JUnit För den intresserade: Till Eclipse finns pluginmodulen EclEmma som genomför kodtäckningsanalys. Man kan då enkelt se vilka delar av koden som motionerats av testsviten, och vilka delar som inte testats alls. Testad kod markeras med grönt, otestad med rött. Redovisning Kopiera utskrifterna från de enkla testen med SimpleListTest till en fil med namnet simpletestresults.txt. Ladda upp Lists.java och simpletestresults.txt till Fire. Vid rättningen används samma version av testklassen som finns på kursens hemsida. En nödvändig förutsättning för godkänd laboration är att klassen Lists passerar samtliga 12 test i JUnitListTest. Extra påskpyssel Studera gärna testklassen JunitListTest lite närmare. Det är en utmaning att konstruera bra mjukvarutest. De givna testfallen har säkert brister och det vore riskabelt att förlita sig på dem alltför mycket. Försök att formulera flera, bättre och mer heltäckande test! Det är bl.a. viktigt att undersöka alla gränsfall noga, t.ex. att en tom lista beter sig korrekt när det första elementet sätts in. Definiera eventuella egna test i nya testmetoder men ändra ej de givna!