Vad är enhetstestning?
Enhetstestning är ett självförklarande ord om man förstår vad som menas med enhet. En enhet är det minsta möjliga kodstycket som logiskt kan isoleras från systemet. Detta innebär att varje kodbit som kan ta inmatningar, utföra en uppgift och generera utmatning även om den är oberoende av hela systemet eller lösningen, kan betecknas som en enhet. Testning av denna kodkod för att generera förväntad utgång på en given uppsättning ingångar kallas Enhetstestning.
Typer av enhetstestning
Låt oss diskutera några typer av enhetstestning.
1) Manuell testning
Manuell testning av kod kräver att utvecklaren manuellt felsöker varje rad i koden och testar den för noggrannhet. Det kan kräva en steg-för-steg-instruktion också om funktionaliteten är komplex.
2) Automatiserad testning
Vid automatiseringstest skriver utvecklaren kod för testkod. Detta stöds vanligtvis genom Unit Test-ramverk som inte distribueras i produktion. Andra gånger kan en utvecklare välja att skriva testkod utan ramverket och manuellt kommentera den innan installationen.
Manuell testning verkar uppenbarligen tidskrävande för de flesta fall. Men för vissa fall när man skriver automatiserade testfall för att täcka varje scenario är inte möjligt, manuell är ofta den föredragna metoden.
Varför är enhetstest viktigt?
För att förstå vikten av enhetstest måste vi titta på den bredare bilden. Det är en del av programvaruutvecklingens livscykel. Låt oss kort se de andra delarna för att få en bättre förståelse av rollen för enhetstestning.
Bilden ovan är en enkel illustration av en normal livscykel för mjukvaruutveckling och de testprocesser som är involverade i den. Naturligtvis, beroende på projektets struktur, varierar hela processen med tillägg och borttagning av vissa komponenter. Testprocessen involverar dock säkert fyra typer som beskrivs nedan:
- Enhetstestning - Den grundläggande nivån för hela testprocessen. Detta utförs av utvecklaren av komponenten eller någon av hans kamrater. I det senare fallet benämns det ofta som peer-testning i programvaruvärlden.
- Integrationstest - Testa enhetskomponenten med sin omedelbara modermodul. Målet är att kontrollera om enhetskomponenten integreras väl med de andra komponenterna och inte har orsakat funktionsfel i någon annan komponent.
- Systemtestning - Testa hela systemet när enhetskomponenten är placerad på sin position.
- Acceptansprövning - Vanligtvis utförs av företag / klienter, det kontrollerar om resultatet är i linje med den funktionalitet som slutanvändaren förväntar sig.
Således kan man mycket väl se att alla testprocesser förlitar sig på den grundläggande testnivån. Om den grundläggande testnivån inte görs, kan alla andra testningar resultera i meningslöst.
Låt oss nu säga att du har en kod som har två delar
- Beräkna sammansatt ränta.
- Lägg räntan till huvudbeloppet och beräkna förfallsförmånen.
Låt oss anta att du inte testade enheterna av någon av dessa komponenter och fortsatte direkt till systemtestning. Ett fel uppstår vid systemtestning att förfallsvärdet är felaktigt. Vilken del av koden har nu ett fel?
- Det kan vara i beräkningen av ränta.
- Det kan vara att tillämpa sammansättningslogiken.
- Det kan utöver ränta till huvudbeloppet.
Se hur det ökar ansträngningen nu. Allt detta kunde ha undvikits om båda kodkomponenterna hade testats enhet.
Varför är enhetstest viktigt?
- Den fixar buggar tidigt i utvecklingsstadiet. Detta sparar mycket tid, ansträngning och kostnad. Föreställ dig att om det inte fanns några enhetstester, skulle koden gå till och från kvalitetssäkringsteamet för mycket enkla problem.
- Bra enhetstester tjänar också syftet med detaljerad dokumentation. När en utvecklare skriver enhetstestfall skriver han oavsiktligt den förväntade funktionaliteten för koden. Detta är helt enkelt inget annat än dokumentation som förklarar hur koden fungerar.
- Det gör det enkelt att ändra och underhålla kod. När du har gjort några ändringar i koden, kör testerna igen och altviol, alla fel uppstår utan krångel.
- Det upprätthåller också modularitet. Enhetstester körs på enskilda komponenter, vilket innebär att koden måste vara så kornig som möjligt. Detta säkerställer att koden delas in i moduler.
Den andra sidan av myntet
Det har vissa nackdelar också. Även om fördelarna väger över nackdelarna och det rekommenderas alltid att testa din kod, men det är också meningsfullt att känna till båda ansikten på samma mynt.
- Enhetstestning, hur som helst noggrant, kan ibland misslyckas med att fånga alla fel i den mest triviala koden också. Det är helt enkelt inte möjligt att utvärdera alla exekveringsvägar. Således är enhetstester ofta enkla lyckliga banor och negativa scenarier.
- Det kräver att en utvecklare tänker utanför rutan och försöker bryta hans kod. Detta är ofta svårt eftersom uppfattningen av en utvecklare blir partisk mot koden.
Enhetstestverktyg
Det finns flera verktyg i branschen för att hjälpa till med automatiserade enhetstestfall. I likhet med syftet underlättar de att skriva och köra enhetstestfall för utvecklaren. Det finns en värld av enhetstestramar vid utbetalning av utvecklare. Några av de mest populära och mest använda verktygen listas nedan.
JUnit
JUnit är ett fritt att använda testverktyg för Java. Det ingår automatiskt i många projektmallar som finns tillgängliga med olika IDE: er för Java-utveckling. Det som gör JUnit speciellt är att den testar uppgifterna först och sedan testar koden efter att data har lagts i dem. Det ger också påståenden för att identifiera testmetoderna.
NUnit
NUnit är att .Net som JUnit är till Java. Det har alla de framträdande funktionerna hos JUnit, men för utveckling i .Net-programmeringsspråk. Det stöder också att köra testerna parallellt.
PHPUnit
I likhet med JUnit och NUnit är PHPUnit ett verktyg för PHP-utvecklare. Det stöder också alla elementära funktioner i ett bra testverktyg.
xUnit
En annan ram som är mer generisk än motsvarigheterna är XUnit. Det stöder flera språk som C ++, C #, ASP.Net, etc. Det har också liknande funktioner som för andra verktyg som finns tillgängliga på marknaden.
Jtest
Parasoft Jtest är ett tredjeparts plugin som utnyttjar open source-ramarna som JUnit och lägger till klicklösningar för att göra livet enklare. Med Jtest kan du automatiskt generera testkoder för din kod med bara några klick. Genom att automatisera dessa uppgifter är utvecklaren fritt att arbeta med testfallens affärslogik.
QUnit
Ett mycket populärt ramverk för JavaScript-enhetstestning. Den kan testa JavaScript-kod både på klientsidan och serversidan.
Jasmin
Ett annat mycket använt testverktyg för JavaScript-ramverk. Det har stort samhällsstöd för Angular, React, etc.
JMockIt
JMockIt är ett öppen källkodsverktyg som också stöder håna API-samtal med inspelnings- och verifieringssyntax.
Exempel på enhetstest
Ett mycket grundläggande krav för varje enhetstestfall är koden som ska testas. Låt oss anta att vi har en funktion som validerar om telefonnumren är korrekta (i form av format) eller inte. Beroende på den geografiska platsen kan detta kriterium också variera. Så vi kommer inte att betona kriterierna. Snarare kommer vi att fokusera på enhetens testfall.
public class PhoneValidator
(
public bool IsPhoneValid(string phone)
(
/* write some code to verify if the phone is valid or not. return true, if the phone is valid. return false, if invalid. */
)
)
Nu måste vi testa den här koden.
Vi kan antingen testa det manuellt genom att infoga olika värden och verifiera utgången. Detta kan tyckas enkelt vid första blicken men kommer att vara en upprepad uppgift om någon ändring görs i koden.
Alternativt kan vi skriva ett enhetstestfall som kan fungera som min validerare så länge affärslogiken förblir densamma. Enhetstestfallet kommer inte att ändras även om vi ändrar koden. Så låt oss skriva ett enhetstestfall för ovanstående kod.
public void TestPhoneValidator()
(
string validPhone = "(123) 456-7890";
string invalidPhone = "123 45"
PhoneValidator validator = new PhoneValidator();
Assert.IsTrue(validator.IsPhoneValid(valid phone));
Assert.IsFalse(validator.IsPhoneValid(invalidPhone));
)
Så hur fungerar ovanstående enhetstestkod? Lägg märke till de två påståenden. De ser till att testet endast klarar om de två raderna får sanna och falska från respektive IsPhoneValid-funktionssamtal.
Du skulle fråga vad är fördelarna med att skriva detta testfall? Tja, om du har tusentals telefonnummer att validera i något verkligt scenario, behöver du inte verifiera manuellt varje gång felsökaren träffar koden. Ringa helt enkelt testkoden tusentals gånger så kommer det att berätta vilka test som klarat och vilka misslyckades. Nu behöver du bara inspektera de misslyckade.
Tips för enhetstest
- Använd alltid ett verktyg eller ramverk som stöder ditt språk. Verktyg gör det enkelt att utveckla enhetstestfall. Du kan hamna i extra ansträngningar annars.
- Även om det rekommenderas för allt är det ibland bekvämt att hoppa över koder som är enkla och inte påverkar systemets beteende direkt. Till exempel kan getter- och setterkoder vara mindre fokuserade på.
- Hoppa aldrig över koder som direkt påverkar systemet eller som är avgörande för implementeringen av affärslogiken.
- Använd testdata som liknar produktionsdata.
- Isolera din kod. Om din kod är beroende av data från databasen, skriv inte ett testfall för att ringa databasen och få värden. Skapa istället ett gränssnitt och håna API och databassamtal.
- Innan du åtgärdar ett fel som uppstår genom enhetstest, skriv testet som exponerar felet. Det finns tre skäl att göra det:
- Du kommer att kunna fånga regressionsfel som uppstår till följd av din fix.
- Ditt testfall är nu mer omfattande.
- Ofta är en utvecklare för lat för att uppdatera sina testfall när de skrivits.
- Förutom att skriva testfall som verifierar affärslogiken, skriver du också fall som testar prestandan för din kod. Särskilt när koder involverar looping är prestanda det mest påverkade området.
Saker att komma ihåg
- Enhetstest bör vara oberoende av
- Koden som ska testas - Alla ändringar i koden bör inte kräva någon ändring i enhetens testfall om inte företagets logik i sig ändras. Till exempel, om logiken nu kräver att ett giltigt telefonnummer alltid börjar med '+', måste enhetens testfall ändras, annars inte.
- Den andra koden - Det bör inte vara någon interaktion eller beroende med någon annan kod eller databasvärde eller något sådant. En enhet ska isoleras när den testas.
- Följ tydliga och konsekventa namnkonventioner för dina testfall. Det gör det lättare att spåra scenarierna. Du kan också använda versionskontrollverktyg för att hålla reda på dina testfall.
- Vidarebefordra aldrig din kod till nästa fas tills den har gjorts, buggar är fixade och testats igen.
- Viktigast av allt, gör det till en vana. Detta är en kodningspraxis som måste inkuleras. Ju mer du kodar utan enhetstest, desto mer felaktig är din kod.
Karriär i enhetstestning
Även om enhetstestning inte är något fält i sin helhet, är det ändå en ytterligare pil i din pekare. Det är en bra kodningspraxis och när föredras inte bra kodare?
Slutsats
Det kan obestridligt dras slutsatsen att enhetstestning kan vara enkel ibland och komplicerad andra gånger. Det är när verktygen och ramarna kommer till din räddning. Även med enhetstestningen är koden inte helt korrekt. Det är när testprocedurerna på nästa nivå startar. Bland alla dessa osäkerheter är det enda som är säkert att enhetstestning är nödvändig.
Rekommenderade artiklar
Detta har varit en guide till enhetstestning. Här diskuterade vi vikten, tips, verktyg, karriär och typer av enhetstestning med dess exempel. Du kan också gå igenom våra andra föreslagna artiklar för att lära dig mer -
- Testa intervjufrågor
- Webbtestning
- Defekter livscykeln vid mjukvarutestning
- Karriärer inom mjukvarutestning
- Lista över testramar för Java