Che cos'è il test unitario?
Test unitario è una parola autoesplicativa se si capisce cosa si intende per Unit. Un'unità è il più piccolo pezzo di codice possibile che può essere logicamente isolato dal sistema. Ciò significa che qualsiasi pezzo di codice che può prendere input, eseguire un'attività e generare output anche se indipendente dall'intero sistema o soluzione, può essere definito come Unità. Il test di questo pezzo di codice per generare l'output previsto su un determinato set di input è chiamato Unit Testing.
Tipi di test unitari
Discutiamo alcuni dei tipi di unit test.
1) Test manuale
Il test manuale del codice richiede allo sviluppatore di eseguire il debug manuale di ogni riga del codice e testarlo per la precisione. Potrebbe essere necessario un set di istruzioni passo per passo se la funzionalità è complessa.
2) Test automatizzati
Nel test di automazione, lo sviluppatore scrive il codice per testarlo. Questo è generalmente supportato da framework di unit test che non sono implementati in produzione. Altre volte, uno sviluppatore può scegliere di scrivere il codice di prova senza il framework e commentarlo manualmente prima della distribuzione.
I test manuali sembrano ovviamente richiedere molto tempo per la maggior parte dei casi. Ma per alcuni casi quando non è possibile scrivere casi di test automatizzati per coprire ogni singolo scenario, il manuale è spesso il metodo preferito.
Perché è importante il test unitario?
Per comprendere l'importanza dei test unitari, dobbiamo guardare al quadro generale. Fa parte del ciclo di vita dello sviluppo del software. Vediamo brevemente le altre parti per comprendere meglio il ruolo del Test unitario.
L'immagine sopra è una semplice illustrazione di un normale ciclo di vita di sviluppo del software e dei processi di test coinvolti. Inutile dire che, a seconda della struttura del progetto, l'intero processo varia con l'aggiunta e la rimozione di alcuni componenti. Il processo di test, tuttavia, coinvolge sicuramente quattro tipi come descritto di seguito:
- Unit Testing - Il livello elementare dell'intero processo di test. Questo viene eseguito dallo sviluppatore del componente o da uno dei suoi colleghi. In quest'ultimo caso, viene spesso definito come peer test nel mondo del software.
- Test di integrazione - Test del componente dell'unità con il suo modulo genitore immediato. L'obiettivo è verificare se il componente dell'unità si integra bene con gli altri componenti e non ha causato malfunzionamenti di altri componenti.
- Test dei sistemi - Test dell'intero sistema quando il componente dell'unità è posizionato nella sua posizione.
- Test di accettazione - Normalmente eseguito da aziende / clienti, verifica se il risultato è in linea con la funzionalità prevista dall'utente finale.
Pertanto, si può ben vedere che tutti i processi di test si basano sul livello elementare di test. Se il livello elementare di test non viene eseguito, tutti gli altri test potrebbero risultare inutili.
Ora supponiamo che tu abbia un codice che ha due parti
- Calcola l'interesse composto.
- Aggiungi l'interesse all'importo principale e calcola l'indennità di scadenza.
Supponiamo che tu non abbia testato nessuna di queste componenti e sia passato direttamente al test di sistema. Si verifica un errore nel test del sistema che il valore di maturità non è corretto. Ora quale parte del codice ha un errore?
- Può essere nel calcolo degli interessi.
- Può essere nell'applicare la logica di compounding.
- Può essere in aggiunta agli interessi sull'importo principale.
Vedi, come aumenta ora lo sforzo. Tutto ciò avrebbe potuto essere evitato se entrambi i componenti del codice fossero stati testati in unità.
Perché è importante il test unitario?
- Risolve i bug solo nella fase di sviluppo. Ciò consente di risparmiare molto tempo, fatica e costi. Immagina che se non ci fossero test unitari, il codice andrebbe da e verso il team di controllo qualità per problemi molto semplici.
- Buoni test unitari servono anche a scopo di documentazione dettagliata. Quando uno sviluppatore scrive casi di unit test, sta scrivendo inavvertitamente la funzionalità prevista del codice. Questo non è altro che documentazione che spiega il funzionamento del codice.
- Semplifica la modifica e la manutenzione del codice. Dopo aver apportato modifiche al codice, eseguire nuovamente i test e viola, tutti i difetti vengono rilevati senza problemi.
- Fa inoltre rispettare la modularità. I test unitari vengono eseguiti su singoli componenti, il che significa che il codice deve essere il più granulare possibile. Ciò garantisce che il codice sia opportunamente suddiviso in moduli.
L'altro lato della medaglia
Ha anche alcuni svantaggi. Sebbene i vantaggi pesino sugli svantaggi e si consiglia sempre di testare l'unità del codice, tuttavia ha anche senso conoscere entrambe le facce della stessa medaglia.
- I test unitari, per quanto accurati, a volte possono non riuscire a rilevare tutti gli errori anche nel codice più banale. Semplicemente non è possibile valutare tutti i percorsi di esecuzione. Pertanto, i test unitari sono spesso semplici scenari felici e scenari negativi.
- Richiede a uno sviluppatore di pensare fuori dagli schemi e provare a rompere il suo codice. Questo è spesso difficile poiché la percezione di uno sviluppatore viene distorta verso il codice.
Strumenti di unit test
Esistono diversi strumenti nel settore per assistere con casi di test di unità automatizzati. Come lo scopo, semplificano la scrittura e l'esecuzione di casi di test unitari per lo sviluppatore. Esiste un mondo di framework di unit test all'erogazione degli sviluppatori. Alcuni degli strumenti più popolari e ampiamente utilizzati sono elencati di seguito.
JUnit
JUnit è uno strumento di test gratuito per Java. Viene automaticamente incluso in molti modelli di progetto disponibili con vari IDE per lo sviluppo di Java. Ciò che rende speciale JUnit è che prima verifica i dati e quindi verifica il codice dopo aver inserito i dati in esso. Fornisce inoltre asserzioni per identificare i metodi di prova.
NUnit
NUnit è .Net come JUnit è Java. Ha tutte le caratteristiche salienti di JUnit, ma per lo sviluppo nel linguaggio di programmazione .Net. Supporta anche l'esecuzione dei test in parallelo.
PHPUnit
Simile a JUnit e NUnit, PHPUnit è uno strumento per sviluppatori PHP. Supporta anche tutte le funzionalità elementari di un buon strumento di test.
xUnit
Un altro framework che è più generico delle sue controparti è XUnit. Supporta più lingue come C ++, C #, ASP.Net, ecc. Vanta anche funzionalità simili a quelle di altri strumenti disponibili sul mercato.
jtest
Parasoft Jtest è un plugin di terze parti che sfrutta i framework open source come JUnit e aggiunge soluzioni con un clic per semplificare la vita. Con Jtest, puoi generare automaticamente codici di test per il tuo codice con pochi clic. Automatizzando queste attività, lo sviluppatore è libero di lavorare sulla logica aziendale dei casi di test.
QUnit
Un framework di test di unità JavaScript molto popolare. Può testare il codice JavaScript sia sul lato client che sul lato server.
Gelsomino
Un altro strumento di test molto utilizzato per i framework JavaScript. Ha un grande supporto comunitario per Angular, React, ecc.
JMockit
JMockIt è uno strumento open source che supporta anche il derisione delle chiamate API con sintassi di registrazione e verifica.
Esempio di caso di unit test
Un requisito fondamentale di ogni caso di test unitario è il codice da testare. Supponiamo di avere una funzione che convalida se i numeri di telefono sono corretti (in termini di formato) o meno. A seconda della posizione geografica, anche questo criterio può variare. Quindi, non sottolineeremo i criteri. Piuttosto ci concentreremo sul caso di test unitario.
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. */
)
)
Ora dobbiamo testare questo pezzo di codice.
Possiamo testarlo manualmente inserendo vari valori e verificando l'output. Questo può sembrare facile a prima vista ma sarà un'attività ripetuta se si apportano modifiche al codice.
In alternativa, possiamo scrivere un test unit unit che può fungere da mio validatore purché la logica aziendale rimanga la stessa. Il caso di test unitario non cambierà anche se cambiamo il codice. Quindi, scriviamo un caso di test unitario per il codice sopra.
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));
)
Quindi, come funziona il codice di test unitario sopra? Notare le due affermazioni Assert. Assicurano che il test passi solo se le due linee ricevono vero e falso dalle rispettive chiamate di funzione IsPhoneValid.
Chiederesti quali sono i vantaggi della scrittura di questo test? Bene, se hai migliaia di numeri di telefono da convalidare in qualsiasi scenario del mondo reale, non è necessario verificare manualmente ogni volta che il debugger colpisce il codice. Basta chiamare il codice di test migliaia di volte e ti dirà quali test hanno superato e quali non sono riusciti. Ora devi solo ispezionare quelli falliti.
Suggerimenti per i test unitari
- Utilizzare sempre uno strumento o un framework a supporto della propria lingua. Gli strumenti semplificano lo sviluppo di casi di test unitari. In caso contrario, potresti finire per impegnarti ulteriormente.
- Sebbene sia consigliato per tutto, a volte è conveniente saltare codici semplici e che non influiscono direttamente sul comportamento del sistema. Ad esempio, i codici getter e setter possono essere meno focalizzati su.
- Non saltare mai codici che incidono direttamente sul sistema o sono cruciali per l'implementazione della logica aziendale.
- Utilizzare i dati di test che ricordano i dati di produzione.
- Isola il tuo codice. Se il codice dipende dai dati del database, non scrivere un caso di prova per chiamare il database e ottenere valori. Invece, crea un'interfaccia e simula le chiamate API e database.
- Prima di correggere un bug derivante dal test dell'unità, scrivere il test case che espone il difetto. Ci sono tre ragioni per farlo:
- Sarai in grado di rilevare i difetti di regressione derivanti dalla tua correzione.
- Il tuo test case è ora più completo.
- Spesso uno sviluppatore è troppo pigro per aggiornare i suoi casi di test una volta scritti.
- Oltre a scrivere casi di test che verificano la logica aziendale, scrivere anche casi che testano le prestazioni del codice. Soprattutto quando i codici comportano il looping, le prestazioni sono l'area più colpita.
Cose da ricordare
- I casi di unit test dovrebbero essere indipendenti
- Il codice da testare - Qualsiasi modifica al codice non dovrebbe richiedere una modifica nel caso di test unitario a meno che la logica aziendale stessa non cambi. Ad esempio, se la logica richiede ora che un numero di telefono valido inizi sempre con "+", è necessario modificare il caso di test dell'unità, altrimenti no.
- L'altro codice : non dovrebbe esserci alcuna interazione o dipendenza con qualsiasi altro codice o valore del database o cose del genere. Un'unità deve essere isolata durante il test.
- Segui convenzioni di denominazione chiare e coerenti per i tuoi casi di test. Rende più facile tenere traccia degli scenari. È inoltre possibile utilizzare gli strumenti di controllo della versione per tenere traccia dei casi di test.
- Non passare mai il codice alla fase successiva fino a quando non è stato eseguito, i bug sono stati corretti e riprovati.
- Ancora più importante, rendilo un'abitudine. Questa è una pratica di codifica che deve essere inculcata. Più codice senza test unitari, più il tuo codice è soggetto a errori.
Carriera in unit test
Sebbene il test unitario non sia un campo nel suo insieme, è comunque una freccia aggiuntiva nella faretra. È una buona pratica di codifica e quando non sono preferiti i buoni programmatori?
Conclusione
Si può concludere indiscutibilmente che i test unitari possono essere semplici a volte e complessi altre volte. Questo è quando gli strumenti e le strutture vengono in tuo soccorso. Anche con il test dell'unità eseguito, il codice non è completamente a prova di errore. Questo è quando iniziano le procedure di test di livello successivo. Tra tutte queste incertezze, l'unica cosa certa è che è necessario il test unitario.
Articoli consigliati
Questa è stata una guida al test unitario. Qui abbiamo discusso dell'importanza, dei suggerimenti, degli strumenti, della carriera e dei tipi di test unitari con i suoi esempi. Puoi anche consultare i nostri altri articoli suggeriti per saperne di più -
- Test delle domande di intervista
- Applicazione di test Web
- Ciclo di vita dei difetti nei test del software
- Carriere nel test del software
- Elenco dei framework di test per Java