Enhetstestning
(Unit Testing)

När man talar om principen att testa tidigare, Shift Left, är Unit testing eller enhetstestning den första nivån där man har möjligheten att testa funktionerna i sin applikation dynamiskt.

Själva uttrycket enhetstestning kan ibland tolkas på olika sätt beroende på hur man definierar en enhet/unit. Oavsett vilken definition som används handlar Unit Testing enhetstestning om att isolera en begränsad delmängd av applikationen och testa den utan yttre påverkan. Syftet med detta är att minska risken för yttre (relativt den enhet som testas) faktorer som påverkar testningen, samt att göra det möjligt att testa en delmängd av applikationen även ifall övriga delar kanske inte är färdigställda eller tillgängliga. Genom att på det här sättet skapa tester redan på den här nivån så kan man i ett tidigare skede upptäcka fel och på så sätt få en snabbare återkoppling till den som utvecklar applikationen.

Vad är Unit Testing?

Unit testing är en testmetod inom mjukvaruutveckling som syftar till att testa enskilda enheter, såsom funktioner eller metoder, i en applikation. Målet med enhetstestning är att isolera och testa dessa enheter oberoende av övriga delar av systemet. Genom att skapa automatiserade tester för varje enskild enhet kan man identifiera och åtgärda felaktigheter och buggar i ett tidigt skede av utvecklingsprocessen. Enhetstestning bidrar till att förbättra kodkvaliteten, underlätta underhåll och refaktorisering av kod samt ger ett ökat förtroende för att systemet fungerar som förväntat. Genom att utföra enhetstester kan utvecklare också få snabb återkoppling på sina ändringar och upptäcka eventuella regressionsfel. Enhetstestning är en viktig del av en effektiv teststrategi och främjar en agil och iterativ utvecklingsprocess.

Ramverk och verktyg för Unit Testing

Själva enhetstesterna körs lämpligen av ett testautomatiseringsramverk i samband med att koden kompilerats. Beroende på vilket programspråk som valts finns det olika varianter av testautomatiseringsramverk som kan se olika ut och erbjuda olika mycket stöd och funktionalitet. Några testautomatiseringsramverk som för några av de vanligaste kodspråken som används idag är till exempel:

  • Java – Junit, TestNG
  • Javascript/Typescript – Jest, Mocha
  • C#/.Net – xUnit, NUnit, MSTest
  • Python – Pytest, PyUnit

Testautomatiseringsramverk kan också användas för att köra andra typer av tester än de man kallar för enhetstester, till exempel GUI-tester med hjälp av Selenium eller Playwright. Testsramverken kan köra testerna antingen lokalt i utvecklarens miljö och ge feedback direkt till utvecklaren, eller i en automatiserad byggmiljö där utfallet av enhetstesterna behöver presenteras på något sätt. En bra presentation av testresultatet ger en möjlighet till spårbarhet och värdefull insikt i vad som redan är testat i utvecklingsfasen.

Kontakta oss för konsultation eller frågor rörande Testkoncept

Har du frågor eller behöver hjälp med implementeringen av det nya finansiella regelverket från EU? Tveka inte att höra av dig till oss. Fyll i formuläret så återkommer vi till dig inom kort. Vi finns här för att hjälpa dig att ta nästa steg i din digitala utveckling.

Mätning av Unit testing

Själva enhetstestningen kan också mätas, då pratar man oftast om kodtäckningsgrad (Code Coverage) vilket kan mätas Själva enhetstestningen kan också mätas, då pratar man oftast om kodtäckningsgrad (Code Coverage) vilket kan mätas på olika sätt, till exempel hur många procent av alla kodrader som körts efter att samtliga enhetstester har exekverats. När man börjar mäta kodtäckningsgrad uppkommer frågan om hur man ska förhålla sig till olika varianter att mäta kodtäckningen, t.ex. om man ska sikta på att nå en viss procentsats. Här är det främst medvetenheten om hur trenden ser ut över tid som är viktigast – det ska ge ett värde till både produktägare och utvecklare. Därför gäller det att alla har insikt i vad dessa siffror representerar och hur de kan ge en insikt i hur mycket krut man lägger på kvalitetssäkring i utvecklingsfasen.

Kodtäckning är däremot inte allt, även kvaliteten av Unit Testing  enhetstesterna i sig är viktig. Det kan vara så att testerna bara kör koden utan att faktiskt verifiera (med hjälp av assertions) gränsvärden, felkoder och annat som är det som är viktiga. När man i leveranskedjan utvecklat ny funktionalitet så körs enhetstester för att testa både den nya funktionaliteten och för att befintlig funktionalitet inte gått förlorad. Sedan bör denna version granskas av en eller flera andra utvecklare vilket kan kallas för olika saker beroende på vilket verktyg man jobbar med eller vilken terminologi som gäller, till exempel en Pull Request i Git. Här granskar man det utvecklade ur många perspektiv, både ur ett underhållsperspektiv, kodstandard, säkerhet med mera. Här ska också enhetstesterna granskas för att se att de håller en bra kvalitet och ger ett mervärde.

Anpassning av enhetstester: Att betrakta varje applikation individuellt

Unit Testing Enhetstesterna utgör basen i den ideala testpyramiden, som visar på grundprincipen och en typisk målbild gällande förhållandet mellan enhetstester, integrationstester och systemtester. Anledningen att enhetstesterna ligger i den breda botten är dels att utvecklaren får en snabbare feedback (testerna i sig har en typisk exekveringstid på millisekunder, att jämföras med API-baserade tester och GUI-baserade tester vilka typiskt har exekveringstid som mäts i sekunder respektive minuter) Det är däremot viktigt att betrakta varje applikation individuellt då det kan råda olika förutsättningar för enhetstester. Färdigpaketerad mjukvara som konfigureras och inte kodas kanske inte ens har möjligheten till enhetstestning, eller så kan koden vara skriven på ett sådant sätt att man inte kan testa den utan att exekvera den skarpt och försvårar då möjligheterna för att använda denna testteknik i någon större utsträckning. Oavsett så är det en viktig grundpelare i testningen och testautomatiseringen som man ska sträva efter att jobba med.

Enhetstesterna kan också skrivas innan själva koden de avser testa. Denna metodik är rätt vanlig idag och kallas för Test Driven Development (TDD). Tanken är att flytta testningen ännu längre till vänster och att låta testerna framtvinga en systemarkitektur som är mer testbar och håller högre kvalitet.

Integration testing vs unit testing

Integrationstestning och enhetstestning är två olika testmetoder inom mjukvaruutveckling. Unit testing fokuserar på att testa enskilda enheter av koden separat för att säkerställa deras korrekthet och funktionalitet. Detta görs genom att isolera enheterna och kontrollera deras beteende oberoende av andra delar av systemet. Å andra sidan testar integrationstestningen hur dessa enheter samverkar och fungerar tillsammans. Syftet är att upptäcka och lösa problem som kan uppstå vid gränssnittet mellan enheterna.

Unit testing kan identifiera och åtgärda buggar tidigt i utvecklingsprocessen, medan integrationstestning validerar att de olika enheterna samverkar korrekt och att gränssnittet mellan dem fungerar som förväntat. Båda testmetoderna är viktiga för att säkerställa en hög kvalitet på mjukvaran. Enhetstestning fokuserar på att testa detaljerna i enskilda enheter, medan integrationstestning validerar att systemet som helhet fungerar korrekt. Genom att använda både unit testing och integrationstestning kan man få en omfattande och pålitlig testning av mjukvaran, vilket bidrar till att minimera buggar och felaktigt beteende och skapar en stabil och väl fungerande produkt.

Maximera kvaliteten på din mjukvara med Lemontree, vi säkerställer att varje del av din kod fungerar korrekt genom noggranna tester och valideringar. Med vår hjälp undviker du buggar och felaktigt beteende, och kan skapa en stabil och felfri produkt som imponerar på användarna.

Ta kontakt med en av våra erfarna experter för att få skräddarsydda lösningar och ta fullständig kontroll över din testdata. Vi finns här för att hjälpa dig att optimera dina testprocesser och säkerställa hög kvalitet i din mjukvara.

Konsultchef Test/QA

Ludwig Östlund

Ludwig har arbetat med testautomatisering i komplexa projekt sedan 2012. Idag är han chef över TestOps-teamet på Lemontree och driver därtill kompetensområdet för kvalitetssäkring och testautomatisering. Ludwig utbildar även frekvent i testmetodik och blev 2021 utsedd till topp tre årets kulturbärare av Great Place to Work i hela Sverige.

ludwig.ostlund@lemontree.se | +46 (0) 700 651 667 | LinkedIn

Vanliga frågor & svar om Enhetstestning (Unit Testing)

Här hittar du svar på de vanligaste frågorna vi får från våra kunder. Vi har samlat information och lösningar på olika ämnen och problem som kan uppstå. Oavsett om det gäller tekniska frågor, produktinformation eller allmänna funderingar, så finns vi här för att hjälpa dig.

Hittar du inte svar på din fråga?
Vilka fördelar ger Unit Testing inom mjukvaruutveckling?2023-06-30T14:50:24+02:00

Enhetstestning inom mjukvaruutveckling ger flera fördelar. Det minskar risken för felaktig funktionalitet, underlättar upptäckt och åtgärdande av buggar i tidigare skeden, ökar kodkvaliteten och stabiliteten, samt ger snabb återkoppling till utvecklare. Det hjälper även till att underlätta refaktorisering och underhåll av koden, samt öka förtroendet för mjukvaran genom att ge en robust testsvit. Enhetstestning bidrar till att förbättra mjukvarans kvalitet och pålitlighet, vilket resulterar i ökad effektivitet och minskade kostnader på lång sikt.

Vad är syftet med Unit Testing?2023-06-30T14:50:12+02:00

Syftet med enhetstestning är att säkerställa att enskilda enheter, som funktioner eller metoder, fungerar korrekt och isolerat från resten av systemet. Genom att skapa automatiserade tester för varje enhet kan man identifiera och åtgärda eventuella felaktigheter och buggar i ett tidigt skede av utvecklingsprocessen. Enhetstestning hjälper till att förbättra kodkvaliteten, öka stabiliteten och tillförlitligheten i systemet samt underlättar underhåll och refaktorisering av koden. Dessutom ger enhetstestning utvecklare snabb återkoppling på deras ändringar och minimerar risken för regressionsfel. Genom enhetstestning kan man uppnå högre kvalitet och robusthet i mjukvaran.