06.08.2013 Views

Analysverktyg för kod och test - Lunds Tekniska Högskola

Analysverktyg för kod och test - Lunds Tekniska Högskola

Analysverktyg för kod och test - Lunds Tekniska Högskola

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Analysverktyg</strong> <strong>för</strong><br />

<strong>kod</strong> <strong>och</strong> <strong>test</strong><br />

EDA270 Coaching<br />

Emil Einarsson<br />

dt07ee3<br />

2012-02-27


Abstract<br />

Undertiden som man utvecklar programvara vill man på ett eller annat sätt kunna säga på<br />

ett så enkelt sätt som möjligt att det man gjort funkar. Detta brukar man många gånger göra<br />

med hjälp utav <strong>test</strong>er i olika former. För att underlätta <strong>test</strong>skrivandet <strong>och</strong> granskningen utav<br />

den <strong>kod</strong> som blivit implementerad så brukar man använda sig utav någon form av<br />

analysverktyg som kan presentera olika sorters data beroende på vad det är <strong>för</strong> sorts verktyg<br />

<strong>och</strong> vad det är användaren önskar sig få fram. Denna studie fokuserar på analysverktyg <strong>för</strong><br />

<strong>test</strong>fall <strong>och</strong> där<strong>för</strong> används ett specifikt program, EclEmma [3], som en del av en empirisk<br />

studie.<br />

1. Inledning<br />

I dagens samhälle finns det programvara inuti i princip allt elektroniskt som existerar.<br />

Samtidigt som andelen elektronik med programvara ökar så ökar även komplexiteten utav<br />

programvaran <strong>för</strong> dessa elektroniska apparater (tänk bara på hur mycket mobiltelefonerna<br />

har utvecklats under de senare åren). Detta innebär att det blir svårare <strong>och</strong> svårare att på ett<br />

enkelt sätt kunna säga att systemet fungerar som tänkt <strong>och</strong> det blir svårt att se om man<br />

<strong>för</strong>stört gammal funktionalitet under vidareutveckling av en produkt. För att hjälpa till med<br />

detta skriver man olika former utav <strong>test</strong>er, men att kunna skriva bra <strong>test</strong>fall som täcker in<br />

alla krav som ställs på systemet så att man samtidigt håller koll på gammal funktionalitet<br />

under utvecklingen av ny är svårt <strong>och</strong> kräver en hel del kunskap. Oberoende på om man<br />

anser sig ha den rätta kunskapen eller inte <strong>för</strong> att skriva bra <strong>test</strong>fall så måste man ställa sig<br />

frågan: ”Vet jag att de <strong>test</strong>er som görs på systemet verkligen <strong>test</strong>ar all <strong>kod</strong> <strong>och</strong> innesluter alla<br />

möjliga scenarion som kan inträffa?”. Detta <strong>för</strong> oss in på ämnet <strong>för</strong> denna djupstudie,<br />

nämligen analysverktyg.<br />

Den här artikeln är framtagen som en del i kursen ”Coaching av programvaruteam” vid <strong>Lunds</strong><br />

tekniska högskola <strong>och</strong> är tänkt att ge en djupare <strong>för</strong>ståelse <strong>för</strong> analysverktyg, hur man väljer<br />

rätt <strong>och</strong> hur man använder det på bästa sätt. I bakgrunden till alla åtaganden <strong>och</strong> slutsatser<br />

inom <strong>kod</strong>ning så kommer programmeringsspråket java att vara det enda språket i åtanke.<br />

Detta <strong>för</strong> att det är det språket som använts i kursen <strong>och</strong> det känns där<strong>för</strong> mest logiskt att<br />

utgå från det.<br />

2. Bakgrund<br />

När man <strong>test</strong>ar system så brukar man tala om två olika sätt att <strong>test</strong>a, nämligen ”black-box<br />

<strong>test</strong>ning” <strong>och</strong> ”white-box <strong>test</strong>ning” [2]. Black-box innebär att man inte vet något om hur<br />

systemet är implementerat <strong>och</strong> utformar <strong>test</strong>er <strong>för</strong> att se att systemet ut<strong>för</strong> det man vill att<br />

det ska göra (typiskt exempel är användarscenarion). White-box däremot innebär att man<br />

har tillgång till hur systemet är implementerat <strong>och</strong> <strong>test</strong>erna utformas <strong>för</strong> att se att alla<br />

metodanrop <strong>och</strong> liknande ger de resultat som man <strong>för</strong>väntar sig (typiskt vad som ut<strong>för</strong>s<br />

2


under utvecklingen <strong>för</strong> att styrka att systemet fungerar). I denna artikel kommer vi endast<br />

diskutera white-box <strong>test</strong>ning.<br />

För att undersöka hur <strong>test</strong>ningen på ett system påverkas med hjälp av analysverktyg har en<br />

undersökning gjorts under ett projekt som jag har varit coach <strong>för</strong>. Kursen som jag läste heter<br />

”Coaching av programvaruteam” <strong>och</strong> ges som en valfri kurs det fjärde eller femte året på<br />

civilingenjörsprogrammet <strong>för</strong> datateknik på <strong>Lunds</strong> <strong>Tekniska</strong> <strong>Högskola</strong> (LTH) <strong>och</strong> går ut på att<br />

man ska lära sig hur man coachar ett utvecklingsteam både i teorin <strong>och</strong> i praktiken.<br />

I samband med att det var en praktisk del i kursen så gick även en annan kurs parallellt med<br />

denna som heter ”Programvaruutveckling i grupp”, eller kort pvg, som istället går ut på att<br />

lära sig jobba i små team på 8 – 10pers <strong>och</strong> utveckla en produkt enligt modellen <strong>för</strong> Extreme<br />

Programming (XP-modellen) [5]. Pvg-kursen ges andra året på datateknik på LTH så man kan<br />

redan <strong>för</strong>utsätta att ev. <strong>kod</strong>vana bland deltagarna är relativt låg. Systemet som skulle<br />

implementeras var ett system <strong>för</strong> att hantera tidtagning <strong>och</strong> resultatberäkningar <strong>för</strong> lopp<br />

inom sporten enduro. Projektet var uppdelat i sex iterationer där varje iteration var en<br />

långlabb (klockan 08.15 – 17.00) varje måndag plus ett planeringsmöte på två timmar varje<br />

vecka.<br />

Projektet gick som sagt ut på att använda XP-modell <strong>och</strong> därigenom TDD (Test Driven<br />

Development) vilket betyder <strong>för</strong>enklat att man skriver <strong>test</strong>en <strong>för</strong> något man ska<br />

implementera <strong>för</strong>st <strong>och</strong> sedan skriver man den faktiska <strong>kod</strong>en <strong>och</strong> ser att <strong>test</strong>erna går<br />

igenom. Det är främst av denna anledning som det kändes naturligt att in<strong>för</strong>a en studie över<br />

hur arbetet påverkades i projektet med <strong>och</strong> utan ett analysverktyg. Där<strong>för</strong> fick gruppen som<br />

jag coachade <strong>för</strong>st arbeta utan hjälp utav något analysverktyg <strong>och</strong> <strong>för</strong> att under iteration 3<br />

(tredje långlabben) in<strong>för</strong>a ett analysverktyg <strong>och</strong> kolla på skillnaderna i hur mycket <strong>kod</strong> man<br />

<strong>test</strong>ade <strong>och</strong> hur bra den <strong>test</strong>ades.<br />

2.1 <strong>Analysverktyg</strong>et<br />

Det verktyg som användes vid undersökningen till denna artikel var en instickningsmodul till<br />

utvecklingsmiljön Eclipse som heter EclEmma [3]. Instickningsmodulen har två olika<br />

funktioner, dels kan man köra det på alla <strong>test</strong>er <strong>och</strong> då få fram hur stor andel av <strong>kod</strong>en som<br />

exekveras av de <strong>test</strong>fall som är skrivna. Det andra sättet är att starta instickningsmodulen i<br />

samband med att man vill köra systemet <strong>och</strong> <strong>test</strong>a det manuellt, EclEmma lagrar då vilka<br />

rader <strong>kod</strong> som man exekverar under tiden som systemet körs. När man sedan stänger ner<br />

programmet presenterar instickningsmodulen data över hur stor andel utav <strong>kod</strong>en som<br />

exekverades vid användningen. Det är främst det <strong>för</strong>sta användningssättet som är intressant<br />

i denna artikel, främst <strong>för</strong> dess enkelhet <strong>och</strong> <strong>för</strong> att det är den delen av instickningsmodulen<br />

funktionalitet som används när man arbetar med TDD.<br />

EclEmma valdes främst av den anledningen att jag använt mig av den instickningsmodulen<br />

tidigare <strong>och</strong> kände därigenom till den <strong>och</strong> visste hur den fungerade. Rent teoretiskt sätt så<br />

skulle man kunna tänka sig att det skulle vara relativt enkelt att lära sig ett annat<br />

analysverktyg, men på grund av tidsbrist <strong>och</strong> annat som kommit i vägen blev det endast<br />

3


EclEmma som kördes, så någon djupare analys mellan verktygen kommer inte tas upp i<br />

denna artikel. Några exempel på andra verktyg som också <strong>test</strong>ar code coverage är Clover,<br />

JTest, Agitar <strong>och</strong> Cobertura [2].<br />

3. <strong>Analysverktyg</strong><br />

<strong>Analysverktyg</strong> är olika former utav verktyg som man använder <strong>för</strong> att analysera det system<br />

som man utvecklar. På vilket sätt verktyget analyserar <strong>och</strong> vad den presenterar <strong>för</strong><br />

användaren är helt beroende på vad det är <strong>för</strong> typ utav verktyg. Det finns relativt många olika<br />

sorters verktyg <strong>och</strong> alldeles <strong>för</strong> lite tid att gå in på alla, där<strong>för</strong> kommer vi främst kolla på<br />

analysverktyg <strong>för</strong> <strong>test</strong> <strong>och</strong> jäm<strong>för</strong>a det med några andra verktyg som kollar på te.x. ”bad<br />

smells in code” (ett uttryck som Fowler har myntat i sin artikel Refactoring: Improving the<br />

Design of Existing Code [6]).<br />

3.1 <strong>Analysverktyg</strong> <strong>för</strong> <strong>test</strong><br />

Med analysverktyg <strong>för</strong> <strong>test</strong> brukar man mäta hur stor andel av <strong>kod</strong>en som man <strong>test</strong>ar i<br />

procent <strong>och</strong> kalla det <strong>för</strong> ”code coverage”. Det finns många olika sätt att mäta andelen<br />

<strong>test</strong>ad <strong>kod</strong> <strong>och</strong> där<strong>för</strong> är det en viktig detalj att ta reda på <strong>för</strong> det analysverktyg som man<br />

tänker använda sig av. Det absolut vanligaste <strong>och</strong> enklaste är att verktyget kollar vilka rader<br />

<strong>kod</strong> som blir exekverad av <strong>test</strong>er <strong>och</strong> vilka som inte blir det, som tillsammans bildar andelen<br />

<strong>test</strong>ad <strong>kod</strong> (code coverage). Ett mer avancerat sätt att mäta andelen <strong>test</strong>ad <strong>kod</strong> är att<br />

använda sig av ”multiple condition coverage”, vilket innebär att alla logiska uttryck granskas<br />

så att de har blivit <strong>test</strong>ade <strong>för</strong> både sant <strong>och</strong> falskt [4]. Lägg dock märke till att condition<br />

coverage bara anser delar med logiska uttryck <strong>och</strong> inte annan <strong>kod</strong>, det vill säga den kommer<br />

inte köra igenom <strong>och</strong> kolla så att all <strong>kod</strong> är <strong>test</strong>ad, utan bara de logiska bitarna. Det är där<strong>för</strong><br />

vanligt att de båda kombineras i ett analysverktyg.<br />

Oberoende av hur verktyget tar fram andelen <strong>test</strong>ad <strong>kod</strong> så kommer det produceras ett<br />

resultat som presenteras <strong>för</strong> användaren. Med hjälp utav detta resultat kan man som<br />

utvecklare sedan skriva bättre <strong>test</strong>fall alternativt fler <strong>test</strong>fall där det behövs. Detta<br />

underlättar utvecklingsprocessen i den mening att man i ett tidigt skede kan upptäcka<br />

buggar (genom i detta fall inse vilken del av <strong>kod</strong>en som man aldrig <strong>test</strong>ar). Man bör dock se<br />

upp med informationen som verktyget ger <strong>och</strong> inte bara blint skriva <strong>test</strong>fall så att varenda<br />

rad blir uppfyllt eller så att alla logiska uttryck <strong>test</strong>as i alla möjliga kombinationer. Anser man<br />

som utvecklare att det inte finns något behov av att <strong>test</strong>a en specifik del av <strong>kod</strong>en så bör<br />

man inte göra det. Hur stor del <strong>test</strong>ad <strong>kod</strong> är inget som kunden i slutändan kommer bry sig<br />

om i vilket fall som helst, utan bara hur bra systemet fungerar <strong>och</strong> att det är utan några<br />

buggar.<br />

Man bör också tänka på att om ett analysverktyg kan hitta delar av <strong>kod</strong> som är dåligt <strong>test</strong>ad<br />

så är det också sannolikt att det finns delar som är svagt <strong>test</strong>ade på ett sätt som verktyget<br />

inte kan hitta [4]. Dessutom är analysverktyg <strong>för</strong> bland annat code coverage något som<br />

ensamt inte kan styrka att ett system alltid kommer att fungera, till exempel så innebär inte<br />

100 % code coverage att systemet kommer fungera till 100 % av gångerna.<br />

4


3.2 Andra analysverktyg<br />

Utöver verktyg <strong>för</strong> <strong>test</strong> finns det även andra sorters analysverktyg som kollar på andra saker i<br />

<strong>kod</strong>en. Ett bra exempel är verktyg som kollar efter så kallade ”bad smells in code”, <strong>kod</strong> som<br />

luktar illa, det vill säga <strong>kod</strong> som är fult implementerat <strong>och</strong> svår att <strong>för</strong>stå sig på. Ett exempel<br />

på ett sådant program är jCOSMO, som används <strong>för</strong> utvecklandet av artikeln ”Java Quality<br />

Assurance by Detecting Code Smells” [1]. Sådana verktyg har dock en skild problematik inom<br />

sig i <strong>för</strong>hållande till verktyg som <strong>test</strong>ar code coverage. Främst har vi problematiken att<br />

illaluktande <strong>kod</strong> främst är något subjektivt som kommer från erfarenheter <strong>och</strong> åsikter <strong>och</strong><br />

där<strong>för</strong> kommer i regel inte en person tycka att ett <strong>kod</strong>stycke ”luktar illa” som en annan<br />

person kanske tycker det gör. Vad som är tanken med den här sortens analysverktyg är att<br />

istället <strong>för</strong> att tala om <strong>för</strong> användaren att de här delarna har du inte <strong>test</strong>at, så ska<br />

användaren istället få upp ett resultat på delar som eventuellt kan vara dåligt skrivna<br />

<strong>och</strong>/eller som behöver refaktoriseras.<br />

Ett konkret exempel på hur man kan hitta olika typer av illaluktande <strong>kod</strong> med verktyget<br />

jCOSMO (som letar efter illaluktande <strong>kod</strong>) är med hjälp av instanceof[1]. Med instanceof<br />

menas att man kollar koncentrationen av instanceof operatorer i ett <strong>och</strong> samma <strong>kod</strong>block<br />

<strong>och</strong> om det är en väldigt hög koncentration så dras slutsatsen att det kan vara bra att in<strong>för</strong>a<br />

en arvs-hierarki eller att man bryter upp metoden i mindre metoder som får en uppgift<br />

istället <strong>för</strong> många.<br />

3.3 Behovet av analysverktyg<br />

Eftersom <strong>test</strong>ning används <strong>för</strong> att bestämma <strong>och</strong> <strong>för</strong>bättra kvaliteten på mjukvara är det en<br />

väldigt viktigt del i utvecklingen [1]. Det har även visat sig vara väldigt resurskrävande att<br />

utforma <strong>test</strong>er <strong>för</strong> systemen <strong>och</strong> kostnaderna har visat sig ligga upp över 50 % av de totala<br />

kostnaderna <strong>för</strong> ett systems utveckling [2]. Eftersom kostnaderna <strong>för</strong> <strong>test</strong>ning ligger så högt<br />

har man insett att verktyg är betydelsefulla <strong>för</strong> att göra denna process smidigare, mindre<br />

resurskrävande <strong>och</strong> i slutändan kan det vara verktyget som är avgörande om systemet blir<br />

färdigt till deadline. Kostnaderna kommer från att det tar ganska så lång tid att komma på<br />

bra <strong>test</strong> <strong>och</strong> när man väl ska uppfylla dem så kan det hända att man måste skriva någon form<br />

utav hjälpmetoder <strong>för</strong> att kunna <strong>test</strong>a specifika saker.<br />

När kostnaderna <strong>för</strong> <strong>test</strong>ningen är så höga har det även börjat utvecklas analysverktyg som<br />

genererar <strong>test</strong>fall utan att utvecklaren behöver skriva några från början. Detta är mer<br />

avancerade verktyg <strong>och</strong> om man inte har koll på vad det är <strong>för</strong> <strong>test</strong>fall som genereras så kan<br />

det göra att <strong>kod</strong>en inte <strong>test</strong>as på det sätt man tror. Utnyttjar man ett sådant verktyg får man<br />

lägga ner tid på att granska <strong>test</strong>fallen som genereras istället, men huruvida det tar längre tid<br />

att granska <strong>test</strong>fall eller att skriva dem själv från början är inget som kommer tas upp i denna<br />

artikel. Alternativet är att man låter systemet generera <strong>test</strong>fall <strong>och</strong> sedan kör dem <strong>och</strong> sparar<br />

undan resultatet <strong>för</strong> att få till regressions<strong>test</strong>ning. Efter att man gjort en ändring i <strong>kod</strong>en kan<br />

man kontrollera att systemet ger samma resultat <strong>för</strong> dessa <strong>test</strong>fall <strong>och</strong> samtidigt generera<br />

nya.<br />

5


3.4 Vad man vill uppnå<br />

Med användandet av analysverktyg vill man uppnå så hög code coverage som man bara kan,<br />

det vill säga så stor andel <strong>test</strong>ad <strong>kod</strong> som det bara är möjligt. Tillsammans med det följer<br />

även att man vill ha ett system som är så fritt från buggar som möjligt så tidigt i utvecklingen<br />

som möjligt. Detta <strong>för</strong> att hålla kostnaderna nere eftersom det i regel är billigare att rätta till<br />

ett fel innan systemet vuxit sig <strong>för</strong> stort eller efter att ett system har lanserats.<br />

Fastän man anser sig vara noga vid <strong>test</strong>ning <strong>och</strong> att allt ska vara <strong>test</strong>at så brukar man<br />

rimligtvis ha en code coverage på mellan 60% - 70%, vilket brukar vara acceptabelt eftersom<br />

det vanligtvis anses alldeles <strong>för</strong> resurskrävande att höja det över 60% [2]. Utöver detta vill<br />

man sänka kostnaderna <strong>för</strong> <strong>test</strong>ningsdelen av utvecklingen så att man kan leverera ett buggfritt<br />

system snabbare <strong>och</strong> därigenom till ett lägre pris.<br />

Snabbt <strong>och</strong> enkelt skulle man kunna säga att allt handlar om pengar (<strong>och</strong> då menar jag allt<br />

här i världen), utvecklingen ska kosta så lite som möjligt så att cheferna blir glada <strong>och</strong> kan<br />

sälja en produkt med så mycket vinst som möjligt samtidigt som kunden vill ha en produkt<br />

till ett så billigt pris som möjligt. Aldrig är det någon som blir nöjd heller, utan man strävar<br />

hela tiden efter att få eller skapa så mycket som möjligt <strong>för</strong> en så liten summa som möjligt.<br />

En fråga som du som läsare bör ställa dig är: Hur skulle utvecklingen inom analysverktyg,<br />

eller rent av all utveckling, se ut om det inte var effektivisering <strong>för</strong> att tjäna in pengar som<br />

drev den framåt? Vad skulle annars driva den framåt?<br />

3.5 Hur det kan gå fel<br />

Code coverage är inget allvetande svar som presenteras på hur man bör <strong>för</strong>bättra sina <strong>test</strong><br />

<strong>för</strong> att säkra att systemet är helt <strong>test</strong>at <strong>och</strong> funktionellt. Code Coverage talar bara om vilka<br />

rader <strong>kod</strong> som blivit exekverade av de <strong>test</strong> som finns <strong>och</strong> därigenom kan man inte göra<br />

antagandet att hög code coverage säger att systemet är <strong>test</strong>at <strong>för</strong> alla tänkbara scenarion.<br />

Samma sak inträffar om man implementerat funktionalitet på ett inkorrekt sätt <strong>och</strong> som<br />

man sedan dessutom <strong>test</strong>ar på fel sätt, då kommer hög code coverage inte alls säga något<br />

om hur funktionellt <strong>och</strong> stabilt systemet är. Om man är duktig på att skriva bra <strong>test</strong>fall <strong>och</strong> är<br />

noggrann med vad man sysslar med så borde det dock inte kunna inträffa, i den bästa av<br />

världar. Vill man i det sistnämnda fallet garantera sig att systemet i sin helhet ut<strong>för</strong> den<br />

tänkta uppgiften så kan det vara lämpligt att fundera på eventuella ”Black-box <strong>test</strong>er”.<br />

6


4. Empirisk studie<br />

För att undersöka hur code coverage påverkas inom programvaruutveckling om man<br />

använder sig av ett analysverktyg eller inte så in<strong>för</strong>des det i ett programvaruutvecklings<br />

team i kursen ”Programvaruutveckling i grupp” som ges på LTH.<br />

4.1 Undersökningen<br />

Från start fick utvecklarna i teamet skriva <strong>test</strong>fall <strong>för</strong> systemet efter bästa <strong>för</strong>måga utan hjälp<br />

av några analysverktyg. Detta med anledning av att deltagarna i teamet gick andra året på<br />

datatekniksutbildningen <strong>och</strong> där<strong>för</strong> inte läst så många programmeringskurser tidigare, så de<br />

kunde behöva lite tid att komma igång med projektet när allt var nytt istället <strong>för</strong> att in<strong>för</strong>a<br />

allt på en gång. Förutom det hade deltagarna inte jobbat i större projekt tidigare <strong>och</strong> heller<br />

aldrig använt sig av XP-modellen med tillhörande <strong>test</strong>driven utveckling.<br />

När deltagarna hade kommit igång bra <strong>och</strong> fått in en bra rutin på hur arbetet skulle flyta på<br />

så ansåg jag det vara dags att in<strong>för</strong>a analysverktyget till dem <strong>för</strong> att de skulle kunna börja se<br />

hur mycket de egentligen <strong>test</strong>ade. Vi hade nu kommit in på iteration tre, dvs. den tredje<br />

långlabben i projektet.<br />

4.2 Resultat<br />

Redan efter den <strong>för</strong>sta iterationen så hade teamet åstadkommit en code coverage på 74 %,<br />

som den <strong>för</strong> övrigt höll sig på mer eller mindre även under nästa iteration. Efter att ha<br />

introducerat analysverktyget <strong>för</strong> deltagarna på iteration tre höjdes deras code coverage till<br />

83%. Tillgången till ett analysverktyg som kunde tala om <strong>för</strong> användaren vad som hade<br />

missats att <strong>test</strong>as var något som uppskattades inom teamet som jag coachade <strong>och</strong> som<br />

synes på siffrorna så blev de motiverade till att skriva fler <strong>test</strong>fall <strong>för</strong> att <strong>för</strong>söka få så mycket<br />

av <strong>kod</strong>en <strong>test</strong>ad som möjligt.<br />

5. Diskussion<br />

5.1 Allmänt<br />

Först <strong>och</strong> främst är studien som ut<strong>för</strong>des inte särskilt generell eftersom den ut<strong>för</strong>des i<br />

endast ett team mitt under utvecklingen <strong>och</strong> bara under utvecklingen av en produkt. För att<br />

få en tyngre <strong>och</strong> mer styrkt studie så hade det varit vettigare att ut<strong>för</strong>a samma sak parallellt<br />

på alla team inom kursen <strong>och</strong> eventuellt även under flera år. Detta hade dock varit omöjligt<br />

främst <strong>för</strong> min o<strong>för</strong>måga att klona mig själv eftersom det hade krävt att jag varit delaktig i<br />

alla andra team samtidigt som jag skulle sköta mitt eget. Förutom det hade det även krävts<br />

att coacherna <strong>för</strong> de andra teamen inte hade något att säga till om huruvida deltagarna i<br />

deras team fick använda analysverktyg eller när de fick använda det. Man kan enkelt dra<br />

slutsatsen att i det här sammanhanget hade studien inte kunnat utformas på något bättre<br />

sätt.<br />

7


Eftersom kursen är relativt liten <strong>och</strong> därmed har en begränsning så fanns det inte plats <strong>för</strong><br />

att under utvecklingen studera huruvida olika sorters analysverktyg kunde ha en inverkan på<br />

hur bra systemet fungerade eller hur bra code coverage som uppkom. Hade iterationerna<br />

varit längre <strong>och</strong> projektet i sig varit längre hade man kunnat tänka sig att in<strong>för</strong>a att under<br />

varje iteration <strong>test</strong>a ett nytt analysverktyg <strong>för</strong> att sedan jäm<strong>för</strong>a hur resultatet blev från en<br />

iteration till en annan. Men även det sättet att gå tillväga har sina brister <strong>för</strong> vad säger att<br />

svårighetsgraden <strong>och</strong> de problem man måste slåss med är lika stora i varje iteration?<br />

5.2 <strong>Analysverktyg</strong><br />

<strong>Analysverktyg</strong> är ett väldigt kraftigt hjälpmedel under en utveckling, så länge som man vet<br />

hur det ska användas <strong>och</strong> man är in<strong>för</strong>stådd i hur det fungerar. Vet man inte det så hade<br />

man nog klarat sig bättre utan det. <strong>Analysverktyg</strong> är heller inget som hjälper en användare<br />

att garantera att systemet fungerar. Är till exempel <strong>test</strong>erna dåligt <strong>test</strong>ade <strong>och</strong> bara<br />

utformade <strong>för</strong> att skapa så hög code coverage som möjligt så kan det mycket väl vara så att<br />

det uppkommer buggar senare i utvecklingen som man inte har funderat på. Detta hade vi<br />

tydliga exempel på i vårt team där deltagarna lyckats uppnå en relativt hög code coverage,<br />

men när det efter iteration fyra önskades en <strong>test</strong>release av systemet till mig <strong>och</strong> min<br />

coaching partner, så upptäckte vi att systemet inte alls fungerade som det var tänkt längre.<br />

På något sätt har deltagarna lyckats skriva <strong>test</strong>fall <strong>för</strong> att <strong>test</strong>a så att specifika delar av<br />

systemet fungerar, men inte alls tänkt på att <strong>test</strong>a så att allt fungerar tillsammans. Vilket är<br />

ett otroligt bra exempel på att man inte ska lita blint på att fungerande <strong>test</strong>er innebär att ett<br />

system fungerar till 100 %.<br />

I artikeln “A survey of coverage based <strong>test</strong>ing tools” tas det upp att 60 % - 70 % är en rimlig<br />

siffra <strong>för</strong> cod coverage, vilket dock kan uppfattas som ganska lågt i ett projekt där man<br />

implementerar TDD, det vill säga alla <strong>test</strong> skrivs <strong>för</strong>st innan något implementeras. Detta kan<br />

man se genom att vårt team hade en code coverage på 74 % utan att använda sig av något<br />

verktyg <strong>och</strong> med hjälp av ett lyckas höja det med 10 % utan några vidare svårigheter. Sen<br />

huruvida vårt projekt är <strong>för</strong> litet eller <strong>för</strong> enkelt <strong>för</strong> att man ska kunna dra den<br />

generaliseringen eller inte är svårt att avgöra. Man skulle kunna tänka sig att efter hand som<br />

att ett system växer sig större blir det svårare <strong>och</strong> svårare att <strong>test</strong>a <strong>och</strong> även om det är<br />

meningen att man ska skriva <strong>test</strong>fall <strong>för</strong> allt, så är det inte alltid lätt eller rimligt att <strong>test</strong>a allt.<br />

Det blir nog svårare <strong>och</strong> svårare att få hög code coverage efter hand som systemet blir större<br />

<strong>och</strong> dess komplexitet ökar.<br />

6. Slutsater<br />

<strong>Analysverktyg</strong> är viktiga hjälpmedel <strong>för</strong> att öka produktiviteten under utvecklingen av<br />

programvara. För att de ska vara användbara är det viktigt att folk lär sig hur de fungerar<br />

innan de använder sig av dem <strong>och</strong> att de som använder dem inte litar blint på allt som<br />

verktyget säger utan istället mer ser det som en rekommendation.<br />

8


Referenslista<br />

[1] van Emden, E., Moonen, L. (2002). Java quality assurance by detecting code smells,<br />

Reverse Engineering, 2002. Proceedings. Ninth Working Conference on, s. 97-106.<br />

<br />

[2] Qian Yang, J. Jenny Li, David Weiss. (2006). A survey of coverage based <strong>test</strong>ing tools,<br />

Proceedings of the 2006 international workshop on Automation of software <strong>test</strong>.<br />

<br />

[3] EclEmma. Retrived 6 December 2011, from http://www.eclemma.org<br />

[4] Brian Marick (1997). How to Misuse Code Coverage, Retrived 6 December 2011.<br />

<br />

[5] Kent Beck (2002). Embracing change with extreme programming, IEEE Computer, s. 70-77.<br />

<br />

[6] M. Fowler (1999). Refactoring: Improving the Design of Existing Code. Addison-Wesley.<br />

9

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!