what is mutation testing
Questo tutorial spiega cos'è il test di mutazione, come eseguirlo e i tipi di test di mutazione con esempi:
Che cos'è il test di mutazione?
Il test di mutazione è una tecnica di test basata su errori in cui le variazioni di un programma software sono soggette al set di dati del test. Questo viene fatto per determinare l'efficacia del set di test nell'isolare le deviazioni.
Sembra un po 'complicato, non è vero?
Cosa imparerai:
Test di mutazione
Il Mutation Testing (MT) va molto lontano, negli anni '70, quando fu proposto per la prima volta come progetto scolastico. È stato cancellato perché richiedeva molte risorse. Tuttavia, poiché gli esseri umani hanno continuato a sviluppare computer più avanzati, è lentamente tornato in auge ed è ora una delle tecniche di test più popolari.
Definizione del test di mutazione
MT è anche noto come test basati su errori, mutazioni di programmi, test basati su errori, o analisi delle mutazioni .
Come suggerisce il nome, il test di mutazione è un tipo di test del software basato su modifiche o mutazioni. Minuscole modifiche vengono introdotte nel codice sorgente per verificare se i casi di test definiti possono rilevare errori nel codice.
Il caso ideale è che nessuno dei casi di test dovrebbe passare. Se il test viene superato, significa che c'è un errore nel codice. Diciamo che il mutante (la versione modificata del nostro codice) è vissuto. Se il test fallisce, non ci sono errori nel codice e il mutante è stato ucciso. Il nostro obiettivo è uccidere tutti i mutanti.
Il test di mutazione aiuta anche a testare la qualità dei casi di test definiti o delle suite di test con l'obiettivo di scrivere casi di test più efficaci. Più mutanti possiamo uccidere, maggiore è la qualità dei nostri test.
Concetti sui test di mutazione
Prima di discutere ulteriormente i test di mutazione, esploriamo alcuni concetti che incontreremo.
# 1) Mutanti: È semplicemente la versione mutata del codice sorgente. È il codice che contiene modifiche minime. Quando i dati del test vengono eseguiti attraverso il mutante, idealmente dovrebbero fornirci risultati diversi dal codice sorgente originale. Vengono anche chiamati mutanti programmi mutanti .
Esistono diversi tipi di mutanti. Questi sono i seguenti:
- Mutanti sopravvissuti: Come abbiamo accennato, questi sono i mutanti che sono ancora vivi dopo aver eseguito i dati di test attraverso le varianti originali e mutate del codice sorgente. Questi devono essere uccisi. Sono anche conosciuti come mutanti vivi.
- Mutanti uccisi: Questi sono mutanti che vengono uccisi dopo il test di mutazione. Otteniamo questi quando otteniamo risultati diversi dalla versione originale e modificata del codice sorgente.
- Mutanti equivalenti: Questi sono strettamente correlati ai mutanti vivi, in quanto sono 'vivi' anche dopo aver eseguito i dati dei test attraverso di essi. Ciò che li differenzia dagli altri è che hanno lo stesso significato del codice sorgente originale, anche se possono avere una sintassi diversa.
# 2) Mutatori / operatori di mutazione: Questo è ciò che rende possibili le mutazioni, sono al 'posto di guida'. Fondamentalmente definiscono il tipo di alterazione o modifica da apportare al codice sorgente per avere una versione mutante. Possono essere indicati come difetti o regole di mutazione .
# 3) Punteggio di mutazione: Questo è un punteggio basato sul numero di mutanti.
Viene calcolato utilizzando la formula seguente:
Nota che, i mutanti equivalenti non vengono considerati nel calcolo del punteggio di mutazione. Il punteggio di mutazione è anche noto come adeguatezza della mutazione . Il nostro obiettivo dovrebbe essere quello di ottenere un punteggio elevato di mutazione.
Come eseguire il test di mutazione
Passo 1: Scriviamo il nostro unit test Jasmine.
Test Suite (Jasmine)
describe('User', function() { it('should compare the two numbers from user input', function(){ expect(20).toBeGreaterThan(5); }) });
Passo 2: Scrivi il codice originale.
Codice originale (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();
Passaggio 3: Eseguiremo quindi il test attraverso il codice originale per assicurarci di non aver fallito i test sin dall'inizio. Dovremmo avere un output che comunichi che abbiamo effettivamente scritto un test con zero errori.
Per esempio:
finito in 0,019 s 1 specifica, 0 fallimenti, randomizzato con seme 31435
Risultato del codice originale:
Daughter's age is 5. Mother's age is 20. Welcome to the Mother-Daughter program
Passaggio 4: Presenta il mutante. In questo caso, cambiamo il file più grande di operator (mother_age> daughter_age) a un file minore di operator (mother_age Codice mutante (Javascript) Passaggio 5: Quindi eseguiamo il test attraverso il codice mutante. Ecco i risultati del test: finito in 0,017 s 1 specifica, 0 fallimenti, randomizzato con seme 89555 Risultato del codice mutante: Passaggio 6: Confronta i risultati della versione originale e della versione mutante. In questo caso, sono diversi, anche se è stata utilizzata la stessa suite di test. Abbiamo quindi ucciso il nostro mutante. La nostra suite di test è quindi pronta. Esistono diversi tipi di mutazioni. Questi sono spiegati di seguito. Qui, introduciamo una mutazione cambiando il parametro e / o i valori costanti, solitamente di +/- 1. Esempio: codice originale (Javascript) Se il codice sopra aveva lo scopo di moltiplicare i numeri pari dove io<4 , quindi la mutazione del valore significherebbe cambiare l'inizializzazione in sia io = 1 . Esempio: codice mutante (Javascript) Qui, cancelliamo o duplichiamo un'istruzione in un blocco di codice. Potremmo anche riorganizzare le istruzioni in un blocco di codice. In un blocco if-else, ad esempio, potremmo eliminare la parte else o anche l'intero blocco if-else. Esempio: codice originale (Javascript) Esempio: codice mutante (Javascript) L'obiettivo qui è il codice che prende le decisioni, per esempio, confronti di valore. Possiamo cambiare > a< come nel nostro esempio di programma Madre-Figlia. Altri operatori che possiamo cambiare includono quanto segue: I vantaggi del test di mutazione (MT) includono: Gli svantaggi del test di mutazione (MT) includono: Gli strumenti sono utili per accelerare il processo di generazione di mutanti. Ecco alcuni strumenti che possiamo utilizzare in MT: Stryker, Jumble, PIT e Insure ++. Impariamo da un esempio: Supponiamo che esista un sito ospedaliero che consente ai nuovi utenti di registrarsi. Legge la data di nascita o l'età del paziente. Se è maggiore di 14, assegna un medico generico come medico principale. Per fare ciò, richiama la funzione di 'medico generico' che trova il medico disponibile. Ora, potrebbero esserci altre funzionalità. Forse i pazienti sotto i 13 anni vengono assegnati a un pediatra e così via. Ma prenderemo solo il caso di età superiore ai 14 anni. Ecco come potrebbe apparire il codice: 1) Leggi Age Tieni presente che le righe di codice precedenti non sono specifiche di alcun linguaggio di programmazione e non verranno eseguite. È solo ipotetico. Come tester, se il mio set di dati è 14, 15, 0, 13 - alcuni numeri casuali. L'obiettivo è verificare se il set di dati dei 4 valori (14, 15, 0 e 3) è adeguato per identificare tutti i possibili problemi con questo codice. Leggi anche => Suggerimenti per progettare i dati di test prima di eseguire i test case In che modo il test di mutazione raggiunge questo obiettivo? Prima di tutto, crei mutanti-variazioni del programma. Un mutante non è altro che un programma scritto come deviazione. Contiene un errore auto-seminato. Esempi sono: Queste sostituzioni sono anche chiamate 'Operatori di mutazione'. Lascia che ti mostri degli esempi: Mutante # 1: operatore relazionalesostituzione 1) Leggi Età Mutante n. 2: 1) Leggi Età Mutante n. 3: 1) Leggi Età Mutante n. 4: 1) Leggi Età Mutante n. 5: rimozione delle dichiarazioni 1) Leggi Età Mutante n. 6: inserimento di valori assoluti 1) Leggi Età Mutante n. 7: sintassi errata 1) Leggi Età Mutante # 8: fa la stessa cosa del test originale 1) Leggi Età Una volta, tutti i mutanti vengono creati. Sono soggetti al set di dati di prova. Il nostro set è 14, 15, 0 e 13. Quale di questi mutanti troverà il nostro set di dati? Scoprilo nella tabella sottostante: (Clicca sull'immagine per ingrandirla) Come puoi vedere, il nostro valore di dati 14 trova i fallimenti quando funziona contro Mutant 2, 3 e 4. Oppure, 14 uccide i mutanti 2, 3 e 4. Ma è inefficace contro, 1, 6 e 8. Se il tuo set di dati uccide tutti i mutanti, è efficace. Altrimenti, includi più o migliori dati di test. Non è necessario che ciascun valore nel set di dati uccida tutti i mutanti. Ma insieme dovrebbero uccidere tutti.Per esempio:14 uccisioni 2, 3 e 4. 15 uccisioni 1, 2 e 4. E così via. Che ne dici di 5, 7 e 8? Mutante # 5 - è l'istanza del programma che fallirà indipendentemente dal valore dei dati fornito. Questo perché non eseguirà alcuna programmazione per valori validi e non validi. Mutante # 7 - sarà un errore di compilazione. O nel caso di un linguaggio di scripting un errore che impedirà l'esecuzione. Mutante n. 8 - è la stessa cosa del programma principale. Come puoi vedere, i mutanti di cui sopra non sono affatto utili. Pertanto, i mutanti da evitare sono: Stai pensando, se ci vuole così tanto impegno, cosa succederà quando dovrò testare grandi campioni di codice? Il test di mutazione si basa su due cose: Così, si concentra sulla più piccola unità di codice e ripone la sua fiducia nell'abilità del programmatore di adattare i test di mutazione a programmi più grandi. Questo tutorial ha trattato la definizione, i tipi e i passaggi del test di mutazione per eseguire questo test in dettaglio con esempi. Ci auguriamo che tu abbia apprezzato la lettura e l'apprendimento di questa interessante tecnica di test: il test delle mutazioni. Circa l'autore: Questo articolo è stato scritto dal membro del team STH Swati S. Per favore condividi i tuoi commenti, domande e pensieri di seguito. 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
Tipi di test di mutazione
# 1) Mutazione del valore
let arr = (2,3,4,5) for(let i=0; i
let arr = (2,3,4,5) for(let i=1; i
# 2) Mutazione dell'istruzione
let arr = (2,3,4,5) for(let i=0; i
let arr = (2,3,4,5) for(let i=0; i
# 3) Mutazione decisionale
Operatore originale Operatore mutante uno <= > = Due > = == 3 === == 4 e o 5 || &&
Strumenti per test di mutazione
Ulteriori informazioni sui test di mutazione
2) Se l'età> 14
3) Dottore = Medico generico ()
4) Finisci se
2) Se invecchia con<’
3) Dottore = Medico generico ()
4) Termina se
2) Se età = 14 'Modifica di> con ='
3) Dottore = Medico generico ()
4) Termina se
2) Se età> = 14 'Modifica di> con> ='
3) Dottore = Medico generico ()
4) Termina se
2) Se invecchia con<=’
3) Dottore = Medico generico ()
4) Termina se
2) Se l'età = 14
3) 'rimuovere la dichiarazione di assegnazione del medico'
4) Termina se
2) Se l'età> 14
3) Dottore = Sig. X (Inserimento di valore assoluto - diciamo che X è un pediatra)
4) Termina se
2) Se l'età %% 14 (sintassi errata)
3) Dottore = Medico generico ()
4) Termina se
2) Se età> 14 e età> 14 'significa la stessa cosa di età> 14'
3) Dottore = Medico generico ()
4) Termina se
Punti da notare
confronta due file in linux e trova le differenze
Conclusione
Lettura consigliata