Enhetstester & simulering: en analogi

05 mars 2009

På senare tid har det blivit alltmer populärt med så kallad virtualisering. Det innebär att man via ett program kan köra andra operativsystem än det man har installerat på datorn. Detta sker genom så kallad mjukvaruemulering.

Det kanske låter som magi, men det är egentligen – i princip – väldigt enkelt. Ett operativsystem som kör på en dator är nämligen inget annat än en massa instruktioner (heltal) i en lång följd, och om man kan följa vad dessa instruktioner betyder, till punkt och pricka, kan man ”lura” operativsystemet att det körs på en äkta, fysisk dator. Men i verkligheten körs (”emuleras”) operativsystemet ”inuti” ett vanligt program!

Ett par populära sådana virtualiseringsprogram, för att simulera PC är VirtualBox och VirtualPC.

Ubuntu + WinXP

Ubuntu + WinXP

Till exempel har jag Ubuntu installerat på min dator hemma. Jag har installerat programmet VirtualBox i Ubuntu, och inuti detta program har jag installerat WindowsXP! På så sätt kan jag köra bägge operativsystemen samtidigt!

Nåja, detta är inte en bloggpost om virtualiseringsteknik, eller emulering som är en vanligare benämning vid simulering av lite äldre datorsystem som wonderboy2Commodore 64 (I love you!) eller TV-spel som Sega-16-bit (love you too!).

Låt mig bara dra en parallell till innan jag kommer till inläggets kärna!

Inom fysiken jobbar man med matematiska modeller av verkligheten. ”Matematisk” betyder bara att modellen består av ekvationer. Modellen är en förenkling av verkligheten, men man strävar såklart efter att den är tillräckligt ‘verklig’ för att, när man via numerisk analys (fint uttryck för simulering!) genomför en så kallad integration eller beräkning av modellen, kunna förutsäga hur fenomenet beter sig i verkligheten.

Numerisk analys

Numerisk analys

Till exempel simulering av solsystemet. Eller luftens passage förbi flygplansvingar, och hur det påverkar vingarna i kombination med hänsyn tagen till gravitation osv.

Båda dessa exempel, virtualisering (eller emulering) och fysik, strävar såklart efter att kunna förutsäga beteendet hos det subjekt man är intresserad av: WindowsXP, Commodore64, flygplansvingar eller solsystemet. 100% träffsäkehet är idealet.

Olika praktiska begränsningar medför att det kan vara svårt att nå de där 100%:en. Inom fysiken är det flera problem man har att brottas med: svårt att mäta indata till systemet, numeriska lösningsmetoder är i sin natur inte exakta (tal i datorer är begränsade i sin nogrannhet), okända fysiklagar (vi har inte en ”teori för allting” ännu) och inte minst: att det krävs oerhörd beräkningskraft för att genomföra beräkningarna (vi har inte tillgång till oändlig beräkningskraft, varken i tid eller minne).

I emuleringsfallet kommer istället svårigheten ifrån att subjektet ifråga, en PC, är komplicerad som attan. Det är svårt att få med allt i simuleringsprogramvaran: en modern PC är en av de mest komplicerade maskiner människan har skapat.

Nu kommer vi äntligen till den ryska dockans minsting! Min observation är följande:ryskdocka

Enhetstestning av programvara fungerar i mångt och mycket som en simulering av (delar av) programmet som utvecklas!


Även i detta fall strävar vi efter 100% prediktionskorrekthet (att kunna specificera programvarans beteende fullständigt), men faller här på praktiska ting som att det är svårt (dvs. dyrt) att enhetstesta vissa delar av program: GUI, tredjepartskod etc. Även den kombinatoriska explosion av användningsmöjligheter mjukvarusystem tyvärr ofta uppvisar, gör det praktiskt taget omöjligt att specificera samtliga vägar ett program kan gå.

Läs gärna mina inlägg om enhetstestning och test-driven utveckling, en moden vidareutveckling av enhetstestning.

Taggar: , , , , , , ,