Test di qualità

Tipi di test del software

Tipi di test del software
La strategia per testare ogni prodotto software è diversa. Dobbiamo considerare gli obiettivi aziendali e/o lo scopo del software prima di sviluppare la strategia di test del software. Ad esempio, il software che funziona su un aereo, che controlla il motore e la sicurezza del volo, ha un contesto aziendale diverso rispetto a una piattaforma di condivisione di video virali su Internet per bambini. Per il software dell'aeroplano, è molto critico che assolutamente tutto sia definito e verificato. Lo sviluppo e il cambiamento rapidi di nuove funzionalità non sono una priorità. Per la piattaforma video virale, l'azienda ha bisogno di innovazione, velocità e miglioramento rapido, che sono molto più importanti della validazione garantita del sistema. Ogni contesto è diverso e ci sono molte pratiche diverse per il test del software. La creazione della strategia di test consisterà in una combinazione dei tipi di test appropriati dall'elenco dei possibili tipi di test, che sono classificati di seguito. In questo articolo elencheremo diversi tipi di test del software.

Test dell'unità

Il test unitario è un test eseguito su una singola funzione, classe o modulo in modo indipendente rispetto al test di un software completamente funzionante. Utilizzando un framework per i test di unità, il programmatore può creare casi di test con input e output previsto. Quando si hanno centinaia, migliaia o decine di migliaia di casi di test di unità per un grande progetto software, si garantisce che tutte le singole unità funzionino come previsto mentre si continua a modificare il codice. Quando si modifica un'unità che ha casi di test, i casi di test per quel modulo dovrebbero essere studiati e determinare se sono necessari nuovi casi di test, l'output è cambiato o i casi di test correnti possono essere rimossi in quanto non più rilevanti. La creazione di un grande volume di unit test è il modo più semplice per ottenere un'elevata copertura del test case per una base di codice software, ma non garantisce che il prodotto finale funzioni come previsto come sistema.

Test Funzionali

Il test funzionale è la forma più comune di test. Quando le persone si riferiscono ai test del software senza troppi dettagli, spesso intendono test funzionali. Il test funzionale verificherà che le funzioni primarie del software funzionino come previsto. Potrebbe essere scritto un piano di test per descrivere tutti i casi di test funzionali che verranno testati, che corrisponde alle principali caratteristiche e capacità del software. Il test della funzionalità primaria sarà "percorso felice” testing, che non tenta di violare il software o utilizzarlo in scenari difficili challenging. Questo dovrebbe essere il minimo assoluto di test per qualsiasi progetto software.

Test d'integrazione

Dopo il test dell'unità e il test funzionale, potrebbero esserci diversi moduli o l'intero sistema che non è stato ancora testato nel suo insieme. Oppure potrebbero esserci componenti in gran parte indipendenti ma occasionalmente utilizzati insieme. Ogni volta che i componenti o i moduli vengono testati in modo indipendente ma non come un intero sistema, è necessario eseguire test di integrazione per convalidare la funzione dei componenti insieme come un sistema funzionante in base ai requisiti e alle aspettative dell'utente.

Test da sforzo

Pensa allo stress test come se stessi testando una navetta spaziale o un aeroplano. Cosa significa mettere il proprio software o sistema sotto “STRESS”? Lo stress non è altro che un carico intenso di un tipo specifico che ha maggiori probabilità di danneggiare il tuo sistema. Questo potrebbe essere simile a "Load Testing" nel senso di mettere il tuo sistema in alta simultaneità con molti utenti che accedono al sistema. Ma sottolineare un sistema potrebbe accadere anche su altri vettori. Ad esempio, l'esecuzione del firmware su un componente hardware quando l'hardware ha subito un deterioramento fisico e funziona in modalità degradata. Lo stress è unico per tutti i tipi di software e i sistemi e la progettazione di stress test dovrebbero essere considerati quali cause naturali o innaturali hanno maggiori probabilità di stressare il software o il sistema.

Prova di carico

Il test di carico è un tipo specifico di stress test, come discusso sopra, in cui un numero elevato di connessioni e accessi utente simultanei viene automatizzato per generare la simulazione dell'effetto di un gran numero di utenti autentici che accedono contemporaneamente al sistema software. L'obiettivo è scoprire quanti utenti possono accedere al tuo sistema contemporaneamente senza che il tuo sistema software si rompa. Se il tuo sistema può gestire facilmente il traffico normale di 10.000 utenti, cosa accadrà se il tuo sito Web o software diventa virale e ottiene 1 milione di utenti? Sarà questo inaspettato? "CARICARE" rompere il tuo sito web o sistema or? Il test di carico simulerà questo, quindi ti senti a tuo agio con il futuro aumento degli utenti perché sai che il tuo sistema può gestire l'aumento del carico.

Test delle prestazioni

Le persone possono diventare completamente frustrate e disperate quando il software non soddisfa i loro requisiti di prestazioni. Le prestazioni, in generale, significano quanto velocemente le funzioni importanti possono essere completate. Più complesse e dinamiche sono le funzioni disponibili in un sistema, più importante e non ovvio diventa testarne le prestazioni, facciamo un esempio base, sistema operativo Windows o Linux. Un sistema operativo è un prodotto software altamente complesso e l'esecuzione di test delle prestazioni sul suo sistema potrebbe comportare la velocità e la tempistica di funzioni come l'avvio, l'installazione di un'app, la ricerca di un file, l'esecuzione di calcoli su una GPU e/o qualsiasi altro i milioni di azioni che si possono compiere. Prestare attenzione quando si selezionano i casi di test delle prestazioni, per garantire le caratteristiche delle prestazioni testate importanti e suscettibili di malfunzionamento.

Test di scalabilità

Il test sul tuo laptop è buono, ma non abbastanza buono quando stai costruendo un social network, un sistema di posta elettronica o un software per supercomputer. Quando il tuo software deve essere distribuito su 1000 server, tutti funzionanti all'unisono, i test che esegui localmente su un sistema non scopriranno i bug che si verificano quando il software viene distribuito "su scala" su centinaia di migliaia di istanze. In realtà, i tuoi test probabilmente non potranno mai essere eseguiti su vasta scala prima di essere rilasciati in produzione perché sarebbe troppo costoso e non pratico costruire un sistema di test con 1000 server che costano milioni di dollari. Pertanto, i test di scalabilità vengono eseguiti su più server, ma di solito non sull'intero numero di server di produzione per cercare di scoprire alcuni dei difetti che potrebbero essere rilevati quando i sistemi vengono utilizzati su un'infrastruttura più grande.

Test di analisi statica

L'analisi statica è un test eseguito ispezionando il codice del software senza eseguirlo effettivamente. Per fare analisi statiche, generalmente, useresti uno strumento, ce ne sono molti, uno strumento famoso è Coverity. L'analisi statica è facile da eseguire prima di rilasciare il software e può trovare molti problemi di qualità nel codice che possono essere risolti prima del rilascio. È possibile trovare errori di memoria, errori di gestione del tipo di dati, dereferenziamenti di puntatori nulli, variabili non inizializzate e molti altri difetti. Linguaggi come C e C++ traggono grande vantaggio dall'analisi statica perché i linguaggi offrono grande libertà ai programmatori in cambio di una grande potenza, ma questo può anche creare grandi bug ed errori che possono essere trovati utilizzando i test di analisi statica.

Test di iniezione dei guasti

Alcune condizioni di errore sono molto difficili da simulare o attivare, quindi il software può essere progettato per iniettare artificialmente un problema o un guasto nel sistema senza che il difetto si presenti naturalmente. Lo scopo del test di iniezione di errori è vedere come il software gestisce questi errori imprevisti. Risponde con grazia alla situazione, si blocca o produce risultati problematici inaspettati e imprevedibili?? Ad esempio, supponiamo di avere un sistema bancario e c'è un modulo per trasferire fondi internamente dal CONTO A al CONTO B. Tuttavia, questa operazione di trasferimento viene chiamata solo dopo che il sistema ha già verificato l'esistenza di questi account prima di chiamare l'operazione di trasferimento. Anche se supponiamo che entrambi gli account esistano, l'operazione di trasferimento ha un caso di errore in cui non esiste un account di destinazione o di origine e che può generare un errore. Perché in circostanze normali non riceviamo mai questo errore a causa del pre-test degli input, quindi per verificare il comportamento del sistema quando il trasferimento fallisce a causa di un account inesistente, iniettiamo un falso errore nel sistema che restituisce un account inesistente per un trasferimento e testare come risponde il resto del sistema in quel caso. È molto importante che il codice di iniezione di errore sia disponibile solo in scenari di test e non rilasciato in produzione, dove potrebbe creare scompiglio.

Test di sovraccarico della memoria

Quando si utilizzano linguaggi come C o C++, il programmatore ha una grande responsabilità nell'indirizzare direttamente la memoria e questo può causare errori fatali nel software se vengono commessi errori. Ad esempio, se un puntatore è nullo e viene dereferenziato, il software andrà in crash. Se la memoria viene allocata a un oggetto e quindi viene copiata una stringa sullo spazio di memoria dell'oggetto, il riferimento all'oggetto può causare un arresto anomalo o persino un comportamento errato non specificato. Pertanto, è fondamentale utilizzare uno strumento per cercare di rilevare gli errori di accesso alla memoria nel software che utilizza linguaggi come C o C++, che potrebbero avere questi potenziali problemi. Gli strumenti che possono eseguire questo tipo di test includono Valgrind Open Source o strumenti proprietari come PurifyPlus. Questi strumenti possono salvare il giorno quando non è chiaro il motivo per cui il software si blocca o si comporta in modo anomalo e puntano direttamente alla posizione nel codice che ha il bug. Fantastico, vero??

Test dei casi limite

È facile commettere errori nella codifica quando sei su quello che viene chiamato confine. Ad esempio, un bancomat della banca dice che puoi prelevare un massimo di $ 300. Quindi, immagina che il programmatore abbia scritto il seguente codice in modo naturale durante la creazione di questo requisito:

Se (amt < 300)
inizioPrelievo()

altro
error(“Puoi prelevare %s”, amt);

Riesci a individuare l'errore?? L'utente che tenta di prelevare $ 300 riceverà un errore perché non è inferiore a $ 300. Questo è un bug. Pertanto, il test di confine viene eseguito in modo naturale. I limiti dei requisiti garantiscono quindi che su entrambi i lati del confine e del confine, il software funzioni correttamente.

Test fuzz

La generazione ad alta velocità di input per il software può produrre quante più possibili combinazioni di input, anche se tali combinazioni di input sono totalmente assurde e non sarebbero mai fornite da un utente reale. Questo tipo di test fuzz può trovare bug e vulnerabilità di sicurezza non rilevati con altri mezzi a causa dell'elevato volume di input e scenari testati rapidamente senza generazione manuale di casi di test.

Test esplorativi

Chiudi gli occhi e visualizza cosa significa la parola "Esplora". Stai osservando e sondando un sistema per scoprire come funziona veramente. Immagina di ricevere una nuova sedia da scrivania per corrispondenza e ha 28 parti tutte in sacchetti di plastica separati senza istruzioni. Devi esplorare il tuo nuovo arrivo per capire come funziona e come è messo insieme. Con questo spirito, puoi diventare un tester esplorativo. Non avrai un piano di test ben definito di casi di test. Esplorerai e analizzerai il tuo software alla ricerca di cose che ti facciano pronunciare la meravigliosa parola: “INTERESSANTE!". Dopo aver appreso, esplori ulteriormente e trovi modi per violare il software a cui i progettisti non hanno mai pensato, quindi fornisci un rapporto che dettaglia numerosi presupposti, errori e rischi errati nel software. Scopri di più su questo nel libro chiamato Explore It.

Test di penetrazione

Nel mondo della sicurezza del software, il test di penetrazione è uno dei principali mezzi di test. Tutti i sistemi, siano essi biologici, fisici o software, hanno confini e confini. Questi limiti hanno lo scopo di consentire l'ingresso nel sistema solo di messaggi, persone o componenti specifici. Più concretamente, consideriamo un sistema bancario online che utilizza l'autenticazione dell'utente per accedere al sito. Se il sito può essere violato e inserito nel back-end senza un'adeguata autenticazione, si tratterebbe di una penetrazione, che deve essere protetta contro. L'obiettivo del test di penetrazione è utilizzare tecniche note e sperimentali per aggirare il normale confine di sicurezza di un sistema software o di un sito web. Il test di penetrazione spesso comporta il controllo di tutte le porte in ascolto e il tentativo di accedere a un sistema tramite una porta aperta. Altre tecniche comuni includono SQL injection o password cracking.

Test di regressione

Dopo aver installato sul campo un software funzionante, è fondamentale prevenire l'introduzione di bug in funzionalità che già funzionavano. Lo scopo dello sviluppo del software è aumentare la capacità del prodotto, introdurre bug o impedire il funzionamento di vecchie funzionalità, operazione chiamata REGRESSIONE. La regressione è un bug o un difetto che è stato introdotto quando in precedenza la funzionalità funzionava come previsto. Niente può rovinare la reputazione del tuo software o marchio più velocemente dell'introduzione di bug di regressione nel tuo software e che utenti reali trovino questi bug dopo un rilascio.

I casi di test di regressione e i piani di test dovrebbero essere costruiti attorno alla funzionalità di base che deve continuare a funzionare per garantire che gli utenti abbiano una buona esperienza con la tua applicazione. Tutte le funzioni principali del tuo software che gli utenti si aspettano di lavorare in un certo modo dovrebbero avere un test di regressione che può essere eseguito per evitare che la funzionalità si interrompa su una nuova versione. Potrebbe trattarsi di un numero compreso tra 50 e 50.000 casi di test che coprono le funzionalità principali del software o dell'applicazione.

Test di bisezione del codice sorgente

È stato introdotto un bug nel software, ma non è ovvio quale versione del rilascio abbia introdotto il nuovo bug. Immagina che ci siano stati 50 commit software dall'ultima volta in cui il software funzionava senza il bug, fino ad ora quando..

Test di localizzazione

Immagina un'applicazione meteo che mostra il tempo attuale e previsto nella tua posizione, oltre a una descrizione delle condizioni meteorologiche. La prima parte del test di localizzazione è garantire che la lingua, l'alfabeto e i caratteri corretti vengano visualizzati correttamente, a seconda della geolocalizzazione dell'utente. L'app nel Regno Unito dovrebbe essere visualizzata in inglese con caratteri latini; la stessa App in Cina dovrebbe essere visualizzata in caratteri cinesi nella lingua cinese. Test di localizzazione più elaborati eseguiti, la gamma più ampia di persone provenienti da diverse geolocalizzazioni si interfaccerà con l'applicazione.

Test di accessibilità

Alcuni dei cittadini della nostra comunità hanno disabilità e, pertanto, potrebbero avere problemi nell'utilizzo del software in fase di creazione, quindi vengono eseguiti test di accessibilità per garantire che le popolazioni con disabilità possano ancora accedere alle funzionalità del sistema. Ad esempio, se supponiamo che l'1% della popolazione sia daltonico e la nostra interfaccia software presuppone che gli utenti possano distinguere tra Rosso e Verde, ma quegli individui daltonici NON POSSONO dire la differenza. Pertanto, un'interfaccia ben software avrà spunti aggiuntivi oltre al colore per indicare il significato. Altri scenari oltre ai test sul daltonismo sarebbero inclusi anche nei test di accessibilità del software, come la cecità visiva completa, la sordità e molti altri scenari. Un buon prodotto software dovrebbe essere accessibile da una percentuale massima di potenziali utenti.

Test di aggiornamento

Semplici app su un telefono, sistemi operativi come Ubuntu, Windows o Linux Mint e software che eseguono sottomarini nucleari necessitano di aggiornamenti frequenti. Il processo di aggiornamento stesso potrebbe introdurre bug e difetti che non esisterebbero su una nuova installazione perché lo stato dell'ambiente era diverso e il processo di introduzione del nuovo software sopra il vecchio potrebbe aver introdotto bug. Facciamo un semplice esempio, abbiamo un laptop con Ubuntu 18.04 e vogliamo eseguire l'aggiornamento a Ubuntu 20.04. Questo è un processo diverso di installazione del sistema operativo rispetto alla pulizia diretta del disco rigido e all'installazione di Ubuntu 20.04. Pertanto, dopo che il software è stato installato o una qualsiasi delle sue funzioni derivate, potrebbe non funzionare al 100% come previsto o come quando il software è stato appena installato. Quindi, dovremmo prima considerare di testare l'aggiornamento stesso in molti casi e scenari diversi per garantire che l'aggiornamento funzioni fino al completamento. E poi, dobbiamo anche considerare di testare l'effettivo aggiornamento del sistema dopo l'aggiornamento per garantire che il software sia stato impostato e funzioni come previsto. Non ripeteremmo tutti i casi di test di un sistema appena installato, il che sarebbe una perdita di tempo, ma penseremo attentamente con la nostra conoscenza del sistema a cosa POTREBBE rompersi durante un aggiornamento e aggiungeremo strategicamente casi di test per quelle funzioni.

Test scatola nera e scatola bianca

La scatola nera e la scatola bianca sono metodologie di test meno specifiche e più tipi di test di categorizzazione. In sostanza, black box testing, che presuppone che il tester non sappia nulla del funzionamento interno del software e costruisca un piano di test e casi di test che si limitino a guardare il sistema dall'esterno per verificarne il funzionamento. Il test della scatola bianca viene eseguito da architetti del software che comprendono il funzionamento interno di un sistema software e progettano i casi con la conoscenza di ciò che potrebbe, dovrebbe, dovrebbe e potrebbe rompersi. È probabile che i test della scatola in bianco e nero trovino diversi tipi di difetti.

Blog e articoli sui test del software

Il test del software è un campo dinamico e molte pubblicazioni e articoli interessanti che aggiornano la comunità sullo stato dell'arte del test del software. Tutti noi possiamo beneficiare di questa conoscenza. Ecco un esempio di articoli interessanti da diverse fonti di blog che potresti voler seguire:

Prodotti per il test del software

La maggior parte delle preziose attività di test può essere automatizzata, quindi non dovrebbe sorprendere che l'utilizzo di strumenti e prodotti per eseguire la miriade di attività di garanzia della qualità del software sia una buona idea. Di seguito elencheremo alcuni strumenti software importanti e di grande valore per i test del software che puoi esplorare e vedere se possono aiutarti.

JUnit

Per testare il software basato su Java, JUnit fornisce una suite di test completa per il test unitario e funzionale del codice che è amichevole per l'ambiente Java.

Selenio

Per testare le applicazioni Web, Selenium offre la possibilità di automatizzare le interazioni con i browser Web, inclusi i test di compatibilità tra browser. Questa è una delle principali infrastrutture di test per l'automazione dei test web.

Cetriolo

Un framework di test basato sul comportamento consente agli utenti aziendali, ai product manager e agli sviluppatori di spiegare la funzionalità prevista in linguaggio naturale e quindi definire tale comportamento nei casi di test. Ciò rende i casi di test più leggibili e la mappatura chiara delle funzionalità utente previste.

Purificare

Trova perdite di memoria e danneggiamenti della memoria in fase di esecuzione eseguendo il software con la strumentazione Purify Plus integrata che tiene traccia dell'utilizzo della memoria e segnala errori nel codice che non sono facili da trovare senza strumentazione.

Valgrind

Strumenti open source che eseguiranno il tuo software e ti permetteranno di interagire con esso segnalando un rapporto di errori di codifica come perdite di memoria e danneggiamenti. Non c'è bisogno di ricompilare o aggiungere strumentazione nel processo di compilazione poiché Valgrind ha l'intelligenza per comprendere dinamicamente il tuo codice macchina e iniettare la strumentazione senza problemi per trovare errori di codifica e aiutarti a migliorare il tuo codice.

copertura

Strumento di analisi statica che troverà errori di codifica nel software prima ancora di compilare ed eseguire il codice. Coverity può trovare vulnerabilità di sicurezza, violazioni delle convenzioni di codifica, nonché bug e difetti che il tuo compilatore non troverà. È possibile trovare codice morto, variabili non inizializzate e migliaia di altri tipi di difetti. È fondamentale pulire il codice con l'analisi statica prima di rilasciarlo in produzione.

JMeter

Un framework open source per i test delle prestazioni orientato agli sviluppatori basati su Java, da qui la J nel nome. Il test del sito Web è uno dei principali casi d'uso per JMeter, oltre al test delle prestazioni di database, sistemi di posta e molte altre applicazioni basate su server.

Metasploit

Per i test di sicurezza e penetrazione, Metasploit è un framework generico con migliaia di funzionalità e capacità. Usa la console di interazione per accedere agli exploit precodificati e prova a verificare la sicurezza della tua applicazione.

Ricerca accademica sui test del software

Conclusione

Il ruolo del software nella società continua a crescere e, allo stesso tempo, il software mondiale diventa più complesso. Affinché il mondo funzioni, dobbiamo disporre di metodi e strategie per testare e convalidare il software che creiamo eseguendo le funzioni che è destinato a svolgere. Per ogni sistema software complesso, dovrebbero essere in atto una strategia di test e un piano di test per continuare a convalidare la funzionalità del software mentre continuano a migliorare e a fornire la sua funzione.

I migliori giochi da riga di comando per Linux
La riga di comando non è solo il tuo più grande alleato quando usi Linux, ma può anche essere una fonte di intrattenimento perché puoi usarla per gioc...
Le migliori app di mappatura del gamepad per Linux
Se ti piace giocare su Linux con un gamepad invece di un tipico sistema di input di tastiera e mouse, ci sono alcune app utili per te. Molti giochi pe...
Strumenti utili per i giocatori Linux
Se ti piace giocare su Linux, è probabile che tu abbia utilizzato app e utilità come Wine, Lutris e OBS Studio per migliorare l'esperienza di gioco. O...