Automatiserad testning av GUI
|
|
- Daniel Hermansson
- för 7 år sedan
- Visningar:
Transkript
1 Automatiserad testning av GUI Mehmet Fatih Cicek Farhad Johari 4/ Abstrakt Den här rapporten är en del av kursen Coaching av programvaruteam (EDA270) som ges på Lunds Tekniska Högskola. Rapporten innerhåller en genomgång av olika metoder som finns för att automatisera tester för ett användargränssnitt (GUI). Detta anser vi vara viktigt eftersom användargränssnittet är det första en användare kommer i kontakt med, och denna bör i högsta grad vara felfri. Manuell testning är tyvärr inte tillräcklig för att upptäcka alla (eventuella) defekter, och därför uppstår en önskan för automation. GUI testerna som utvecklas täcker funktionalitet i användargränssnitt som utvecklas av studenter på LTH. Studenterna ingår i team om 8 10 personer, och projektet de utvecklar är ett registrerings och sorteringsprogram till en Enduro tävling. Efter avslutat projekt följer en utvärdering om studenternas inställning till automatiserad GUI testning och huruvida detta är anpassat till projektet de utvecklar. Noterbart är att arbetsmetoden för projektet är extreme Programming (xp). 1
2 Innehållsförteckning Abstrakt Innehållsförteckning 1. Introduktion 2. Metoder 2.1 Manuell testning 2.2 Monkey testing 2.3 Capture and Replay 2.4 Event driven testing 3. Krav 4. Verktyg 4.1 jfcunit 4.2 FEST 4.3 Abbot 5. Analys 5.1 Praktiskt tillämpning 5.2 Utvärdering 6. Referenser 7. Appendix 2
3 1. Introduktion Projektet som utvecklarna tar fram programmeras under agila arbetsförhållanden, där test driven utveckling och automatiserade enhetstester har en stor och viktig roll. Detta innebär att all kod som utvecklas måste testas på förhand. Tyvärr inkluderas koden för användargränssnitten inte bland dessa enhetstester, och det kan ses som ett problem. Om man inte automatiserar GUI tester ökar risken för oupptäckta defekter, vilket man vill undvika i största möjliga grad. Detta beror på att man kan förbise fel, av misstag, när utfallet av tester verifieras manuellt [1]. Det är trotsallt via ett användargränssnitt en potentiell kund interagerar med programmet, och dennas intryck skall inte missdrabbas av ett oupptäckt problem. Dessutom kan man dra ner på tiden det tar för att testa ett användargränssnitt drastiskt om man övergår från manuell till automatiskt GUI testning. Det rapporteras att 52 timmars manuell testning av ett användargränssnitt endast tog tre timmar efter automation för ett projekt [2]. Detta är förstås proportionellt med användargränssnittets storlek, men ger en bra bild på hur effektiv automatiserad GUI testning kan vara. Dessutom rapporterar ADP (Automated Data Processing) att man har lyckats spara upp till 60% av tiden det tog för manuell testning med automatiska GUI tester [2]. Studier visar också att antalet buggar som påträffas med verktyg som stödjer automatiska GUI tester ökar mellan 10% till 50% [2]. Dessa exempel visar att automation kan bli en stor fördel i projekt där användargränssnittet är central och omfattande. Vårt mål är att introducera minst ett verktyg till teamet som kan användas för att producera automatiska GUI tester. Utveckling av dessa tester kommer framförallt att ske i samband med hemuppgifter som vi delar ut. Teamet kommer att komma i kontakt med verktyg halvvägs igenom projektet, och hur många verktyg som introduceras beror mycket på hur arbetet ligger till. Vi kommer inte stressa studenterna till att testa så många verktyg som möjligt, utan vårt mål är att de skall få en känsla av effekterna och hur viktigt det kan vara med GUI tester i ett riktigt projekt. Vi föredrar hellre utförliga GUI tester med ett verktyg än halvgjorda GUI tester med flera verktyg. Rapporten tar upp olika metoder för GUI tesning som finns beskrivet i sektion 2. Sektion 3 går igenom kraven vi ställer på verktygen som kan användas i projektet. Sektion 4 beskriver möjliga verktyg som kan användas i projektet, med för och nackdelar, och detta efterföljs av en analysdel där vi reflekterar över det som gick bra och mindre bra. Vi bifogar även de implementerade testfallen för användargränssnittet i ett appendix som finns längst bak i rapporten. 3
4 2. Metoder Det finns olika metoder för att testa ett användargränssnitt och alla metoder har både sina fördelar och nackdelar. Denna här sektionen går igenom några olika metoder, och motiverar varför vi väljer att utnyttja en viss metod för projektet som utvecklas. 2.1 Manuell testning Manuell testning är den enklaste formen av GUI testning. Man testar att användargränssnittet beter sig som förväntad genom att utföra några tester som producerar ett resultat. Resultatet kan lätt verifieras med förväntningarna och eventuella felaktigheter kan antecknas. Det krävs endast att testaren har kunskap om hur programmet är tänkt att fungera, dvs kunskap på domän och applikationsnivå [3] och oftast finns en checklista till hands som avser vad som behöver testas. Den här formen av testning är lönsam om användargränssnittet är litet, för då tar det inte mycket tid att testa allt som behöver testas. Men sådan är inte alltid fallet. Studier visar att 45 60% av all kod utgörs av användargränssnittet, och därför lyfts vikten av automatiserade GUI tester fram [4]. I vår arbetsmiljö måste alla enhetstester köras varje gång ett par utför en commit, dvs lägger upp produktionsklar kod på vårt gemensamma repositorie. Dessa tester omfattar inte användargränssnitten, och därför måste den testas manuellt. Eftersom vi jobbar med continuous integration och snabba releases i baby steps kan detta bli jobbigt med tiden. Vår förhoppning är att introducera ett verktyg som kan förenkla detta arbete genom automatiserade GUI tester. Huruvida det blir lönsamt i vårt fall diskuteras vid slutet av projektet. 2.2 Monkey testing Monkey testning är en mycket särskild typ av testning. Idén bygger på att stresstesta ett användargränssnitt för att hitta defekter. Verktyg som baseras på Monkey testing känner generellt sätt inte till användargränssnittet, och genererar slumpmässiga händelser automatiskt på GUI:t för att få applikationen att krascha eller bete sig på ett udda/oförväntat sätt, och kan upptäcka konstiga defekter som man vanligtvis missar. Ett bra exempel på en bugg som har hittats med denna metod berör den tyska versionen av Windows kalkylatorn på Windows Vista. Om man till exempel försöker dividera 57 med 0 framgår det i kalkylatorn av sådan division inte är möjlig. Om man därefter kallar på den interna hjälpen i kalkylatorn visas 100 i displayen, vilket visar att applikationen beter sig på ett oförväntat sätt [5]. Sådana typer av defekter är omöjliga att hitta med andra former av testning, och är möjligt här eftersom många olika sekvenser av input genereras till användargränssnittet. Statistikmässigt anger även Microsoft att de vid flertalet tillfällen har funnit 10 20% av sina buggar genom utnyttjandet utav denna typen av testning [5]. Det finns två olika kategorier av monkeys som används, nämligen smart och dumb monkeys. Skillnaden 4
5 på dessa är att en smart monkey känner till hur användargränssnittet ser ut medan en dumb monkey inte gör det. Detta gör att smart monkeys kan generera specifika händelser anpassat till användargränssnittet (därav namnet smart ), medan dumb monkeys genererar slumpmässiga händelser. Principen bygger dock fortfarande på samma grundidé Denna typ av testning används ofta som komplement till andra testningsmetoder. Det är vanligt att en dumb monkey utnyttjas i flera dagar innan lansering av ett program, för att försäkra dess utvecklare om att programmet inte kraschar eller beter sig udda. Projektet som studenterna tar fram har en specifik story som handlar om stresstestning. Om den här storyn blir aktuell och vid mån av tid kan man introducera ett lämpligt verktyg, men i allt annat fall kommer Monkey testing att undvikas. Monkey testing känns inte särkilt anpassat till agila projekt, under tiden projektet tas fram. Studenterna kan inte stresstesta användargränssnitten efter varje update och commit för att se om de fortfarande fungerar, detta är inte hållbart och effektivt. Dessutom är det inte säkert att samma fel produceras om igen, vilket kan vara viktigt när man vill hitta källan till defekten. Vi anser att denna metod har större effekt och slagkraft då den används på ett mycket större användargränssnitt, vid slutskedet av ett projekt. Vi anser även att utnyttjandet av bara denna metod för att GUI testning är väldigt bristfällig, och istället bör utvecklarna kombinera denna metod med någon annan metod för att testa gränssnitt till fullo. 2.3 Capture and Replay Capture and Replay är en automatiserad form av GUI testning där testaren skapar testen på samma vis som vid manuell testning, med undantaget att testen inte behöver utföras manuellt vid varje regressionstest [6]. Detta är möjligt eftersom testverktyget som används vid sådana test spelar in användarens interaktioner, i form av mus och tangntbordstryckningar/rörelser, med användargränssnittet och sparar detta som ett script [7, 8, 9]. När man vill testa GUI:t vid ett senare tillfälle kan verktyget återuppspela inspelningen, det vill säga scriptet, och verifiera resultatet med det som förväntas. Scriptet som spelas in har annorlunda språk och syntax, beroende på vilket testverktyg som används. Även om denna metod har en rätt så självklar tillvägagångssätt finns det två skilda varianter av Capture & Replay [7]. Dessa är nästintill identiska, med undantag från hur de spelar in GUI interaktionerna, vilket resulterar i att varje variant har sina egna fördelar och brister. En variant består av att GUI:t spelas in genom att man samlar in Bitmap värden för den grafiska representationen av GUI:t [7, 9]. Denna variant av Capture & Replay begränsar testprocessens stabilitet eftersom minsta ändring i användargränssnittets utseende resulterar i att testen fallerar. Med ändring i utseende avses att designen omformas på så sätt att GUI komponenter ändrar färg, storlek eller position. Alternativet till att spela in Bitmap värden är att spara undan referenser till GUI komponeneterna, på så sätt innebär inspelningen att man håller reda på komponenternas aktuella egenskaper/tillstånd [9]. Detta alternativ har inte den tidigare begränsningen för designändringar eftersom komponenterna inte längre detekteras visuellt utan testverktyget känner igen dessa antingen via deras typer och/eller namn. Detta ställer förstås ett krav på utvecklaren, nämligen att ge lämpliga namn till komponenterna. Ytterligare begränsas testdrivna utveckligsprocesser eftersom man redan i testfallen måste bestämma vilken typ av 5
6 komponenter som ska testas. Denna begränsning har däremot minskats i vissa testverktyg genom att man har skapat en egen komponent hierarki som möjliggör för verktyget att tolka flera komponenttyper som en typ. Vi kommer inte att introducera verktyg som baseras på Capture & Replay, av den enkla anledningen att designförändringar, som är vanligt återkommande, inte skall få GUI testerna att fallera. Eftersom en kund ofta ändrar sig känner vi inte att denna metod är särskilt anpassat till vårt projekt, och studenterna skall inte behöva göra om GUI tester efter hand som användargränssnitten ändras. Detta lär återspegla studenternas syn på GUI testning på ett negativt sätt, vilket vi vill undvika. Dessutom är studenterna andraårselever som endast har programmerat i Java och Eclipse. Vi vill hålla oss till detta, och inte introducera script med annorlunda syntax. 2.4 Event-driven testing Användargränssnitt drivs av händelser, vi förväntar oss en viss funktionalitet när man trycker på en knapp eller meny med uppdatering av respektive komponent. Av denna skäl bör GUI testerna generera likadana händelser för att simulera en verklig upplevelse. Resultatet av händelserna kan sedan jämföras med förväntningarna man har på dem. Event driven testning är just den här typen av testning, där man skickar händelser till en viss komponent på användargränssnittet och jämför resultatet. För att detta skall vara möjligt måste man kunna identifiera komponenterna i ett användargränssnitt så att rätt händelse kan genereras för rätt komponent [10]. För detta ändåmål finns det flera verktyg tillgodo, mer än detta i kommande sektion. Det viktigaste är att man namnger sina komponenter så att dessa kan kommas åt vid testerna. Därav måste komponenterna även ha unika namn, för att skilja dem åt. Enhetstester testar enskilda klasser och dess funktioner, men faktum råder att grafiska komponenter består av fler än en klass, och det blir betydligt svårare att testa dem på enhetsnivå [10]. Därför lämpar sig GUI tester på en funktionell nivå där man kan verifiera att systemet uppför sig som förväntad från en användares synvinkel [10]. Det som är positivt med event driven testning är att testerna är oberende användargränssnittets utseeende, till skillnad från Capture and Replay s vanligaste alternativ. Om en knapp flyttas ett par pixel till höger fallerar inte testerna på grund av det. Dessutom brukar dessa tester skrivas som traditionella enhetstester, vilket är positiv då de flesta programmerare har erfarenhet kring det. Vi anser denna metod vara mest lämpligast för vårt projekt på grund av naturen i ett användargränssnitt. En användare genererar händelser på ett användargränssnitt i form av knapp och tangentbordstryckningar, och därför känns det lämpligast om vi kan återskapa sådana fall i våra tester, för att göra dem så verklighetsbaserade som möjligt. 6
7 3. Krav Vi ställer en del krav på de verktyg som kan tänkas användas i vårt projekt för att generera GUI tester. Dessa krav är nödvändiga, och är utgångspunkten för våra val av verktyg. Verktygen som kan tänkas användas måste vara gratis för att kunna appliceras i vårt projekt. Vi har ingen budget som många andra företag för det här syftet. Det måste gå att integrera verktyget i Eclipse. I datorerna som projektet utvecklas på används Eclipse som IDE och därav följer det här kravet. Små förändringar på projektets användargränssnitt inte skall få testen att fallera. Detta eftersom projektet är i ständig förändring, och användargränssnitten ändras med tiden. Detta bör inte påverka testerna som har skrivits, och få dem att fallera. Designförändringar får alltså inte påverka testerna. Verktygen måste stödja Java eftersom studenterna programmerar i Java. Användargränssnitten består av Swing/AWT komponenter som är Java bibliotek. Verktygen bör utnyttja sig av JUnit Framework. Det här kravet följer eftersom många enhetstester utvecklas med JUnit under projektets gång, och det är smidigt om studenterna kan utveckla GUI testerna på liknande sätt. Det måste finnas stöd för TDD. Detta är till exempel möjligt om komponenterna går att identifiera. Annars är det omöjligt att generera händelser på diverse komponenter, och därmed omöjligt att skriva testfall som kan simulera verkliga händelser. Verktygen skall vara lätta att lära sig för att minimera den tid det tar att skriva testmetoder. Denna egenskap är väldigt viktigt för detta projekt då utvecklarna har en begränsad tid till sitt förfogande och därav vill vi spendera så lite tid som möjligt på inlärningsfasen. Verktyg blir mycket mer lättlärda genom att exempelvis erbjuda en bra och komplett dokumentation. Enkel installation är även plus i kanten. 7
8 4. Verktyg Vi har plockat fram några kandidater som kan tänkas användas i vårt projekt. För varje verktyg följer en kort beskrivning om hur de fungerar och vi lyfter även upp några för och nackdelar. Eftersom vi har brist på tid och studenterna också har annat som de måste lägga fokus på kan vi tyvärr inte applicera alla verktygen på vårt projekt. Vår önskan hade varit att testa de populäraste verktygen för att kunna göra en rättvis bedömning om vilket verktyg som passar vårt projekt bäst, men vi vill att studenterna först och främst koncentrerar sig på deras huvudsakliga fokus. 4.1 jfcunit jfcunit är ett verktyg som utvidgar JUnit och tillåter utvecklare att skriva testfall för Java Swing baserade applikationer [11]. Verktyget kan installeras som en gratis plug in till Eclipse eller via två jar filer som laddas in till projektets buildpath. Dessa är jfcunit.jar och jakarta regexp 1.2.jar. Eftersom verktyget baseras på JUnit är det viktigt att man använder JUnit 3.7 eller en högre version som är kompatibel med Eclipse. Efter det är det fritt fram att börja använda verktyget. Den senaste versionen av jfcunit är 2.08 och gavs ut Verktyget har tyvärr inte uppdaterats sen dess, och det kanske förklarar varför det är svårt att hitta bra exempel och tutorials på nätet. jfcunit har stöd för att lokalisera GUI komponenter (med förutsättning att alla har unika namn) och kan därefter generera diverse händelser på dessa. Detta kan vara allt från att klicka på en knapp till att mata in text i textfält. Detta är möjligt med verktygets specifika klasser NamedComponentFinder och TestHelper. Nedan följer en figur som sammanfattar hur detta går till. Användergränssnittet som skall testas har en knapp regbtn som NamedComponentFinder lokaliserar. Därefter genererar man en knapptryckning genom att avfyra en händelse med metoden enterclickandleave. För vidare exempel, se [12]. jfcunit har även stöd för Capture and Replay [11] och skripten sparas i XML format. Verktyget har Java dokumentation på klasser och metoder på den officiella hemsidan som utvecklare kan behöva utnyttja, samt några exempel på hur verktyget kan användas. Den relativt dåliga dokumentationen och bristande exempel täcks upp av verktygets enkla sätt att skriva testfall. Man utnyttjar notationer från JUnit som Test, setup, teardown osv. vilket vi anser vara positivt. Verktyget är helt klart en kanditat för projektet, trots bristfällig dokumentation. 8
9 4.2 FEST FEST är en samling moduler som står för Fixtures for Easy Software Testning och kan användas med både JUnit och TestNG [13, 14]. Modulen som användas i samband med Java Swing applikationer heter FEST Swing och kan laddas ner från projektets hemsida [15]. Till skillnad från jfcunit är FEST Swing bättre dokumenterat och hyfsat enkel att lära sig. FEST Swing kräver att man använder Java SE 5.0 eller senare [13] och uppdaterades senast Modulen består av flera jar filer, och vilka som bör användas i ett projekt förklaras här. Modulen utnyttjar AWT Robot för att generera användarinput [16]. AWT Robot kan generera olika typer av händelser, precis som en vanlig användare, och gör att testfallen blir så verklighetstrogna som möjligt. Med andra ord är FEST Swing ett verktyg som stödjer typen Event driven testning, precis som jfcunit. FEST Swing kan lokalisera komponenter via namn, typ eller annan kriterium. Därav är det viktigt att man namnger sina komponenter i användargränssnittet med unika namn så att dessa går att hitta. Under testen kan man se användargränssnittet simuleras viseullt vilket är positivt då man kan verifiera att testerna utför det som man tänkt sig. Nackdelen är att man inte kan använda datorn samtidigt som testerna körs. Detta är i och för sig inte en stor begränsning för FEST eller GUI testning generellt sätt, eftersom man vanligtvis inte använder datorn till annat under tiden testerna exekveras. Det finns olika alternativ att välja bland när man skriver testfall med FEST Swing. Man kan antigen jobba direkt med FEST Robot, eller med något som kallas för Fixtures. Fixtures förser specifika metoder för att simulera händelser på GUI komponenter och har stöd för att verifiera dessas tillstånd [17]. Det finns en Fixture per varje Swing komponent och har samma namn som komponenten med tillägget Fixture. Kod som skrivs med Fixtures blir självförklarande och detta är klart positivt. FEST känns på förhand som ett bra val av verktyg. 4.3 Abbot Abbot, som står för A better bot, är ett framework för att skapa automatiska tester till Javas GUI komponenter. Det är ett opensource verktyg, precis som de tidigare verktygen, och finns att ladda ner gratis. Den senaste versionen av verktyget (release 1.2) släpptes Verktygen kommer tillsammans med en editor Costello som har stöd för Capture and Replay [18]. Det som är intressant för vår del är att kunna skriva testerna genom programmering, precis som vanliga enhetstester. Detta stödjer Abbot genom att utnyttja JUnit [19]. Abbot är hyfsat väldokumenterat. ComponentFinder är klassen som utvecklare använder för att lokalisera olika GUI komponenter, och som det märks har alla verktyg vi har beskrivit tagit samma tillvägagångssätt för att lösa problemet med identifiering av olika komponenter. För nybörjare finns det Quick Start, User Guide, Examples och Tutorials sektionerna till hands på verktygets officiella hemsida. Dessutom kan man få en överblick över hur strukturen är uppbyggt i Overview. Eftersom testerna kan skrivas med 9
10 JUnit kan man använda jämförelsemetoderna som JUnit stödjer (assertequals, assertfalse etc) och detta kan komma väl till hand för att verifiera ett tillstånd. Precis som övriga verktyg installeras Abbot genom att lägga till en jar fil i det aktuella projektets buildpath. 5. Analys Analysdelen är uppdelad i två delar. Först beskriver vi hur vi gick tillväga för att introducera verktyg, och hur GUI testerna implementerades. Sedan tar vi upp feedback från studenterna och avgör huruvida GUI tester är anpassat för PVG projektet. 5.1 Praktiskt tillämpning Verktyg för GUI testning som stödjer den event drivna metoden introducerades för första gången som hemuppgift inför iteration 3 för en student. Vi var tyvärr inte precisa med vilka verkyg som skulle undersökas, och detta bidrog till att studenten mer eller mindre misslyckades med att producera färdiga tester för användargränssnitten. Under planeringsmötet bestämdes att FEST och Abbot skulle undersökas, men gick sedan över till jfcunit och UISpec4J. Oklarheten berodde lite på oss, eftersom vi inte riktigt visste vilket verktyg som borde introduceras. UISpec4J saknar grafisk representation, så man kan visuellt inte se vad som testas. Studenten tog fram ett litet kodskelett med ovanstående verktyg, men det var inget som vi kunde utnyttja direkt i vårt projekt. För att undvika samma problem förberedde vi nästa student som fick som hemuppgift att undersöka ett nytt verktyg (jfcunit). Förberedelsen inkluderade manual med exempel på färdiga tester. Dessutom skapade vi ett riktigt testfall för registreringsgränssnittet som studenten kunde utgå från. Dessa förberedelser fick en positiv inverkan, och studenten lyckades skapa flera testfall anpassade till vårt projekt. Dessutom prioriterade kunden in en egen story om GUI testning under iteration 4. Detta gjorde att studenten fick ytterligare tillfälle att fortsätta skriva GUI testerna. Anledningen till att vi introducerade jfcunit var att verkyget är enkelt att använda, och man förstår sig på exemplen som finns utan ansträngning, trots dålig dokumentation. Den färdiga manualen för jfcunit, som har sammanställts av två tidigare coacher, var ännu en anledning till vårt val av verkyg. Efter det misslyckade fallet ville vi introducera ett verktyg med snabb inlärning, som snabbt kan ge resultat, och med förutsättningarna som fanns var jfcunit ett givet val. Under iteration 4 noterade vi noterade hur kodtäckningen ändrades när alla GUI tester föll på plats. Nedan följder två bilder från iteration 4 (kl 10.30) som visar andelen kod som testas före och efter GUI testen. Notera att sorteringsgränssnittet inte var testat när dessa skärmdumpar togs, men även det testades senare under iterationen (bland annat under de 2h som kunden prioriterade). 10
11 Code coverage innan GUI testerna har körts. Code coverage efter GUI testerna har körts. Vi får betydligt mer kod testad i projektet, och det kan bidra till enklare identifiering av eventuella fel i systemet. GUI testen visades upp för kunden, och han var nöjd och imponerad över resultatet vilket vi finner positivt. Vi tror att den visuella feedbacken man får med jfcunit kan ha en stor påverkan i detta. Vi upplevde något som kan ses som ett problem med jfcunit, nämligen att GUI testerna inte förblev helt automatiska till en början. Detta beror på att både registrerings och sorteringsgränssnittet anropar på externa fönster (för att öppna/spara filer), som man inte lyckades hantera. Detta lyckades man lösa för registreringsprogrammet genom att införa en flagga som avgör om sökvägen till en viss fil, i samband med öppna/spara, skall vara dynamisk eller statisk. Man körde på samma koncept med statiska sökväg för vissa filer till sorteringsprogrammet, men att få allt automatiskt var lite omständigare då sorteringsgränssnittet anropade på fler externa fönster. Detta ser vi som en stor begränsning, och sådana justeringar skall inte behövas för att få testerna att köras utan interaktion med användaren. De flesta av ovanstående problem kunde ha undvikits med en konfigurationsfil (story 25), men kunden valde att inte prioritera det. Under femte planeringsmötet fick en student som hemuppgift att undersöka FEST Swing, och skriva testfall för vårt projekt med verktyget. Tanken var att kunna göra en jämförelse mellan två olika verktyg, och se ifall det ena är med lämpad än det andra för vårt projekt. Tyvärr drabbades studenten av ett slags virus, och kunde inte påbörja sin hemuppgift. Dessutom fick vi ingen betald tid under iteration 5 för GUI testning, så därför fick vi inget gjort den här veckan. Inför sista iterationen hade vi som mål att få story 9 (varvlopp) fullbordat, då den hade stökat till det 11
12 ordentligt sedan iteration 2. Eftersom vi hade en release framför oss valde vi att inte introducera ett nytt verktyg. En av studenterna som hade hållt på med GUI testning gjorde klart sin hemuppgift relativt snabbt, och ville gärna få annat arbete som kunde gynna teamet. Detta såg vi som ett ypperligt tillfälle för att optimera GUI testerna för sorteringsprogrammet (som vid det här laget inte var helt automatiska). Studenten tog sig an uppgiften, och under iterationen sågs det till att alla GUI tester blev helt automatiska. Innan release 3 skickades iväg kollade vi på kodtäckningen och den visade sig ligga på 93%, vilket är väldigt högt. Main metoderna var också testade, vilket är lite onödigt, och om man exkluderade dem från testerna hamnade kodtäckningen på 91.9%. Tyvärr innehåll projektet en del tester som inte gick igenom på grund av story 9 som inte helt var på plats (tidsbegränsning saknades). Även om testerna fallerade täcktes vissa delar av koden, men teamet bestämde sig för att ignorera dessa tester (@Ignore i JUnit)och då sjönk kodtäckningen till 84.5% (vilket fortfarande är högt). Nedan kan man se två figurer som visar kodtäckningen på releasen som skickades iväg den sista iterationen. Som det syns höjdes kodtäckningen ganska mycket av våra GUI tester. Det fanns fortfarande rum för förbättringar, men på grund av tidsbrist hann vi inte implementera det. Code coverage innan GUI testerna har körts. Code coverage efter GUI testerna har körts. 5.2 Utvärdering Vi frågade teamet hur ofta de testade användargränssnitten (innan GUI testerna) när ny funktionalitet lades till i systemet, och vi möttes av det förväntade svaret; i princip aldrig. Alla var eniga om att det egentligen borde testas då enhetstesterna inte täckte användargränssnitten, men ingen orkade riktigt göra det. Till deras försvar hörde argument som Det tar för lång tid, Det funkar säkert osv. Vi ställde samma fråga efter den sista releasen, och märkte att många fler testade användargränssnitten. Till en 12
13 början var testerna semi automatiska, och det bidrog till att man inte körde dem efter ett tag, men så fort allt sköttes automatiskt märktes det att användningen av GUI testerna ökade. Detta bekräftade även teamet, och konstaterade att man sparar en hel del tid med automatiska tester. Vårt projekt bestod av två användargränssnitt. Sorteringsprogrammet var egentligen tänkt att vara terminalbaserad, men teamet övergick till ett grafisk användargränssnitt efter diskussion med kunden. Detta gav oss ännu en anledning till att introducera GUI verktyg då vi fick mer GUI baserad kod än det tänkta fallet. Eftersom vi hade mer att testa kunde studenterna ut mer av GUI testerna, och verkligen se effekterna. Alla fick tyvärr inte chansen till att implementera dessa tester, då vi inte hade tillräckligt med tid. Vi lyckades inte heller introducera ett annat verktyg (förutom jfcunit) av samma anledning, men målet var att de skulle få en känsla av effekterna och hur viktigt det kan vara med GUI tester i ett riktigt projekt, och av feedbacken vi fick kan man konstatera att vi lyckades med detta. Först och främst kommenterade studenterna på hur fräck testerna såg ut. De uppskattade att få jobba utöver det vanliga, där man kan få visuell feedback och se om man har gjort rätt eller fel. Att testerna skrevs som vanliga JUnit tester förenklade testskrivandet en hel del, enligt de involverade studenterna. Paketindelningen som användes i projektet gjorde så att användargränssnitten och logiken bakom gick att testa separat (MVC modellen), vilket kan också ses som en förenklande faktor. Tyvärr var datorerna väldigt söliga, och det påverkade hur ofta teamet var villiga till att köra testerna efter ett tag. Vi frågade specifikt vad de tyckte om jfcunit, och feedbacken vi fick av de två studerande som hade jobbat med verktyget var att det var enkelt att skriva testfall, inte alls svårt att sätta sig in i verktyget (trots dålig dokumentation), men ansågs även vara bristfällig då det var väldigt svårt att hantera externa fönster som inte tillhörde användargränssnitten. Detta gick att lösa med flaggor i programmet, men ansågs inte vara en särskild snygg lösning. Överlag var studenterna nöjda med GUI testerna, och väldigt positiva till att dessa tester ökade kodtäckningen i projektet. De rekommenderade övriga team att implementera automatiska GUI tester efter deras positiva erfarenheter. Från feedbacken vi fick konstaterades att studenterna nöjda över resultatet, och det gör att automatiska GUI tester känns applicerbart för PVG projektet. Det beror också på att teamet lyckades göra de semi automatiska testerna helt automatiska. Vi visade upp de automatiska testerna för kunden, och han var helt klart imponerad och såg hela vår investering lönsamt. För honom var stabilitet viktigt, och han ansåg våra tester uppfylla hans stabilitetskrav. Därmed fick vi fram något som både studenterna och kunden var nöjd över, vilket gör oss som coacher väldigt glada. Vi kan rekommendera GUI testning och verktyget jfcunit till övriga team, men vill påpeka att man inte bör göra det på kostnad av annan fokus som studenterna har. Det bör istället göras under hemuppgifter, och där kunden faktiskt betalar efter en överenskommelse. 13
14 6. Referenser [1] M. Finsterwalder, Automating Acceptance Tests for GUI Applications in an Extreme Programming Environment, University of Hamburg, Germany. In Proceedings of the 2nd International Conference on Extreme Programming and Flexible Processes in Software Engineering. [2] Kanglin Li,Mengqi Wu. Effective GUI Testing Automation: Developing an Automated GUI Testing Tool, ISBN: [3] Alessandro Marchetto & Fondazione Bruno Kessler IRST Seminar Gui based Testning [4] A. M. Memon, A comprehensive framework for testing graphical user interfaces. PhD thesis, University of Pittsburgh, [5] B. Hofer and B. Peischl and F. Wotawa, GUI Savvy End to End Testing with Smart Monkeys, Technische Universitat Graz, Austria. IEEE Digital Object Identifier /IWAST [6] Atif M. Memon and Bao N. Nguyen, Advances in Automated Model Based System Testing of Software Applications with a GUI Front End [7] Borjesson, E. and Feldt, R., Automated System Testing Using Visual GUI Testing Tools: A Comparative Study in Industry. IEEE Digital Object Identifier /ICST [8] Ruiz, A and Price, Y.W., Test Driven GUI Development with TestNG and Abbot. IEEE Digital Object Identifier /MS [9] Emil Alégroth, Robert Feldt and Lisa Ryrholm, Visual GUI testing in practice: challenges, problems and limitations. Digital Objevt Identifier /s [10] Alex Ruiz and Yvonne Wang Price. Gui testing made easy. In Proceedings of the Testing: Academic & Industrial Conference. Digital Object Identifier /TAIC.PART [11] jfcunit User Documentation. (Senast uppdaterad: 31/12/2004, Senast visad: 3/3/2014) 14
15 [12] JFCUnit Overview summer/ pdf [13] FEST Swing Module. (Senast uppdaterad: Okänt, Senast visad 3/3/2014) [14] FEST Swing Module. (Senast uppdaterad: 28/8/2010, Senast visad: 3/3/2010) [15] Fixtures for Easy Software Testing. (Senast uppdaterad: 28/2/2011, Senast visad: 3/3/2014) [16] FEST Swing Module. (Senast uppdaterad: Okänt, Senast visad 3/3/2014) [17] FEST Swing Module. (Senast uppdaterad: Okänt, Senast visad 3/3/2014) [18] Abbot Java GUI Test Framework. (Senast uppdaterad: 30/12/2011, Senast visad 3/3/2014) [19] Abbot API specification. summary.html#overview_description (Senast uppdaterad: 2008, Senast visad 3/3/2014) 15
16 7. Appendix Här bifogas användargränssnitten som utvecklarna har tagit fram samt de GUI test som har skrivits och går igenom. Tanken är att vem som helst skall kunna kopiera in dessa till Eclipse (eller annan IDE) och köra dem lokalt. RegistrationGUI (Detta är användargränssnittet som sköter registrering av förare). Main metoden som startar programmet finns i en seperat klass. packager.gui; importjava.awt.borderlayout; importjava.awt.color; importjava.awt.font; importjava.awt.gridlayout; importjavax.swing.boxlayout; importjavax.swing.jbutton; importjavax.swing.jframe; importjavax.swing.jlabel; importjavax.swing.jpanel; importjavax.swing.jscrollpane; importjavax.swing.jtextarea; importjavax.swing.jtextfield; importjavax.swing.swingconstants; importr.controller.enteractionlistener; importr.controller.regallbuttonlistener; importr.controller.regbuttonlistener; importr.model.timeregisterhandler; 16
17 importcommons.savefilechooser; publicclassregistrationguiextendsjframe{ privatestaticfinallongserialversionuid=1l; privatejtextfieldregisterfield; privatejtextarearecentreg; /** * ContentoftheregistrationGui. * *@paramistest * theguiisusedinatestcase. */ publicregistrationgui(booleanistest){ Stringpath=""; if(istest){ path=system.getproperty("user.home") +"/registerresults.txt"; else{ path=newsavefilechooser().getpath(""); if(path==null){ System.exit(0); setbounds(100, 100, 520, 300); setdefaultcloseoperation(jframe.exit_on_close); JPanelregisterPanel=newJPanel(); registerpanel.setbackground(color.white); getcontentpane().add(registerpanel, BorderLayout.NORTH); registerpanel.setlayout(newboxlayout(registerpanel, BoxLayout.X_AXIS)); JPanelpanel=newJPanel(); registerpanel.add(panel); panel.setlayout(newborderlayout(0, 0)); JLabellblStartnumber=newJLabel("Startnummer:"); lblstartnumber.sethorizontalalignment(swingconstants.center); panel.add(lblstartnumber, BorderLayout.NORTH); lblstartnumber.setbackground(color.white); lblstartnumber.setfont(newfont("dialog", Font.BOLD, 20)); registerfield=newjtextfield(); registerfield.setname("registerfield"); panel.add(registerfield); registerfield.sethorizontalalignment(swingconstants.center); registerfield.setfont(newfont("dialog", Font.PLAIN, 42)); registerfield.setcolumns(10); JPanelpanel_1=newJPanel(); registerpanel.add(panel_1); 17
18 panel_1.setlayout(newgridlayout(0, 1, 0, 0)); TimeRegisterHandlertrh=newTimeRegisterHandler(path); JPanelentriesPanel=newJPanel(); getcontentpane().add(entriespanel, BorderLayout.CENTER); entriespanel.setlayout(newgridlayout(0, 1, 0, 0)); recentreg=newjtextarea(); recentreg.setname("registerlist"); recentreg.seteditable(false); JScrollPanesp=newJScrollPane(recentReg); entriespanel.add(sp); JButtonregisterButton=newJButton("Registrera"); registerbutton.setname("registerbutton"); panel_1.add(registerbutton); registerbutton.setfont(newfont("dialog", Font.BOLD, 28)); registerfield.addactionlistener(newenteractionlistener(trh, this)); JButtonbtnMass=newJButton("Mass-start"); btnmass.setname("btnmass"); btnmass.setfont(newfont("dialog", Font.BOLD, 28)); btnmass.addactionlistener(newregallbuttonlistener(trh, this)); panel_1.add(btnmass); registerbutton.addactionlistener(newregbuttonlistener(trh, this)); setvisible(true); /** * AppendsaStringtothemessagefieldintheGUI. * *@paramtext * toappend. */ publicvoidappend(stringtext){ recentreg.append(text); registerfield.settext(""); registerfield.requestfocus(); /** * Methodtogetthetextenteredintotheregistrationfield. * *@returnthetextintheregistrationfield. */ publicstringgetregfieldtext(){ 18
19 try{ returnregisterfield.gettext(); catch(exceptione){ return""; SortingGUI (Detta är användargränssnittet som sköter sorteringen). Main metoden som startar programmet finns i en seperat klass. packages.gui; importjavax.swing.jbutton; importjavax.swing.jframe; importjavax.swing.jscrollpane; importjavax.swing.jtextarea; imports.controller.endbuttonlistener; imports.controller.namebuttonlistener; imports.controller.sortbuttonlistener; 19
20 imports.controller.startbuttonlistener; imports.model.laptimehandler; imports.model.racerhandler; imports.model.time; publicclasssortingguiextendsjframe{ privatestaticfinallongserialversionuid=1l; privatejtextareaarea; publicsortinggui(stringstring){ super("sortering"); RacerHandlerrh; if(string.equals("test")){ StringtimeLimit=" "; intmaxlapswrite=3; rh=newlaptimehandler(timelimit, maxlapswrite, new Time(" ")); else{ RaceTypeDialogrtd=newRaceTypeDialog(); rh=rtd.getracetype(); getcontentpane().setlayout(null); setbounds(100, 100, 521, 540); setdefaultcloseoperation(jframe.exit_on_close); JButtonbtnLoadStartFile=newJButton("LaddaStartfil"); btnloadstartfile.addactionlistener(newstartbuttonlistener(rh, this,string)); btnloadstartfile.setbounds(12, 12, 490, 74); btnloadstartfile.setname("loadstartbtn"); getcontentpane().add(btnloadstartfile); JButtonbtnLoadEndFile=newJButton("LaddaMÃ lfil"); btnloadendfile.addactionlistener(newendbuttonlistener(rh, this,string)); btnloadendfile.setbounds(12, 98, 490, 74); btnloadendfile.setname("loadendbtn"); getcontentpane().add(btnloadendfile); JButtonbtnLoadNameFile=newJButton("LaddaNamnfil"); btnloadnamefile.addactionlistener(newnamebuttonlistener(rh,this,string)); btnloadnamefile.setbounds(12, 184, 490, 74); btnloadnamefile.setname("loadnamebtn"); getcontentpane().add(btnloadnamefile); JButtonbtnSort=newJButton("Sortera"); btnsort.addactionlistener(newsortbuttonlistener(rh, this,string)); btnsort.setbounds(12, 270, 490, 74); btnsort.setname("sortbtn"); getcontentpane().add(btnsort); 20
21 JScrollPanescrollPane=newJScrollPane(); scrollpane.setbounds(12, 360, 490, 142); getcontentpane().add(scrollpane); area=newjtextarea(); area.setname("textfield"); area.seteditable(false); scrollpane.setviewportview(area); setvisible(true); publicvoidappend(stringtext){ area.append(text+"\n"); jfcunit packagetestgui; importjava.awt.event.keyevent; importjavax.swing.jbutton; importjavax.swing.jcomponent; importjavax.swing.jtextarea; importjavax.swing.jtextfield; importjunit.extensions.jfcunit.jfctestcase; importjunit.extensions.jfcunit.jfctesthelper; importjunit.extensions.jfcunit.eventdata.keyeventdata; importjunit.extensions.jfcunit.eventdata.mouseeventdata; importjunit.extensions.jfcunit.finder.namedcomponentfinder; importorg.junit.test; importr.gui.registrationgui; importr.model.currenttime; publicclasstestregisterguiextendsjfctestcase{ privateregistrationguigui=null; privatecurrenttimecurrenttime; protectedvoidsetup() throwsexception{ currenttime=newcurrenttime(); super.setup(); sethelper(newjfctesthelper()); gui=newregistrationgui(true); 21
22 gui.setvisible(true); /** * Forthesetestthetesterneedtomanuallywriteafilenameintothe * savewindow publicvoidtestregistergui(){ NamedComponentFinderfinder=newNamedComponentFinder( JComponent.class,"registerField"); JTextFieldregisterField=(JTextField) finder.find(gui, 0); assertnotnull("textfielddoesnotexits", registerfield); assertequals("textfiledshouldbeempty","", registerfield.gettext()); gethelper().sendkeyaction( newkeyeventdata(this, registerfield, KeyEvent.VK_5)); assertequals("textfieldshouldcontain5","5", registerfield.gettext()); finder.setname("registerlist"); JTextArearegisterArea=(JTextArea) finder.find(gui, 0); assertnotnull("jtextareadoesnotexits", registerarea); assertequals("jtextareashouldbeempty","", registerarea.gettext()); finder.setname("registerbutton"); JButtonregisterButton=(JButton) finder.find(gui, 0); assertnotnull("registerbuttondoesnotexits", registerbutton); assertequals("registerbuttonshouldsay'registrera'","registrera", registerbutton.gettext()); gethelper().enterclickandleave(newmouseeventdata(this, registerbutton)); StringcurrentTimeString=currentTime.toString(); assertequals("jtextareashouldbefilled", "5;" +currenttimestring.substring(0, 6), registerarea.gettext().substring(0, 9)); booleansecondsmatch=false; StringsecondsString=registerArea.getText().substring(9, 11); intseconds=integer.parseint(secondsstring); secondsmatch=((integer.parseint(currenttimestring.substring(6, 8)) == seconds) (Integer.parseInt(currentTimeString.substring(6, 8)) ==seconds+ 1)); asserttrue("secondsdonotmatch", 22
23 publicvoidtestregisterguiwronginput(){ NamedComponentFinderfinder=newNamedComponentFinder( JComponent.class,"registerField"); JTextFieldregisterField=(JTextField) finder.find(gui, 0); assertnotnull("textfielddoesnotexits", registerfield); assertequals("textfiledshouldbeempty","", registerfield.gettext()); gethelper().sendkeyaction( newkeyeventdata(this, registerfield, KeyEvent.VK_SLASH)); assertequals("textfieldshouldcontain/","/", registerfield.gettext()); finder.setname("registerlist"); JTextArearegisterArea=(JTextArea) finder.find(gui, 0); assertnotnull("jtextareadoesnotexits", registerarea); assertequals("jtextareashouldbeempty","", registerarea.gettext()); finder.setname("registerbutton"); JButtonregisterButton=(JButton) finder.find(gui, 0); assertnotnull("registerbuttondoesnotexits", registerbutton); assertequals("registerbuttonshouldsay'registrera'","registrera", registerbutton.gettext()); gethelper().enterclickandleave(newmouseeventdata(this, registerbutton)); assertequals("jtextareashouldshowexception","felinmatning\n", publicvoidtestregisterguimassstart(){ NamedComponentFinderfinder=newNamedComponentFinder( JComponent.class,"registerField"); JTextFieldregisterField=(JTextField) finder.find(gui, 0); assertnotnull("textfielddoesnotexits", registerfield); assertequals("textfiledshouldbeempty","", registerfield.gettext()); gethelper().sendkeyaction( newkeyeventdata(this, registerfield, KeyEvent.VK_1)); gethelper().sendkeyaction( newkeyeventdata(this, registerfield, KeyEvent.VK_MINUS)); gethelper().sendkeyaction( newkeyeventdata(this, registerfield, KeyEvent.VK_3)); assertequals("textfieldshouldcontain1-3","1-3", registerfield.gettext()); finder.setname("registerlist"); JTextArearegisterArea=(JTextArea) finder.find(gui, 0); assertnotnull("jtextareadoesnotexits", registerarea); assertequals("jtextareashouldbeempty","", registerarea.gettext()); finder.setname("registerbutton"); JButtonregisterButton=(JButton) finder.find(gui, 0); assertnotnull("registerbuttondoesnotexits", registerbutton); assertequals("registerbuttonshouldsay'registrera'","registrera", 23
24 registerbutton)); gethelper() registerbutton.gettext());.enterclickandleave(newmouseeventdata(this, StringcurrentTimeString=currentTime.toString(); assertequals("jtextareashouldbefilled", "1-3;" +currenttimestring.substring(0, 6), registerarea.gettext().substring(0, 11)); booleansecondsmatch=false; StringsecondsString=registerArea.getText().substring(11, 13); intseconds=integer.parseint(secondsstring); secondsmatch=((integer.parseint(currenttimestring.substring(6, 8)) == seconds) (Integer.parseInt(currentTimeString.substring(6, 8)) ==seconds+ 1)); asserttrue("secondsdonotmatch", publicvoidtestregisterguiwrongordermassstart(){ NamedComponentFinderfinder=newNamedComponentFinder( JComponent.class,"registerField"); JTextFieldregisterField=(JTextField) finder.find(gui, 0); assertnotnull("textfielddoesnotexits", registerfield); assertequals("textfiledshouldbeempty","", registerfield.gettext()); gethelper().sendkeyaction( newkeyeventdata(this, registerfield, KeyEvent.VK_3)); gethelper().sendkeyaction( newkeyeventdata(this, registerfield, KeyEvent.VK_MINUS)); gethelper().sendkeyaction( newkeyeventdata(this, registerfield, KeyEvent.VK_1)); assertequals("textfieldshouldcontain3-1","3-1", registerfield.gettext()); finder.setname("registerlist"); JTextArearegisterArea=(JTextArea) finder.find(gui, 0); assertnotnull("jtextareadoesnotexits", registerarea); assertequals("jtextareashouldbeempty","", registerarea.gettext()); finder.setname("registerbutton"); JButtonregisterButton=(JButton) finder.find(gui, 0); assertnotnull("registerbuttondoesnotexits", registerbutton); assertequals("registerbuttonshouldsay'registrera'","registrera", registerbutton.gettext()); gethelper().enterclickandleave(newmouseeventdata(this, 24
25 registerbutton)); assertequals("jtextareashouldbefilled", "Detförstataletmåstevaramindreändetandra\n", publicvoidtestmassbutton(){ NamedComponentFinderfinder=newNamedComponentFinder( JComponent.class,"registerField"); JTextFieldregisterField=(JTextField) finder.find(gui, 0); assertnotnull("textfielddoesnotexits", registerfield); assertequals("textfiledshouldbeempty","", registerfield.gettext()); gethelper().sendkeyaction( newkeyeventdata(this, registerfield, KeyEvent.VK_1)); gethelper().sendkeyaction( newkeyeventdata(this, registerfield, KeyEvent.VK_MINUS)); gethelper().sendkeyaction( newkeyeventdata(this, registerfield, KeyEvent.VK_3)); finder.setname("btnmass"); JButtonbtnMass=(JButton) finder.find(gui, 0); gethelper().enterclickandleave(newmouseeventdata(this, btnmass)); finder.setname("registerlist"); JTextArearegisterArea=(JTextArea) finder.find(gui, 0); StringcurrentTimeString=currentTime.toString(); Stringactual=registerArea.getText().substring(0, 27); Stringtemp=currentTimeString.substring(0, 5); Stringexpected="Mass-startmedtiden:" +temp; assertequals("jtextareashouldbefilled", expected, actual); booleansecondsmatch=false; StringsecondsString=registerArea.getText().substring(28, 30); intseconds=integer.parseint(secondsstring); secondsmatch=((integer.parseint(currenttimestring.substring(6, 8)) == seconds) (Integer.parseInt(currentTimeString.substring(6, 8)) ==seconds+ 1)); asserttrue("secondsdonotmatch", secondsmatch); packagetestgui; importjavax.swing.jbutton; importjavax.swing.jcomponent; importjavax.swing.jtextarea; importjunit.extensions.jfcunit.jfctestcase; importjunit.extensions.jfcunit.jfctesthelper; importjunit.extensions.jfcunit.eventdata.mouseeventdata; importjunit.extensions.jfcunit.finder.namedcomponentfinder; 25
26 importorg.junit.test; imports.gui.sortinggui; publicclasstestsortingguiextendsjfctestcase{ privatesortingguigui=null; protectedvoidsetup() throwsexception{ super.setup(); // junit.extensions.jfcunit.windowmonitor.start(); sethelper(newjfctesthelper()); gui=newsortinggui("test"); gui.setvisible(true); /** * Thistestneedstoopenuser.dir+SaveFiles/iteration1/starttider.txt publicvoidtestastartbtn(){ NamedComponentFinderfinder=newNamedComponentFinder( JComponent.class,"TextField"); JTextAreatextArea=(JTextArea) finder.find(gui, 0); finder.setname("loadstartbtn"); JButtonloadStartBtn=(JButton) finder.find(gui, 0); assertnotnull("startbtndoesnotexits", loadstartbtn); assertequals("startbtnshouldnotbeempty","laddastartfil", loadstartbtn.gettext()); gethelper().enterclickandleave(newmouseeventdata(this, loadstartbtn)); Stringpath=System.getProperty("user.dir") +"/SaveFiles/Iteration1/starttider.txt"; assertequals("textareashouldbenotempty", "Inläsningavstartfillyckades\n" +path+"\n", publicvoidtesttextarea(){ NamedComponentFinderfinder=newNamedComponentFinder( JComponent.class,"TextField"); JTextAreatextArea=(JTextArea) finder.find(gui, 0); assertnotnull("textareadoesnotexits", textarea); assertequals("textareashouldbeempty","", publicvoidtestendbtn(){ NamedComponentFinderfinder=newNamedComponentFinder( JComponent.class,"LoadEndBtn"); JButtonloadEndBtn=(JButton) finder.find(gui, 0); 26
27 assertnotnull("endbtndoesnotexits", loadendbtn); assertequals("endbtnshouldnotbeempty","laddamålfil", publicvoidtestnamebtn(){ NamedComponentFinderfinder=newNamedComponentFinder( JComponent.class,"LoadNameBtn"); JButtonloadNameBtn=(JButton) finder.find(gui, 0); assertnotnull("loadnamebtndoesnotexits", loadnamebtn); assertequals("loadnamebtnshouldnotbeempty","laddanamnfil", loadnamebtn.gettext()); /** * Thistestneedsthatthesortingresultissavedasuser.dir+ * SaveFiles/iteration1/guiTest.txt publicvoidtestsortbtn(){ NamedComponentFinderfinder=newNamedComponentFinder( JComponent.class,"TextField"); JTextAreatextArea=(JTextArea) finder.find(gui, 0); finder.setname("sortbtn"); JButtonsortBtn=(JButton) finder.find(gui, 0); assertnotnull("sortbtndoesnotexits", sortbtn); assertequals("sortbtnshouldnotbeempty","sortera", sortbtn.gettext()); gethelper().enterclickandleave(newmouseeventdata(this, sortbtn)); Stringpath=System.getProperty("user.dir") +"/SaveFiles/Iteration1/guiTest.txt"; assertequals("textareashouldbenotempty", "Genereringavresulatatlistalyckades.\n", textarea.gettext()); 27
Testning av användargränssnitt
Testning av användargränssnitt Författare: Christian Holmgren Sanna Mauritzon Datum: 2011-02-28 Sammandrag Rapporten är ämnad att ge en överblick över området att testa grafiska användargränssnitt. Detta
Läs merVisuell GUI Testning
Visuell GUI Testning Vad är ett Graphical User Interface (GUI)? Icke-animerat GUI Animerat GUI Nuläget System- och acceptanstestning är dyrt! Manuellt Långsamt Enformigt Svårt att replikera exakt Nödvändigt
Läs merTestdriven utveckling. Magnus Jonsson Siemens Medical Solutions
Testdriven utveckling Magnus Jonsson Siemens Medical Solutions 2 Soarian Stort projekt, ca 400 personer i projektet Distribuerad utveckling i USA, Indien och Sverige Web baserat lösning med admin client
Läs merNågra grundläggande begrepp
Några grundläggande begrepp Validering bygger vi rätt system? Uppfyller kravspecifikationen de verkliga behoven? Verifiering bygger vi systemet rätt? Uppfyller det färdiga systemet kravspecifikationen?
Läs merSLUTRAPPORT: TEXAS HOLDEM 4 FRIENDS
SLUTRAPPORT: TEXAS HOLDEM 4 FRIENDS Individuellt Mjukvaruutvecklingsprojekt (Utvecklare av digitala tjänster) Den 1 juni 2011 ABSTRAKT Rapporten tar upp positiva och negativa erfarenheter som jag erhållit
Läs merAutomatiserad GUI-testning för Java EDA270 - Djupstudie. J. Assarsson D08, Lunds Tekniska Högskola dt08ja2@student.lth.se
Automatiserad GUI-testning för Java EDA270 - Djupstudie J. Assarsson D08, Lunds Tekniska Högskola dt08ja2@student.lth.se 26 februari 2012 Abstract Den här rapporten är en del av en djupstudie i kursen
Läs merFilhanterare med AngularJS
Filhanterare med AngularJS Författare: Filip Johansson Peter Emilsson Oskar Georgsson Christian Nilsson Datum: 2014-03-26 1 Sammanfattning Filhanterare med AngularJS är en filhanterare skapad för Sigma
Läs merVerktyget FindBugs. Djupstudie i kursen EDA 270 Coachning av programvaruteam. Christofer Bach dt05cb6 Daniel Nilsson dt05dn4. Lunds Tekniska Högskola
Verktyget FindBugs Djupstudie i kursen EDA 270 Coachning av programvaruteam Christofer Bach dt05cb6 Daniel Nilsson dt05dn4 Lunds Tekniska Högskola 15 feb 08 1. Sammanfattning Denna djupstudie kommer att
Läs merLabrapport över Rumbokningssytemet Grupp:1
Fakulteten för ekonomi, kommunikation, IT & data Labrapport över Rumbokningssytemet Grupp:1 Kurskod: DVGC18 Kursnamn: Software Engineering Inlämningsdatum: 2009 10 28 Scrummaster: Martin Blom Projektmedlemmar:
Läs merVerktyg och Utvecklingsmiljö. Föreläsning 2 Eclipse
Verktyg och Utvecklingsmiljö Föreläsning 2 Eclipse Verktyg Modern programutveckling innebär att man måste behärska ett antal verktyg. Editorer Kompilatorer Avlusare(debugger) Versionshantering(kommer i
Läs merTestplanering, test-first, testverktyg
Testplanering, test-first, testverktyg Mats Skoglund Department of Computer and Systems Sciences Stockholm University/Royal Institute of Technology Stockholm, Sweden 12 mars 2007 Mats Skoglund Page 1(33)
Läs merTDDI02. Programmeringsprojekt. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU
TDDI02 Programmeringsprojekt. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU På denna föreläsning: Verifikation, Validering och Testning XP Extreme Programming Vad är ett fel? I engelskan
Läs merProjekt Rapport. RaidPlanner. Jeanette Karlsson UD10
Projekt Rapport RaidPlanner Jeanette Karlsson UD10 Abstrakt: Denna rapport handlar om mitt projekt i kursen Individuellt Mjukvaruutvecklings projekt. Rapporten kommer att ta upp hur jag gått tillväga,
Läs merProj-Iteration1. Arkitektur alt. 1
Proj-Iteration1 PVG/Coaching Boris Magnusson Datavetenskap LTH Proj-Iter1-1 Registrering Registrering Arkitektur alt. 1 Personuppgifter Starttid Sorterare Måltid Efterbehandling Resultat Tre program som
Läs merPreliminär specifikation av projekt
Preliminär specifikation av projekt Projektets namn: Infraröd Minneslåda (numera omdöpt till FastSync) Uppdragsgivare: Alex Olwal aolwal@cs.columbia.edu Deltagare: Johan Ullberg Nils
Läs merGrafiska användargränssnitt i Java
jonas.kvarnstrom@liu.se 2017 Grafiska användargränssnitt i Java En genomgång av de viktigaste begreppen Alternativ 2 Från början fanns AWT, Abstract Window Toolkit Till stor del ersatt av Swing: Mer omfattande,
Läs merÖversikt. Installation av EasyPHP 1. Ladda ner från http://www.easyphp.org/ Jag använder Release 5.3.4.0 2. Installera EasyPHP.
Laboration 1 Översikt 1. Att komma igång med laborationsmiljön a. installera Aptana Studio 3 b. Installera EasyPHP 2. Testa lite programmering a. Testa enkla uppgifter b. Testa automatiskt 3. Skapa inloggningsformulär
Läs merKristoffer Eriksson Christer Oscarsson Andreas Dahlberg Martin Bengtsson
Rapport grupp 4 Software Engineering Kristoffer Eriksson Christer Oscarsson Andreas Dahlberg Martin Bengtsson 2009-10-29 Processer Sprinter Scrum har varit till stor hjälp för oss för att nå våra mål,
Läs merTestplan Cykelgarage
Testplan Cykelgarage Stefan Johansson D08 (dt08sj7@student.lth.se) Johan Anderholm D08 (dt08ja5@student.lth.se) Angelica Gabasio D08 (dt08ag8@student.lth.se) Marcus Carlberg D08 (dt08mc4@student.lth.se)
Läs merV!cto. Att tjäna pengar genom bättre testning med
Att tjäna pengar genom testning med Att tjäna pengar genom testning med 1 (50) Det finns tre vägar till test: 1: Testautomati- Att bygga sering Att bygga Att bygga Att bygga Att bygga Att bygga Att bygga
Läs merObjektorienterad programmering med Java Swing: Händelser, lyssnare och applets
GUI (forts) Objektorienterad programmering med Java Swing: Händelser, lyssnare och applets Sven-Olof Nyström Uppsala Universitet 18 mars 2005 Skansholm: Kapitel 6 Användaren kan kommunicera med programmet
Läs merProj-Iteration 5B. Plan för återstående iterationer
Proj-Iteration 5B PVG/Coaching Boris Magnusson Datavetenskap LTH PVG/Coach 2009. Proj-Iter5B : 1 Plan för återstående iterationer Förutom att arbeta vidare på stories skall release göras både under iteration
Läs merAlla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php
Introlektion PHP är ett av de enklare språken att lära sig just pga. dess dynamiska struktur. Det används för att bygga upp båda stora och mindre system. Några vanliga system som använder sig av PHP är
Läs merCreo Customization. Lars Björs 2014-10-16
Creo Customization Lars Björs 2014-10-16 Norra Europas största partner och återförsäljare av PTC relaterad programvara (Windchill, Creo, Arbortext, MathCad, Relex) 70 anställda Egen utvecklingsavdelning
Läs merTUTORIAL: SAMLING & KONSOLL
TUTORIAL: SAMLING & KONSOLL Denna tutorial är en fortsättning på den tutorial där vi skapade klassen Car och sedan objekt av denna klass. Vi skall nu lära oss att lagra dessa objekt i en samling och även
Läs merModel View Controller. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016
Model View Controller Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Model View Controller Model View Controller (MVC) är ett design pattern (architectural pattern) som är väldigt
Läs merVersionshantering. 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
Läs merInstallationsbeskrivning för CAB Service Platform med CABInstall
Installationsbeskrivning för CAB Service Platform med CABInstall INLEDNING... 2 INSTALLATION... 3 AVANCERAD INSTALLATION... 10 YTTERLIGARE INFORMATION... 11 Proxy... 11 Sida 1 av 12 Inledning Denna beskrivning
Läs merSlutrapport Get it going contracts
Slutrapport Get it going contracts Författare: Anthony Dry Datum: 2011-06-02 Program: Utvecklare av digitala tjänster Kurs: Individuellt mjukvaruutvecklingsprojekt 7.5p Linnéuniversitetet (Kalmar) Abstrakt
Läs merBeskrivning av gesällprov RMI Chat Mikael Rydmark
Beskrivning av gesällprov RMI Chat Mikael Rydmark rydmark@kth.se Mikael Rydmark 1(8) 12-06-06 Innehållsförteckning Inledning...3 Server...3 Klient... 3 Ansluta till servern...3 Huvudchat...4 Privat kommunikation...5
Läs meremopluppen Användning av "Ant" Niklas Backlund Version: 1.4 ( 2002/04/26 07:27:52 UTC)
emopluppen Användning av "Ant" Version: 1.4 ( 2002/04/26 07:27:52 UTC) Niklas Backlund Sammanfattning Det här dokumentet handlar om programmet Ant, som är en byggmiljö för programutvecklingsprojekt. Dess
Läs merIntroduktion till programmering med hjälp av Lego Mindstorm
Kungliga Tekniska Högskolan Introduktion till programmering med hjälp av Lego Mindstorm Laborationsrapport gällande programmering inom NXC Simon Jansson 31 08 2014 simonjan@kth.se Introduktionskurs i datateknik
Läs merGränssnitt för FakeGranska. Lars Mattsson
Gränssnitt för FakeGranska av Lars Mattsson (larsmatt@kth.se) Innehållsförteckning 1 Introduktion...3 2 Genomförande:...3 3 Användning...5 4 Kända buggar:...6 5 Källförteckning...6 2 1 Introduktion Taken
Läs merEDAA01 Programmeringsteknik - fördjupningskurs
EDAA01 Programmeringsteknik - fördjupningskurs Läsperiod lp 1+2 (Ges även lp 3) 7.5 hp anna.axelsson@cs.lth.se sandra.nilsson@cs.lth.se http://cs.lth.se/edaa01ht Förkunskapskrav: Godkänd på obligatoriska
Läs merGrafiska användargränssnitt i Java
TDDD78, TDDE30, 729A85 jonas.kvarnstrom@liu.se 2018 Grafiska användargränssnitt i Java En genomgång av de viktigaste begreppen Alternativ 2 Från början fanns AWT, Abstract Window Toolkit Stora delar har
Läs merVad utmärker ett bra användargränssnitt?
Vad utmärker ett bra användargränssnitt? Att kommunicera med användarna Feedback och Pliancy Excise kontra Flow GUI = Graphic User Interface GUI = Graphic User Interface GUIn, eller grafiska gränssnitt
Läs merWindows Forms Winstrand Development
2013-01-23 1 Winstrand Development Användargränssnitt Hittills har vi skapat program för kommandoraden. Den bakomliggande koden fungerar som den ska, men vi upptäcker snabbt att programmen är begränsade
Läs merAgil testning i SCRUM
Agil testning i SCRUM Petter Salomonsson Petter.salomonsson@addq.se Tel: 0708-398435 Kort presentation AddQ Consulting AB tydlig fokus på test och kvalitetssäkringstjänster erbjuder mycket erfarna konsulter
Läs merDesign och konstruktion av grafiska gränssnitt
Design och konstruktion av grafiska gränssnitt Armin Nezirevic Peter Börjesson Interaktionsdesign Tillämpad informationsteknologi Chalmers/GU Idag Vad utmärker ett bra användargränssnitt? Kort kursinfo
Läs merJava: Utvecklingsverktyg, datatyper, kontrollstrukturer
Java: Utvecklingsverktyg, datatyper, kontrollstrukturer Sven-Olof Nyström Uppsala Universitet 13 juni 2005 1 Utvecklingsverktyg för Java Vi rekommenderar Suns utvecklingsverktyg (SDK, tidigare JDK), se
Läs merSNABBGUIDE för studenter windows. Utskriftshantering, Kopiering och Scanning
SNABBGUIDE för studenter windows Utskriftshantering, Kopiering och Scanning Installation av klient på din privata dator Installation av klient För att kommunicera med utskriftssystemet behöver varje dator
Läs merDate Version Description Author. 1 Introduktion s Översikt av Vårdguiden 1.2 Syfte och Omfattning Inkluderat
Slutrapport Vårdguiden SR.Vg_v.1.0 Date Version Description Author 2017-03-17 1.0 Slutrapport gällande för TP.Vg_v.1.0, TS.Vg_v.1.0, TR.Vg_V.1.0 och AvR.Vg_v.1.0 Lisa Millhus Innehåll 1 Introduktion s.2
Läs merRegressionstestning teori och praktik
Regressionstestning teori och praktik Lic. Emelie Engström emelie.engstrom@cs.lth.se Software Engineering Research Group LUND UNIVERSITY Sweden SWELL the Swedish Research School in Software Verification
Läs merMina listor. En Android-applikation. Rickard Karlsson 2013-06-09. Rickard Karlsson - rk222cu Linnéuniversitet rk222cu@student.lnu.
Mina listor En Android-applikation Rickard Karlsson 2013-06-09 Rickard Karlsson - rk222cu Linnéuniversitet rk222cu@student.lnu.se Innehållsförteckning 2. Innehållsförteckning 3. Abstrakt 4. Inledning/bakgrund
Läs merMetoder och verktyg för funktionssäkerhet
Metoder och verktyg för funktionssäkerhet Projektstart 1. Hantera kraven En bra process är grunden för att hantera kraven i ett säkerhetsprojekt. Det krävs att du har en tydlig spårbarhet mellan krav och
Läs merInstruktion för användande av Citrix MetaFrame
Instruktion för användande av Citrix MetaFrame Öppna valfri browser, helst Google Chrome eller annan modern browser. Firefox, Safari, MS Edge, IE osv fungerar också men Internet Explorer är dock inget
Läs merAnvändning av testautomation inom Extendas utvecklingsorganisation
Testautomation Användning av testautomation inom Extendas utvecklingsorganisation Agenda Presentation av Extenda Vad är en POS? Test av POS Automatiska tester Sammanfattning 2 Kort historik 1982 Extenda
Läs mer725G61 - 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
Läs merPMM (Process Maturity Metrics) Allmänt. Mätetal för framgångsfaktorer. 1. CM konfigurationsstyrning
PMM (Process Maturity Metrics) PMM är en metod för att mäta processmognad i utvecklingsprojekt. I korthet går metoden ut på att man utvärderar sin utvecklingsprocess med avseende på ett antal framgångsfaktorer
Läs merObjektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015
Objektorienterad Programkonstruktion Föreläsning 3 9 nov 2015 Kursnämnd Namn kommer... UML: Klassdiagram UML: Relationer Ärver från superklass Implementerar gränssnitt Dubbelriktad eller oriktad relation
Läs merDigitalt lärande och programmering i klassrummet
Stockholm 2018-02-14 14 februari 2018 Digitalt lärande och programmering i klassrummet Programmera i Python med micro:bit Introduktion I förra lektionen gick vi igenom grunderna i hur man programmerar
Läs merStartmeny i Windows 8
Så trollar du fram en Startmeny i Windows 8 7 5 smarta verktyg 7 Gratis och enkelt 7 Ger Windows helt nya funktioner. 5 program som fixar en riktig Startmeny i Windows 8 Saknar du Startmenyn i Windows
Läs merTestautomatisering. 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:
Läs merDagbok Mikael Lyck 810717-0071
Dagbok Mikael Lyck 810717-0071 2/6 Slutredovisning, redovisningen gick bra vi hade ju redan byggt ihop spelet så vi var inte särskilt oroliga. Allt som allt är jag väldigt nöjd med slutprodukten. 11/5
Läs merPraktikum i programvaruproduktion
Praktikum i programvaruproduktion Introduktion Föreläsare/Ansvarig: Pontus Boström Email:pontus.bostrom@abo.fi Rum A5055 Assistent: Petter Sandvik Email: petter.sandvik@abo.fi Rum: A5048 Föreläsningar:
Läs mer[SLUTRAPPORT: DRAWPIXLZ (ANDROID-APP)] Slutrapport. Författare: Zlatko Ladan. Program: Utvecklare av Digitala Tjänster 180P
Slutrapport Författare: Zlatko Ladan Program: Utvecklare av Digitala Tjänster 180P Kurs: Individuellt Mjukvaruprojekt Z l a t k o L a d a n Sida 1 Abstrakt: Denna rapport handlar om mitt projekt som jag
Läs merLNU INDIVIDUELLT MJUKVARUUTVECKLINGSPROJEKT. Honey Hunter. Androidspel. Martin Karlsson 1/17/2014
LNU INDIVIDUELLT MJUKVARUUTVECKLINGSPROJEKT Honey Hunter Androidspel Martin Karlsson 1/17/2014 Abstrakt: Denna slutrapport berör androidspelet Honey Hunter som berör kursen Indiviudellt Mjukvaruutvecklingsprojekt
Läs merEclipse. Avsikt. Nu ska ett fönster liknande figuren till höger synas.
Eclipse Avsikt Att bekanta dig med Eclipse programmeringsmiljö, dvs att med hjälp av Eclipse 1. skapa ett nytt projekt 2. skriva in källkod (sparas som.java-fil) 3. kompilera (översätta) koden till byte-kod
Läs merCalligra. En allmän inledning. Raphael Langerhorst Jost Schenck Översättare: Stefan Asserhäll
En allmän inledning Raphael Langerhorst Jost Schenck Översättare: Stefan Asserhäll 2 Innehåll 1 Inledning 5 1.1 Komponenter i Calligra.................................. 5 1.2 Översikt över funktioner i
Läs merVersion 1.0. 2013-02-13 Testteam 4 Testledare: Patrik Bäck
Version 1.0-2013-02-13 Testteam 4 Testledare: Patrik Bäck 0 Sammanfattning Testplanen är utarbetad som ett svar på Konsumentverkets förfrågningsunderlag avseende upphandling av ett nytt budget- och skuldsaneringssystem,
Läs merVanliga frågor för VoiceXpress
Vanliga frågor för VoiceXpress 1) Hur stort ordförråd (vokabulär) innehåller VoiceXpress? VoiceXpress innehåller ett mycket omfattande ordförråd, och svaret på frågan varierar en aning beroende på hur
Läs merA ToolGuide for Eclipse: En fördjupning i några av verktygen i Eclipse och hur de underlättar XP s practices
A ToolGuide for Eclipse: En fördjupning i några av verktygen i Eclipse och hur de underlättar XP s practices Mattias Jarheden och Thomas Forsström Sammanfattning Denna djupstudie försöker ge en inblick
Läs merAutomatisk generering av enhetstester
Automatisk generering av enhetstester Av Christoffer Stengren 05/03-2013 Innehållsförteckning Abstrakt...3 1. Introduktion...3 2. PVG projekt:...4 3. Vad finns det för verktyg?...4 4.Hur fungerar verktygen?...4
Läs merWebservice & ERP-Integration Rapport
Webservice & ERP-Integration Rapport Hardwood AB Mustafa Lazem 930916-9713 Jonas Ahrne 920325-0379 Hasan Nerjovaj 940130-7195 Stefan Liden 920628-0639 2014-05-18 Innehåll Bakgrund... 2 Syfte... 2 Projektbeskrivning...
Läs merProgrammering i C++ Kompilering från kommandoraden
Programmering i C++ Kompilering från kommandoraden Sven Gestegård Robertz Datavetenskap, LTH 9 november 2015 Sammanfattning Ibland vill man, av olika anledningar, inte använda en stor integrerad utvecklingsmiljö
Läs merProj-Iteration 3. Grov plan för releaser
Proj-Iteration 3 PVG/Coaching Boris Magnusson Datavetenskap LTH Proj-Iter3-1 Grov plan för releaser Kunden är mycket nöjd med första releasen som visar att stora framsteg gjorts med implementationsarbetet.
Läs merKUNGLIGA TEKNISKA HÖGSKOLAN. Laboration II1310. Programmera Lego Mindstorm robot i NXC
KUNGLIGA TEKNISKA HÖGSKOLAN Laboration II1310 Programmera Lego Mindstorm robot i NXC Johnny Vu 120904 Jvu@kth.se Introduktionskurs i datateknik II1310 Sammanfattning Vi har genomfört en laboration för
Läs merCTM Release Notes 7.5.4
CTM Release Notes 7.5.4 Page 1 of 13 1 CTM RELEASE NOTES 7.5.4... 3 1.1 SKICKA TILLDELNINGSMEDDELANDE I UPPHANDLING... 3 1.2 ELEKTRONISK SIGNERING AV AVTAL... 4 1.2.1 STEG FÖR STEG INSTRUKTIONER... 4 1.3
Läs merArv. 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
Läs merPROGRAMMERING I NXC. Sammanfattning KUNGLIGA TEKNISKA HÖGSKOLAN
KUNGLIGA TEKNISKA HÖGSKOLAN PROGRAMMERING I NXC Namn: Michel Bitar 2012-08- 25 E- post: mbitar@kth.se Introduktionskurs i datateknik, II1310 Sammanfattning Intressant och lärorik laboration om att programmera
Läs merProgrammering A C# VT 2010. Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson 2010 02 08
Programmering A C# VT 2010 Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson 2010 02 08 Innehåll Hjälp och referenser... 3 Kap 1 Introduktion... 3 Steg för steg... 3 Kapitel 2 Variabler...
Läs merTestning av applikationer
Tentamen, (20 YH-poäng) Plats: Övningstenta Tid: Övningstenta Tillåtna hjälpmedel: Papper, penna, suddgummi, linjal. Ej tillåtna hjälpmedel: Datorer, mobiltelefoner, surfplattor, miniräknare, böcker, anteckningar,
Läs merIntroduktionsmöte Innehåll
Introduktionsmöte Innehåll Introduktion till kursen Kursens mål och innehåll Undervisning Datavetenskap (LTH) Introduktionsmöte ST 2019 1 / 14 EDAA01 Programmeringsteknik - fördjupningskurs Ingen sommarkurs
Läs merSLUTRAPPORT RUNE TENNESMED WEBBSHOP
SLUTRAPPORT RUNE TENNESMED WEBBSHOP -05-30 Abstrakt Under 10 veckor har jag och Oskar Norling arbetat med att ta fram en webbshop-applikation till företaget Rune Tennesmed i Kalmar. I denna rapport tänker
Läs merwww.drakbutiken.se IDE USB kabel Windows XP, Vista 7 löäzxcvbnmqwertyuiopåasdfghjklöäz [Version 1.4, 2009-11-01] www.drakbutiken.
qwertyuiopåasdfghjklöäzxcvbnmqwe rtyuiopåasdfghjklöäzxcvbnmqwertyu iopåasdfghjklöäzxcvbnmqwertyuiopå asdfghjklöäzxcvbnmqwertyuiopåasdf ghjklöäzxcvbnmqwertyuiopåasdfghjk www.drakbutiken.se IDE USB kabel
Läs merInstallation av M7005 och till M7005 hörande serverprogram
150607/150716/151005/SJn Installation av M7005 och till M7005 hörande serverprogram samt Anpassning av M7005:s utseende Installation och anpassning av M7005 sida 1 (18) Innehåll 1 M7005:s hemsida är M7005.Metem.se...
Läs merFörfattare: Juha Söderqvist IT-GUI. Version 1.0. Datum
Författare: Juha Söderqvist IT-GUI Version 1.0 Datum 2017-08-18 Innehåll 1. Introduktion... 3 Human-computer interaction... 3 Grafiska användargränssnitt... 4 Operativsystem... 4 Xerox Alto Executive file
Läs merQuickstart manual. Rev SHTOOL Quickstart manual Smart-House
Quickstart manual Rev. 2.3 2017-09-14 SHTOOL 6.5.33 1 Innehåll 1 FÖRORD... 3 2 PROGRAMVARA... 4 2.1 Hämta programvara... 4 2.2 PC krav... 4 3 DOKUMENTATION... 5 3.1 Manualer... 5 3.2 Projektdokumentation...
Läs merObjektorienterad programmering
Objektorienterad programmering Emil Ahlqvist (c10eat@cs.umu.se) Didrik Püschel (dv11dpl@cs.umu.se) Johan Hammarström (c08jhm@cs.umu.se) Hannes Frimmel Moström (c10hml@cs.umu.se) 1 1. Introduktion 1.1 Objektorienterad
Läs merSimon Boström Introduktionskurs i Datateknik
KTH KISTA Linefollower Med parprogrammering i NXC Simon Boström 2014-09-04 simbos@kth.se Introduktionskurs i Datateknik Sammanfattning Laborationstillfället var till för att man som ny på KTH skulle lära
Läs merPROJEKTRAPPORT EDA095 NÄTVERKSPROGRAMMERI
PROJEKTRAPPORT EDA095 NÄTVERKSPROGRAMMERI NG STRESS LUNDS TEKNISKA HÖGSKOLA - 2013-05-22 Projektmedlemmar: Emil Apelgren adi10eap@student.lu.se Fredrik Helander gda10fhe@student.lu.se Jonathan Klingberg
Läs mer12 principer of agile practice (rörlig)
X-treme programming 12 principer of agile practice (rörlig) Ge nöjd kund genom tidig och kontinuerliga leveranser Den viktigaste punkten som betyder att min vill ha kontinuerlig feedback Välkomna sena
Läs mer2014-2015 Alla rättigheter till materialet reserverade Easec
1 2 Innehåll Introduktion... 4 Standarder... 5 Översikt: Standarder... 6 1058.1-1987 IEEE Standard för Software Project Management Plans... 7 Ingående dokument... 8 Syfte och struktur... 9 ITIL... 10 ITIL
Läs merJUnit. 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
Läs merKopiering av objekt i Java
1 (6) Kopiering av objekt i Java Först När du läser detta papper bör du samtidigt studera dokumentationen för klasserna Object, Cloneable (java.lang) och ArrayList (java.util). Mycket blir klarare genom
Läs merKrav: * Filen MpUpdate.exe får inte köras när du startar denna uppdatering.
Uppdatera Mobilus Professional till version 2.0.1 Krav: * Filen MpUpdate.exe får inte köras när du startar denna uppdatering. * Filen MP.exe (Mobilus programmet) får inte användas* under tiden uppdateringen
Läs merVerktyg och Utvecklingsmiljö. Jochim von Hacht
Verktyg och Utvecklingsmiljö Jochim von Hacht Verktyg Modern programutveckling innebär att man måste behärska ett antal verktyg Editorer Kompilatorer Avlusare (debugger) Versionhantering (kommer i projektkurs)
Läs merUppgift v1: Teststrategi i sammanhang Terese Berger. Teststrategi. Projekt CiviCRM. Version 0.9. Sida 1(7)
Teststrategi Projekt CiviCRM Version 0.9 Sida 1(7) Innehållsförteckning Referenser...2 Revisioner...2 1. Inledning...3 1.1 Uppgift...3 1.2 Bakgrund...3 1.3 Organisation...4 1.4 Granskning och godkännande...4
Läs mer1. (3p) Inom MDI-området framhåller man att människor lär sig via metaforer. Hur menar man att detta går till?
1. (3p) Inom MDI-området framhåller man att människor lär sig via metaforer. Hur menar man att detta går till? Att lära sig via metaforer innebär att man drar nytta av kunskap som användaren redan har,
Läs merQuick start manual. Smart-House 2015-04-20. Rev 1.1
Quick start manual Smart-House 2015-04-20 Rev 1.1 Innehåll Förord... 3 Programvara... 4 Hämta programvara... 4 PC krav... 4 Dokumentation... 5 Manualer... 5 Projektdokumentation... 5 Smart-Dupline... 5
Läs merInstallationsguide ELCAD 7.10
Installationsguide ELCAD 7.10 Innehållsförteckning Inledning... 2 Installation av ELCAD 7.10... 2 Viktiga nyheter om installationen... 2 Före installationen... 2 Ladda hem internationell version... 2 Ladda
Läs merAgil programutveckling
Agil programutveckling Pontus Evertsson D00, Lunds Tekniska Högskola d00pe@efd.lth.se Anna Jennerheim D00, Lunds Tekniska Högskola d00aj@efd.lth.se 2003-05-15 1 1. Inledning 3 2. Extreme Programming (XP)
Läs merManuell installation av SQL Server 2008 R2 Express för SSF Timing
Manuell installation av SQL Server 2008 R2 Express för SSF Timing Innehåll 1. Metoder att installera...1 2. Förutsättningar...2 DotNet Framework 3.5...2 MSI Installer 4.5...2 3. Hämta SQL Server 2008 R2
Läs merQuick start manual. Smart-House 2015-11-04. Rev 2.0
Quick start manual Smart-House 2015-11-04 Rev 2.0 Innehåll Förord... 3 Programvara... 4 Hämta programvara... 4 PC krav... 4 Dokumentation... 5 Manualer... 5 Projektdokumentation... 5 Smart-Dupline... 6
Läs merTherese Hansson & Magnus Jonsson. Motivationsfaktorer - Test inom Agila utvecklingsprojekt
Motivationsfaktorer - Test inom Agila utvecklingsprojekt Magnus Jonsson & Therese Hansson Flerårig erfarenhet från ett globalt utvecklingsprojekt där vi införde Agile & Scrum metodik i hela organisationen
Läs merConfiguration testing Why? Vad det är tänkt att koden ska göra. Performance testing Kommentarer Skriva om koden som kommentar
Skapa testfall Testing Köra testen Hitta fel Inspections and reviews Verifiera resultatet Formal methods Static analysis Completeness Verifiering Kvalitet Maintainability Validering Traceability Fault
Läs merSlutrapport YUNSIT.se Portfolio/blogg
Slutrapport YUNSIT.se Portfolio/blogg RICKARD HANSSON 2012-06-04 Abstrakt Rapporten du har i din hand kommer handla om mitt projektarbete som jag genomfört under tio veckor för utbildningen Utvecklare
Läs merRune Tennesmed. Oskar Norling 1DV430. Individuellt Mjukvaruutvecklingsprojekt 1DV430 Webbprogrammerare H12 Oskar Norling
Rune Tennesmed Oskar Norling Individuellt Mjukvaruutvecklingsprojekt Webbprogrammerare H12 Oskar Norling 2012-05-30 Abstrakt Denna rapport handlar om mitt mjukvaruutecklingsprojekt som jag och en klasskompis
Läs merWindows 8.1, hur gör jag?
2014 Windows 8.1, hur gör jag? Tor Stenberg Piteå Kommun 2014-03-28 1 av 13 Innehåll Hur jobbar jag med Windows 8.1... 2 Logga in... 2 Skrivbordet och programportal... 2 Logga ut och stänga datorn... 3
Läs merRobotar i NXc. En laboration med Mindstormrobotar. Sammanfattning KUNGLIGA TEKNISKA HÖGSKOLAN
KUNGLIGA TEKNISKA HÖGSKOLAN Robotar i NXc En laboration med Mindstormrobotar Anton Gyllenhammar 7/30/12 antongy@kth.se II1310 Introduktionskurs i datateknik Sammanfattning Denna rapport beskriver NXc-
Läs mer