what is mutation testing
Acest tutorial explică ce este testarea mutației, cum să o efectuați și tipurile de testare a mutației cu exemple:
Ce este testarea mutației?
Testarea mutației este o tehnică de testare bazată pe erori în care variațiile unui program software sunt supuse setului de date de testare. Acest lucru se face pentru a determina eficacitatea setului de testare în izolarea abaterilor.
Sună puțin complicat, nu-i așa?
Ce veți învăța:
Testarea mutației
Testarea mutației (MT) merge mult, înapoi în anii 70, unde a fost propusă pentru prima dată ca proiect școlar. A fost anulat, deoarece consuma foarte multe resurse. Cu toate acestea, pe măsură ce oamenii au continuat să dezvolte computere mai avansate, a revenit încet și este acum una dintre cele mai populare tehnici de testare.
Definiția testării mutației
MT este, de asemenea, cunoscut sub numele de testarea bazată pe erori, mutația programului, testarea bazată pe erori, sau analiza mutației .
După cum sugerează și numele, testarea mutației este un tip de testare software care se bazează pe modificări sau mutații. Modificările minuscule sunt introduse în codul sursă pentru a verifica dacă cazurile de test definite pot detecta erori în cod.
Cazul ideal este ca niciunul dintre cazurile de testare să nu treacă. Dacă testul trece, atunci înseamnă că există o eroare în cod. Spunem că mutantul (versiunea modificată a codului nostru) a trăit. Dacă testul eșuează, atunci nu există nicio eroare în cod și mutantul a fost ucis. Scopul nostru este să ucidem toți mutanții.
Testarea mutației ajută, de asemenea, la testarea calității cazurilor de testare definite sau a suitelor de testare, în încercarea de a scrie cazuri de testare mai eficiente. Cu cât putem ucide mai mulți mutanți, cu atât este mai mare calitatea testelor noastre.
Concepte de testare a mutațiilor
Înainte de a discuta în continuare despre testarea mutațiilor, permiteți-ne să explorăm câteva concepte pe care le vom întâlni.
# 1) Mutanți: Este pur și simplu versiunea mutată a codului sursă. Codul conține modificări minuscule. Când datele de testare sunt rulate prin mutant, în mod ideal ar trebui să ne ofere rezultate diferite de codul sursă original. Mutanții sunt, de asemenea, numiți programe mutante .
Există diferite tipuri de mutanți. Acestea sunt după cum urmează:
- Mutanți supraviețuiți: După cum am menționat, acestea sunt mutanții care sunt încă în viață după ce au rulat datele de testare prin variantele originale și mutate ale codului sursă. Acestea trebuie ucise. Sunt cunoscuți și sub numele de mutanți vii.
- Mutanti ucisi: Acestea sunt mutanți care sunt uciși după testarea mutației. Le obținem atunci când obținem rezultate diferite din versiunile originale și mutate ale codului sursă.
- Mutanți echivalenți: Acestea sunt strâns legate de mutanții vii, în sensul că sunt „vii” chiar și după ce au rulat date de testare prin ei. Ceea ce îi diferențiază de ceilalți este că au aceeași semnificație ca și codul sursă original, chiar dacă pot avea o sintaxă diferită.
# 2) Mutatori / operatori de mutație: Acestea fac posibile mutațiile, sunt pe „scaunul șoferului”. Acestea definesc practic tipul de modificare sau modificare pe care trebuie să o faceți codului sursă pentru a avea o versiune mutantă. Acestea pot fi denumite defecte sau reguli de mutație .
# 3) Scorul mutației: Acesta este un scor bazat pe numărul de mutanți.
Se calculează folosind formula de mai jos:
Rețineți că, mutanții echivalenți nu sunt luați în considerare la calcularea scorului mutației. Scorul mutației este, de asemenea, cunoscut sub numele de adecvarea mutației . Scopul nostru ar trebui să fie obținerea unui scor de mutație ridicat.
Cum se face testarea mutației
Pasul 1: Să scriem testul nostru unitar Jasmine.
Test Suite (Jasmine)
describe('User', function() { it('should compare the two numbers from user input', function(){ expect(20).toBeGreaterThan(5); }) });
Pasul 2: Scrieți codul original.
Cod original (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();
Pasul 3: Apoi vom rula testul prin codul original pentru a ne asigura că nu am reușit testele de la început. Ar trebui să avem o ieșire care să comunice faptul că am scris într-adevăr un test cu zero eșecuri.
De exemplu:
terminat în 0,019s 1 spec, 0 eșecuri, randomizat cu semința 31435
Rezultatul codului original:
Daughter's age is 5. Mother's age is 20. Welcome to the Mother-Daughter program
Pasul 4: Introduceți mutantul. În acest caz, schimbăm mai mare ca operator (mother_age> daughter_age) la a mai puțin de operator (mother_age Cod mutant (Javascript) Pasul 5: Apoi vom rula testul prin codul mutant. Iată rezultatele testului: terminat în 0,017s 1 spec, 0 eșecuri, randomizat cu semința 89555 Rezultatul codului mutant: Pasul 6: Comparați rezultatele din versiunea originală și versiunea mutantă. În acest caz, ele sunt diferite, chiar dacă a fost utilizată aceeași suită de testare. Prin urmare, ne-am ucis mutantul. Prin urmare, suita noastră de testare este bună. Există mai multe tipuri de mutații. Acestea sunt explicate mai jos. Aici, introducem o mutație schimbând parametrul și / sau valorile constante, de obicei cu +/- 1. Exemplu: cod original (Javascript) Dacă codul de mai sus a fost menit să înmulțească numerele pare unde eu<4 , atunci mutația valorică ar însemna schimbarea inițializării în să i = 1 . Exemplu: cod mutant (Javascript) Aici, ștergem sau duplicăm o declarație într-un bloc de cod. De asemenea, am putea rearanja declarațiile într-un bloc de cod. Într-un bloc if-else, de exemplu, am putea șterge partea else sau chiar întregul bloc if-else. Exemplu: cod original (Javascript) Exemplu: cod mutant (Javascript) Ținta aici este codul care ia decizii, de exemplu, comparații de valori. Ne putem schimba > la< ca în exemplul nostru de program Mama-Fiică. Alți operatori pe care îi putem schimba includ următorii: Avantajele testării mutațiilor (MT) includ: Dezavantajele testării mutațiilor (MT) includ: Instrumentele sunt utile pentru a accelera procesul de generare a mutanților. Iată câteva instrumente pe care le putem folosi în MT: Stryker, Jumble, PIT și Insure ++. Să învățăm dintr-un exemplu: Spuneți, există un site de spital care permite noilor utilizatori să se înregistreze. Se citește data nașterii sau vârsta pacientului. Dacă este mai mare de 14, desemnează un medic general ca medic principal. Pentru a face acest lucru, invocă funcția „medic general” care găsește medicul disponibil. Acum, ar putea exista și alte funcționalități. Poate că pacienții sub 13 ani sunt repartizați la un medic pediatru și așa mai departe. Dar vom lua doar cazul vârstei de peste 14 ani. Iată cum ar putea arăta codul: 1) Citește Vârsta Rețineți că liniile de cod de mai sus nu sunt specifice niciunui limbaj de programare și nu vor rula. Este doar ipotetic. Ca tester, dacă setul meu de date este 14, 15, 0, 13 - unele numere aleatorii. Ținta este de a verifica dacă setul de date al celor 4 valori (14, 15, 0 și 3) este adecvat pentru a identifica toate problemele posibile cu acest cod. Citește și => Sfaturi pentru proiectarea datelor de test înainte de a vă executa cazurile de testare Cum realizează testarea mutației? În primul rând, creați mutanți - variații ale programului. Un mutant nu este altceva decât un program care este scris ca o abatere. Conține un defect auto-însămânțat. Exemple sunt: Aceste înlocuiri sunt, de asemenea, numite „Operatori de mutație”. Permiteți-mi să vă arăt exemple: Mutant # 1: Operator relaționalînlocuire 1) Citește Vârsta Mutant # 2: 1) Citește Vârsta Mutant # 3: 1) Citește Vârsta Mutant # 4: 1) Citește Vârsta Mutant # 5: Eliminarea declarației 1) Citește Vârsta Mutant # 6: inserarea valorii absolute 1) Citește Vârsta Mutant # 7: sintaxă incorectă 1) Citește Vârsta Mutant # 8: Face același lucru ca și testul original 1) Citește Vârsta Odată, toți mutanții sunt creați. Acestea sunt supuse setului de date de testare. Setul nostru este 14, 15, 0 și 13. Care dintre acești mutanți va găsi setul nostru de date? Aflați în tabelul de mai jos: (Faceți clic pe imagine pentru o vizualizare mărită) După cum puteți vedea, valoarea noastră de date 14 găsește eșecuri atunci când rulează împotriva, Mutant 2, 3 și 4. Sau, 14 ucide mutanții 2, 3 și 4. Dar, este ineficient împotriva, 1, 6 și 8. Dacă setul dvs. de date ucide toți mutanții, este eficient. În caz contrar, includeți mai multe sau mai bune date de testare. Nu este necesar ca fiecare valoare din setul de date să ucidă toți mutanții. Dar împreună, ar trebui să-i omoare pe toți.De exemplu:14 ucide 2, 3 și 4. 15 ucide 1, 2 și 4. Și așa mai departe. Dar 5, 7 și 8? Mutant # 5 - este instanța de program care va eșua indiferent de orice valoare a datelor pe care o dați. Acest lucru se datorează faptului că nu va face nicio programare atât pentru valori valide, cât și pentru valori nevalide. Mutant # 7 - va fi o eroare de compilare. Sau în cazul unui limbaj de scriptare o eroare care va împiedica executarea. Mutant # 8 - este același lucru cu programul principal. După cum puteți vedea, mutanții de mai sus nu sunt deloc utili. Prin urmare, mutanții de evitat sunt: Vă gândiți, dacă este nevoie de atât de mult efort, ce se va întâmpla când va trebui să testez mostre mari de cod? Testarea mutației se bazează pe două lucruri: Asa de, se concentrează pe cea mai mică unitate de cod și își pune credința în abilitățile programatorului de a scala testarea mutației la programe mai mari. Acest tutorial a acoperit definiția, tipurile și pașii testării mutațiilor pentru a efectua această testare în detaliu cu exemple. Sperăm că v-a plăcut să citiți și să învățați despre această tehnică de testare interesantă - Testarea mutației. Despre autor: Acest articol este scris de Swati S., membru al echipei STH. Vă rugăm să împărtășiți comentariile, întrebările și gândurile de mai jos. 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
Tipuri de testare a mutației
# 1) Mutație de valoare
let arr = (2,3,4,5) for(let i=0; i
let arr = (2,3,4,5) for(let i=1; i
# 2) Declarație mutație
let arr = (2,3,4,5) for(let i=0; i
let arr = (2,3,4,5) for(let i=0; i
# 3) Mutație decizională
Operator original Operator mutant 1 <= > = Două > = == 3 === == 4 și sau 5 || &&
Instrumente de testare a mutației
Mai multe despre testarea mutației
Două) Dacă vârsta> 14 ani
3) Doctor = Medic general ()
4) Încheie dacă
2) Dacă vârsta cu<’
3) Doctor = Medic general ()
4) Încheiați dacă
2) Dacă vârsta = 14 „Schimbarea> cu =”
3) Doctor = Medic general ()
4) Încheiați dacă
2) Dacă vârsta> = 14 „Schimbarea> cu> =”
3) Doctor = Medic general ()
4) Încheiați dacă
2) Dacă vârsta cu<=’
3) Doctor = Medic general ()
4) Încheiați dacă
2) Dacă vârsta = 14
3) „eliminați declarația de atribuire a medicului”
4) Încheiați dacă
2) Dacă vârsta> 14 ani
3) Doctor = Mr.X (Inserarea valorii absolute - să zicem că X este pediatru)
4) Încheiați dacă
2) Dacă vârsta %% 14 (sintaxă incorectă)
3) Doctor = Medic general ()
4) Încheiați dacă
2) Dacă vârsta> 14 și vârsta> 14 „înseamnă același lucru cu vârsta> 14”
3) Doctor = Medic general ()
4) Încheiați dacă
Puncte de remarcat
implementarea tabelului hash c ++
Concluzie
Lectură recomandată