tisdag 17 december 2013

Testdata, ofta underskattat

Relevant testdata är en förutsättning för bra tester under en systemlösnings hela livscykel. Ofullständig eller felaktig testdata får till följd att testerna tar lång tid, testernas kvalité minskar och att felaktigheter ej upptäcks. Testdatahantering är en viktig del av testarbetet men tyvärr underskattas ofta svårigheterna med att ta fram bra testdata. Mycket tid läggs i regel på att förstå kravspecifikationen och att ta fram relevanta testfall utifrån denna. Det är mer ovanligt att testare ingående studerar datamodellen och informationsflöden, vilket kunde ge bra underlag till krav på testdata.

Kraven på testdata skiljer sig mellan olika faser. I tidiga faser efterfrågas väldigt specifik data kopplade till kravuppfyllnad, såsom randvillkor, olika datatyper, särfall, kombinatoriska villkor o.s.v. Det är också viktigt med testdata för att representera olika felfall för negativ testning och felhantering. Ofta automatiseras tester i tidiga faser. Detta ställer särskilda krav på testdata.

I senare faser finns ofta behov av att använda så produktionslik data som möjligt. Systemlösningen kanske ska kopplas ihop med angränsande system som förutsätter produktionslik data och det kan också vara så att testmiljön i sig kräver produktionslik data. Ytterligare en orsak är att användare som testar i senare testfaser ska kunna känna igen sig i lösningen och reagera på oförutsedda händelser. Deras arbete underlättas om det finns ett visst mått av igenkännande till att börja med.

En del tester förbrukar testdata. Det är då viktigt att ny testdata kan genereras eller att testdata snabbt läsas tillbaka. Vid sådana förstörande tester går det ofta åt stora mängder och i regel underskattas behovet initialt.

Komponenttest
Komponenttest, modultest eller unit test är tester som i regel görs av utvecklare i samband med implementationsarbetet. Komponenttester sker på mycket låg nivå för kontroll av specifika algoritmer, transformationer, I/O-hantering och andra isolerade delar av koden. Komponenttesterna automatiseras ofta och körs i samband med kodbyggen. Det är därför viktigt att testdata som används är väldefinierad och kan nyttjas med ett minimum av manuell hantering. Eftersom testerna upprepas ofta så bör dessa vara av icke-förstörande art och testdata kan i regel återanvändas. Testdata för komponenttester hanteras ofta som en del av utvecklingsmiljön, eller kanske t.o.m. som en del av testautomatiseringen. Det finns sällan ett behov att administrera testdata över flera systemlösningar utanför utvecklingsteamet.

Systemtest
Tester som sker som en del av systemutvecklingen med fokus på ett isolerat system och med syfte att kontrollera kravuppfyllnad, kallas för systemtest. Systemtest utför i regel av testare i en dedikerad systemtestmiljö. Vid systemtester används olika former av testtekniker (t.ex. ekvivalensvärden, gränsvärden, negativ testning) vilket ställer krav på speciellt framtagen och noga designad testdata. Testdataset hålls ofta relativt små och lätthanterade, men testdatat är i regel noga strukturerar och uttänkt för att kunna motionera systemet på djupet. Eftersom fokus är på ett specifikt system så är det en fördel att begränsa antalet kopplingar till angränsande system, eller i alla fall hålla integrationerna så väldefinierade som möjligt. Testdata för omkringliggande system kan därför hållas enkel. Systemtester kan med fördel automatiseras och det ställer ytterligare krav på väldefinierade dataset. Känt start- och slutläge, spårbarhet o.s.v. är en förutsättning för en automatiserad testimplementation. Automatiseringen blir då lättare att underhålla.

Systemintegrationstest
Vikten av välordnad testdata kan ej underskattas när det gäller systemintegrationstest. Syftet med systemintegrationstesterna är att testa kommunikation, integration och funktionalitet som sträcker sig över flera olika system. Gemensam testdata som är synkroniserad mellan alla systemen är en nödvändighet. En utmaning är att hålla data synkroniserad över tiden. Allteftersom testerna pågår kommer data att förändras och kanske förstöras. Det är därför viktigt att kunna återställa data effektivt, alternativt generera ny data. Till sin natur påminner testdatat, som används, mycket om data under systemtest, med den skillnaden att testdata dessutom ska hänga ihop mellan alla inblandade system.

Acceptanstest
Tester som genomförs av beställarorganisationen/verksamheten kallas för acceptanstest. Detta sker ofta i produktionsliknande miljöer och med produktionslik testdata. Anledningen till detta är att testresurser med stor verksamhetskunskap ska känna ett visst mått av igenkännande och kunna göra rimlighetsbedömningar. Fokus brukar ligga på tester av hela verksamhetsflöden och ofta med flera integrerade system. Testdata ska återspegla verkligheten och är sällan konstruerat från grunden utifrån specifika testfall, såsom ofta är fallet vid systemtest.

Prestandatester
Prestandatester är ett område med behov av stora datamängder. För relevanta presetandatester behövs i regel en datamängd i samma storleksordning som produktionssituationen. Det kan vara svårt att framställa nödvändig data i högkvalitativ form men kanske det är möjligt att använda multipla kopior på dataset med minimala skillnader. Under prestandatest är det oftast kvantitativa egenskaper hos testdata som efterfrågas.

För att undersöka hur systemet fungerar över en längre tid används lågintensiva prestandatester med lång körtid. Minnesläckage och eller begränsade resurser kan göra att fel uppstår efter en längre tids nyttjande. Detta område kräver ofta stora mängder testdata, alternativt oförstörbart data, då tester ibland pågår under flera dagar.

Testdataverktyg
Det finns speciella verktyg för att hantera testdata. Testdataverktyg består av en testdatamotor som hanterar testdata utifrån givna specifikationer, samt en lagringsyta där färdighanterad testdata kan hämtas. Testdataverktyg gör i princip tre olika saker. Generering av ny testdata, avidentifiering av produktionsdata och indelning av testdata i olika delmängder.  Dessa uppgifter kan köras i sekvens och automatiseras. Huvudsyftet är att hålla testdata synkroniserat under hela processen så att data sen kan flyttas till testmiljöer och användas för tester av ett eller flera system.