what is mutation testing
Denne vejledning forklarer, hvad der er mutationstest, hvordan man udfører det, og mutationstesttyper med eksempler:
Hvad er mutationstest?
Mutationstest er en fejlbaseret testteknik, hvor variationer af et softwareprogram udsættes for testdatasættet. Dette gøres for at bestemme effektiviteten af testsættet til isolering af afvigelserne.
Det lyder lidt kompliceret, ikke?
Hvad du lærer:
Mutationstest
Mutation Testing (MT) går langt, tilbage til 70'erne, hvor det først blev foreslået som et skoleprojekt. Det blev afskrevet, da det var meget ressourceintensivt. Men da mennesker fortsatte med at udvikle mere avancerede computere, kom det langsomt tilbage og er nu en af de mest populære testteknikker.
Definition af mutationstest
MT er også kendt som fejlbaseret test, programmutation, fejlbaseret test, eller mutationsanalyse .
Som navnet antyder, er mutationstest en softwaretesttype, der er baseret på ændringer eller mutationer. Miniscule ændringer indføres i kildekoden for at kontrollere, om de definerede testtilfælde kan opdage fejl i koden.
Det ideelle tilfælde er, at ingen af testsagerne skal bestå. Hvis testen består, betyder det, at der er en fejl i koden. Vi siger, at mutanten (den ændrede version af vores kode) levede. Hvis testen mislykkes, er der ingen fejl i koden, og mutanten blev dræbt. Vores mål er at dræbe alle mutanter.
Mutationstest hjælper også med at teste kvaliteten af de definerede testsager eller testsuiterne med et forsøg på at skrive mere effektive testsager. Jo flere mutanter vi kan dræbe, jo højere er kvaliteten af vores tests.
Mutationstestningskoncepter
Før vi diskuterer mutationstest yderligere, lad os udforske nogle begreber, som vi vil støde på.
# 1) Mutanter: Det er simpelthen den muterede version af kildekoden. Det er koden, der indeholder små ændringer. Når testdataene køres gennem mutanten, skal de ideelt set give os forskellige resultater fra den oprindelige kildekode. Mutanter kaldes også mutante programmer .
Der er forskellige typer mutanter. Disse er som følger:
- Overlevede mutanter: Som vi har nævnt, er dette de mutanter, der stadig er i live efter at have kørt testdata gennem de originale og muterede varianter af kildekoden. Disse skal dræbes. De er også kendt som levende mutanter.
- Dræbte mutanter: Dette er mutanter, der dræbes efter mutationstest. Vi får disse, når vi får forskellige resultater fra de originale og muterede versioner af kildekoden.
- Ækvivalente mutanter: Disse er tæt knyttet til levende mutanter, idet de er 'levende' selv efter at have kørt testdata gennem dem. Hvad der adskiller dem fra andre er, at de har samme betydning som den oprindelige kildekode, selvom de måske har forskellige syntaks.
# 2) Mutatorer / mutationsoperatorer: Det er dette, der muliggør mutationer, de er på 'førersædet'. De definerer grundlæggende typen af ændring eller ændring, der skal foretages i kildekoden for at have en mutant version. De kan kaldes fejl eller mutationsregler .
# 3) Mutationsscore: Dette er en score baseret på antallet af mutanter.
Det beregnes ved hjælp af nedenstående formel:
Noter det, ækvivalente mutanter tages ikke i betragtning ved beregning af mutationsscore. Mutationsscore er også kendt som mutations tilstrækkelighed . Vores mål skal være at opnå en høj mutationsscore.
Sådan udføres mutationstest
Trin 1: Lad os skrive vores Jasmine-enhedstest.
Test Suite (Jasmine)
describe('User', function() { it('should compare the two numbers from user input', function(){ expect(20).toBeGreaterThan(5); }) });
Trin # 2: Skriv den originale kode.
Oprindelig kode (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();
Trin # 3: Vi kører derefter testen gennem den originale kode for at sikre, at vi ikke har mislykkede tests fra starten. Vi burde have noget output, der kommunikerer, at vi faktisk har skrevet en test med nul fejl.
For eksempel:
færdig i 0,019s 1 spec, 0 fiaskoer, randomiseret med frø 31435
Originalkodes resultat:
Daughter's age is 5. Mother's age is 20. Welcome to the Mother-Daughter program
Trin # 4: Indfør mutanten. I dette tilfælde ændrer vi bedre end operatør (moderalder> datteralder) til en mindre end operatør (moder_alder Mutant kode (Javascript) Trin # 5: Vi kører derefter testen gennem mutantkoden. Her er testresultaterne: færdig i 0,017s 1 spec, 0 fiaskoer, randomiseret med frø 89555 Mutantkodes resultat: Trin # 6: Sammenlign resultaterne fra den originale version og den mutante version. I dette tilfælde er de forskellige, selvom den samme testpakke blev brugt. Vi har derfor dræbt vores mutant. Vores testpakke er derfor god at gå. Der er flere typer mutationer. Disse forklares nedenfor. Her introducerer vi en mutation ved at ændre parameter- og / eller konstante værdier, normalt med +/- 1. Eksempel: Original kode (Javascript) Hvis ovenstående kode var beregnet til at multiplicere de lige tal hvor jeg<4 , ville værdimutation betyde at ændre initialiseringen til lad i = 1 . Eksempel: Mutant kode (Javascript) Her sletter eller kopierer vi en erklæring i en kodeblok. Vi kunne også omarrangere udsagn i en kodeblok. I en if-else-blok kunne vi for eksempel slette den ellers del eller endda hele if-else-blokken. Eksempel: Original kode (Javascript) Eksempel: Mutant kode (Javascript) Målet her er koden, der træffer beslutninger, for eksempel, værdisammenligninger. Vi kan ændre os > til< som i vores eksempel på Mother-Daughter-programmet. Andre operatører, som vi kan skifte, inkluderer følgende: Fordele ved mutationstest (MT) inkluderer: Ulemper ved mutationstest (MT) inkluderer: Værktøjer er nyttige til at fremskynde processen med generering af mutanter. Her er nogle værktøjer, som vi kan bruge i MT: Stryker, Jumble, PIT og Insure ++. Lad os lære af et eksempel: Sig, der er et hospitalsside, der lader nye brugere registrere. Den læser patientens fødselsdato eller alder. Hvis den er større end 14, tildeles en generel læge som deres hovedlæge. For at gøre dette påkalder den funktionen 'generel læge', der finder den tilgængelige læge. Nu kan der være anden funktionalitet. Måske bliver patienter under 13 tildelt en børnelæge og så videre. Men vi tager kun sagen over 14 år. Sådan kan koden se ud: 1) Læs Alder Bemærk, at ovenstående kodelinjer ikke er specifikke for noget programmeringssprog og ikke kører. Det er bare hypotetisk. Som en tester, hvis mit datasæt er 14, 15, 0, 13 - nogle tilfældige tal. Målet er at kontrollere, om datasættet med de 4 værdier (14, 15, 0 og 3) er tilstrækkeligt til at identificere alle mulige problemer med denne kode. Læs også => Tips til at designe testdata, før du udfører dine testsager Hvordan opnår mutationstest dette? Først og fremmest opretter du mutanter - variationer af programmet. En mutant er intet andet end et program, der er skrevet som en afvigelse. Den indeholder en selvsået fejl. Eksempler er: Disse udskiftninger kaldes også 'Mutationsoperatører.' Lad mig vise dig eksempler: Mutant nr. 1: relationsoperatørudskiftning 1) Læs alder Mutant nr. 2: 1) Læs alder Mutant nr. 3: 1) Læs alder Mutant # 4: 1) Læs alder Mutant nr. 5: Fjernelse af udsagn 1) Læs alder Mutant nr. 6: Absolut værdiindsættelse 1) Læs alder Mutant nr. 7: Forkert syntaks 1) Læs alder Mutant nr. 8: Gør det samme som den originale test 1) Læs alder Én gang oprettes alle mutanterne. De udsættes for testdatasættet. Vores sæt er 14, 15, 0 og 13. Hvilke af disse mutanter finder vores datasæt? Find ud af nedenstående tabel: (Klik på billedet for at se et forstørret billede) Som du kan se, finder vores dataværdi 14 fejl, når den kører mod, Mutant 2, 3 og 4. Eller 14 dræber mutanter 2, 3 & 4. Men det er ineffektivt mod, 1, 6 og 8. Hvis dit datasæt dræber alle mutanter, er det effektivt. Ellers skal du inkludere flere eller bedre testdata. Det er ikke nødvendigt for hver værdi i datasættet at dræbe alle mutanter. Men sammen skal de dræbe alle.For eksempel:14 dræber 2, 3 og 4. 15 dræber 1, 2 og 4. Og så videre. Hvad med 5, 7 og 8? Mutant # 5 - er programforekomsten, der vil mislykkes, uanset hvilken dataværdi du angiver. Dette skyldes, at det ikke foretager nogen programmering for både gyldige og ugyldige værdier. Mutant nr. 7 - vil være en kompileringsfejl. Eller i tilfælde af et scriptsprog en fejl, der forhindrer udførelse. Mutant # 8 - er det samme som hovedprogrammet. Som du kan se, er ovenstående mutanter overhovedet ikke nyttige. Derfor er mutanter, der skal undgås: Tænker du, hvis det kræver så stor indsats, hvad sker der, når jeg skal teste store kodeeksempler? Mutationstest bygger på to ting: Så, det fokuserer på den mindste kodeenhed og sætter sin tillid til programmørens dygtighed til at skalere mutationstest til større programmer. Denne vejledning dækkede definition, typer og trin til mutationstest for at udføre denne test i detaljer med eksempler. Vi håber du har nydt at læse og lære om denne interessante testteknik - Mutation Testing. Om forfatteren: Denne artikel er skrevet af STH-teammedlem Swati S. Del dine kommentarer, spørgsmål og tanker nedenfor. 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ærdimutation
let arr = (2,3,4,5) for(let i=0; i
let arr = (2,3,4,5) for(let i=1; i
# 2) Statement Mutation
let arr = (2,3,4,5) for(let i=0; i
let arr = (2,3,4,5) for(let i=0; i
# 3) Beslutningsmutation
Oprindelig operatør Mutant operatør en <= > = to > = == 3 === == 4 og eller 5 || &&
Værktøjer til mutationstest
Mere om mutationstest
2) Hvis alder> 14
3) Læge = overlæge ()
4) Afslut Hvis
2) Hvis alder med<’
3) Læge = Overlæge ()
4) Afslut hvis
2) Hvis alder = 14 'Ændring af> med ='
3) Læge = Overlæge ()
4) Afslut hvis
2) Hvis alder> = 14 'Ændring af> med> ='
3) Læge = Overlæge ()
4) Afslut hvis
2) Hvis alder med<=’
3) Læge = Overlæge ()
4) Afslut hvis
2) Hvis alder = 14
3) 'fjern erklæringen fra lægeopgaven'
4) Afslut hvis
2) Hvis alder> 14 år
3) Læge = Mr.X (absolut værdiindsættelse - lad os sige X er en børnelæge)
4) Afslut hvis
2) Hvis alder %% 14 (forkert syntaks)
3) Læge = Overlæge ()
4) Afslut hvis
2) Hvis alder> 14 og alder> 14 'betyder det samme som alder> 14'
3) Læge = Overlæge ()
4) Afslut hvis
Punkter at bemærke
hvordan man laver et generisk array i java
Konklusion
Anbefalet læsning