what is mutation testing
Denna handledning förklarar vad som är Mutation Testing, hur man utför det och Mutation Testing-typer med exempel:
Vad är mutationstestning?
Mutationstestning är en felbaserad testteknik där variationer av ett programvara underkastas testdatasetet. Detta görs för att bestämma effektiviteten av testuppsättningen för att isolera avvikelserna.
Det låter lite komplicerat, eller hur?
Vad du kommer att lära dig:
Mutationstestning
Mutation Testing (MT) går långt tillbaka till 70-talet där det först föreslogs som ett skolprojekt. Det skrevs av eftersom det var mycket resurskrävande. Men eftersom människor fortsatte att utveckla mer avancerade datorer gjorde det långsamt comeback och är nu en av de mest populära testteknikerna.
Definition av mutationstestning
MT är också känt som felbaserad testning, programmutation, felbaserad testning, eller mutationsanalys .
Som namnet antyder är mutationstest en programvarutestningstyp som baseras på förändringar eller mutationer. Miniscule-ändringar införs i källkoden för att kontrollera om de definierade testfallet kan upptäcka fel i koden.
Det perfekta fallet är att inget av testfallet ska klara. Om testet klarar betyder det att det finns ett fel i koden. Vi säger att mutanten (den modifierade versionen av vår kod) levde. Om testet misslyckas finns det inget fel i koden och mutanten dödades. Vårt mål är att döda alla mutanter.
Mutationstestning hjälper också till att testa kvaliteten på de definierade testfall eller testsviter med ett försök att skriva mer effektiva testfall. Ju fler mutanter vi kan döda, desto högre är kvaliteten på våra tester.
Mutation Testing Concepts
Innan vi diskuterar mutationstester vidare, låt oss utforska några begrepp som vi kommer att stöta på.
# 1) Mutanter: Det är helt enkelt den muterade versionen av källkoden. Det är koden som innehåller små förändringar. När testdata körs genom mutanten bör det helst ge oss andra resultat än den ursprungliga källkoden. Mutanter kallas också mutantprogram .
Det finns olika typer av mutanter. Dessa är som följer:
- Överlevda mutanter: Som vi har nämnt är detta mutanterna som fortfarande lever efter att testdata har körts genom de ursprungliga och muterade varianterna av källkoden. Dessa måste dödas. De är också kända som levande mutanter.
- Dödade mutanter: Det här är mutanter som dödas efter mutationstest. Vi får dessa när vi får olika resultat från de ursprungliga och muterade versionerna av källkoden.
- Motsvarande mutanter: Dessa är nära besläktade med levande mutanter, genom att de är 'levande' även efter att ha kört testdata genom dem. Vad som skiljer dem från andra är att de har samma betydelse som den ursprungliga källkoden, även om de kan ha olika syntax.
# 2) Mutatorer / mutationsoperatorer: Det är detta som möjliggör mutationer, de ligger på förarsätet. De definierar i princip vilken typ av ändring eller ändring som ska göras i källkoden för att ha en mutantversion. De kan kallas fel eller mutationsregler .
# 3) Mutationspoäng: Detta är en poäng baserat på antalet mutanter.
Den beräknas med formeln nedan:
Anteckna det, motsvarande mutanter beaktas inte vid beräkning av mutationspoäng. Mutationspoäng är också känt som mutationstillräcklighet . Vårt mål bör vara att uppnå en hög mutationspoäng.
Hur man gör mutationstestning
Steg 1: Låt oss skriva vårt Jasmine-enhetstest.
Test Suite (Jasmine)
describe('User', function() { it('should compare the two numbers from user input', function(){ expect(20).toBeGreaterThan(5); }) });
Steg 2: Skriv originalkoden.
Originalkod (Javascript)
const user_info = () => { mother_age = parseInt(prompt('Enter mother's age')) daughter_age = parseInt(prompt('Enter daughter's age')) if (mother_age > daughter_age) { alert(`Daughter's age is ${daughter_age}. Mother's age is ${mother_age}. Welcome to the Mother-Daughter program`) } else { alert(`Daughter's age: ${daughter_age}, is more than mother's age: ${mother_age}. Please enter correct ages`) } } user_info();
Steg 3: Vi kör sedan testet genom den ursprungliga koden för att säkerställa att vi inte har misslyckade tester från början. Vi borde ha lite output som kommunicerar att vi verkligen har skrivit ett test utan nollfel.
Till exempel:
slutade i 0.019s 1 spec, 0 misslyckanden, randomiserad med utsäde 31435
Ursprunglig kods resultat:
Daughter's age is 5. Mother's age is 20. Welcome to the Mother-Daughter program
Steg 4: Presentera mutanten. I det här fallet ändrar vi större än operatör (moder_ålder> dotter_ålder) till en mindre än operatör (moder_ålder Mutantkod (Javascript) Steg 5: Vi kör sedan testet genom mutantkoden. Här är testresultaten: slutade i 0.017s 1 spec, 0 misslyckanden, randomiserad med utsäde 89555 Mutantkods resultat: Steg 6: Jämför resultaten från originalversionen och mutantversionen. I det här fallet är de olika, även om samma testsvit användes. Vi har därför dödat vår mutant. Vår testsvit är därför bra att gå. Det finns flera typer av mutationer. Dessa förklaras nedan. Här introducerar vi en mutation genom att ändra parametern och / eller konstanta värden, vanligtvis med +/- 1. Exempel: Originalkod (Javascript) Om ovanstående kod var tänkt att multiplicera jämna siffror var i<4 , då skulle värdemutation innebära att initialiseringen ändras till låt jag = 1 . Exempel: Mutantkod (Javascript) Här tar vi bort eller duplicerar ett uttalande i ett kodblock. Vi kan också ordna uttalanden i ett kodblock. I ett if-else-block kan vi till exempel ta bort den andra delen eller till och med hela if-else-blocket. Exempel: Originalkod (Javascript) Exempel: Mutantkod (Javascript) Målet här är koden som fattar beslut, till exempel, värdejämförelser. Vi kan förändras > till< som i vårt exempel på Mother-Daughter-programmet. Andra operatörer som vi kan byta inkluderar följande: Fördelarna med mutationstestning (MT) inkluderar: Nackdelarna med mutationstestning (MT) inkluderar: Verktyg är till nytta för att påskynda processen för generering av mutanter. Här är några verktyg som vi kan använda i MT: Stryker, Jumble, PIT och Insure ++. Låt oss lära oss av ett exempel: Säg, det finns en sjukhussida som låter nya användare registrera sig. Den läser patientens födelsedatum eller ålder. Om den är större än 14, tilldelar en allmänläkare som huvudläkare. För att göra det åberopar den funktionen ”allmänläkare” som hittar den tillgängliga läkaren. Nu kan det finnas andra funktioner. Kanske får patienter under 13 år en barnläkare och så vidare. Men vi tar bara fallet över 14 år. Så här kan koden se ut: 1) Läs ålder Observera att ovanstående kodrader inte är specifika för något programmeringsspråk och inte kan köras. Det är bara hypotetiskt. Som testare, om min datamängd är 14, 15, 0, 13 - några slumpmässiga siffror. Målet är att kontrollera om datamängden för de 4 värdena (14, 15, 0 och 3) är tillräcklig för att identifiera alla möjliga problem med den här koden. Läs också => Tips för att designa testdata innan du utför dina testfall Hur uppnår Mutation Testing detta? Först och främst skapar du mutanter - variationer av programmet. En mutant är inget annat än ett program som skrivs som en avvikelse. Den innehåller ett självsådd fel. Exempel är: Dessa ersättare kallas också ”Mutationsoperatörer.” Låt mig visa dig exempel: Mutant nr 1: relationsoperatörersättning 1) Läs ålder Mutant # 2: 1) Läs ålder Mutant # 3: 1) Läs ålder Mutant # 4: 1) Läs ålder Mutant nr 5: Avlägsnande av uttalanden 1) Läs ålder Mutant # 6: Absolut värdeinsättning 1) Läs ålder Mutant nr 7: Felaktig syntax 1) Läs ålder Mutant # 8: Gör samma sak som det ursprungliga testet 1) Läs ålder En gång skapas alla mutanter. De utsätts för testdatauppsättningen. Vår uppsättning är 14, 15, 0 och 13. Vilken av dessa mutanter hittar vår datamängd? Ta reda på det i nedanstående tabell: (Klicka på bilden för en förstorad vy) Som du kan se hittar vårt datavärde 14 fel när det löper mot, Mutant 2, 3 och 4. Eller, 14 dödar mutanterna 2, 3 & 4. Men det är ineffektivt mot, 1, 6 och 8. Om din datamängd dödar alla mutanter är det effektivt. Annars, inkludera mer eller bättre testdata. Det är inte nödvändigt för varje värde i datamängden att döda alla mutanter. Men tillsammans ska de döda alla.Till exempel:14 dödar 2, 3 och 4. 15 dödar 1, 2 och 4. Och så vidare. Vad sägs om 5, 7 och 8? Mutant # 5 - är programinstansen som kommer att misslyckas oavsett vilket datavärde du anger. Detta beror på att det inte gör någon programmering för både giltiga och ogiltiga värden. Mutant # 7 - blir ett kompileringsfel. Eller i fallet med ett skriptspråk ett fel som förhindrar körning. Mutant # 8 - är samma sak som huvudprogrammet. Som du kan se är ovanstående mutanter inte användbara alls. Därför är mutanter att undvika: Tänker du, om det tar så mycket ansträngning, vad kommer att hända när jag måste testa stora kodprover? Mutationstest bygger på två saker: Så, den fokuserar på den minsta kodenheten och litar på programmerarens skicklighet för att skala mutationstest till större program. Denna handledning behandlade definitioner, typer och steg för mutationstestning för att utföra denna testning i detalj med exempel. Vi hoppas att du har gillat att läsa och lära dig mer om denna intressanta testteknik - Mutation Testing. Om författaren: Denna artikel är skriven av STH-teammedlem Swati S. Dela dina kommentarer, frågor och tankar nedan. const user_info = () =>{ mother_age = parseInt(prompt('Enter mother's age')) daughter_age = parseInt(prompt('Enter daughter's age')) if (mother_age
Daughter's age: 5, is more than mother's age: 20. Please enter correct ages
Mutationstesttyper
# 1) Värdemutation
let arr = (2,3,4,5) for(let i=0; i
let arr = (2,3,4,5) for(let i=1; i
# 2) Påståendemutation
let arr = (2,3,4,5) for(let i=0; i
let arr = (2,3,4,5) for(let i=0; i
# 3) Beslutsmutation
Originaloperatör Mutant operatör ett <= > = två > = == 3 === == 4 och eller 5 || &&
Mutation Testing Tools
Mer om mutationstestning
2) Om ålder> 14
3) Läkare = Allmänläkare ()
4) Avsluta om
2) Om ålder med<’
3) Läkare = Allmänläkare ()
4) Avsluta om
2) Om ålder = 14 'Ändra> med ='
3) Läkare = Allmänläkare ()
4) Avsluta om
2) Om ålder> = 14 'Ändra> med> ='
3) Läkare = Allmänläkare ()
4) Avsluta om
2) Om ålder med<=’
3) Läkare = Allmänläkare ()
4) Avsluta om
2) Om ålder = 14
3) ”ta bort läkaruppdraget”
4) Avsluta om
2) Om ålder> 14 år
3) Läkare = Mr.X (absolut värdeinsättning - låt oss säga att X är barnläkare)
4) Avsluta om
2) Om ålder %% 14 (felaktig syntax)
3) Läkare = Allmänläkare ()
4) Avsluta om
2) Om ålder> 14 & ålder> 14 ”betyder samma sak som ålder> 14”
3) Läkare = Allmänläkare ()
4) Avsluta om
Poäng att notera
vad är nätverkssäkerhetsnyckeln på en router
Slutsats
Rekommenderad läsning