Uno dei miei detti preferiti è: "lavora in modo più intelligente, non più duro." Questo, ovviamente, si applica anche al testing del software. Significa che voglio trovare un modo per fare il minimo lavoro possibile ottenendo il massimo valore.
Parliamo quindi delle tecniche di black box testing e di come possano essere applicate per creare casi di test e trovare i bug più importanti nell’applicazione sotto test.
Che cos’è il Black Box Testing?
Cominciamo comprendendo che cosa sia il black box testing—in contrapposizione al white box testing. Si tratta di una tipologia di test software nella quale il tester non ha accesso alla struttura interna dell’applicazione che sta testando. Può accedere soltanto agli input e agli output del sistema e testare la funzionalità del software in base alle specifiche dei requisiti.
Ricorda che il black box testing verifica soltanto la funzionalità esterna del software e non controlla il funzionamento interno del codice sorgente. Per questo motivo viene talvolta chiamato "behavioral testing" (test comportamentale). Dovrebbe quindi essere utilizzato insieme al white box testing, che invece si concentra sul testare il codice interno. In questo modo puoi sentirti più sicuro che il software sia stato testato completamente e sia il più possibile privo di difetti.
5 Tipi di Tecniche di Black Box Testing
Usiamo queste tecniche di black box testing per aumentare la copertura dei test e allo stesso tempo ridurre il numero di casi di test. Identificando i dati di test corretti, possiamo creare il minor numero di test ottenendo però la massima copertura possibile.
Le tecniche di cui parlerò possono essere applicate a tutti i livelli di test—inclusi i test di unità, i test di integrazione e i test di sistema, oltre ai test funzionali e non funzionali.
1. Partizionamento in Classi di Equivalenza
Il partizionamento in classi di equivalenza è una tecnica utilizzata nel testing del software per suddividere i possibili input in un insieme di classi di equivalenza (o partizioni), con l’obiettivo di individuare e testare un gruppo rappresentativo di input per ciascuna classe. Tutti gli elementi appartenenti a una classe di equivalenza dovrebbero dare lo stesso risultato, quindi è sufficiente testare un solo valore di ciascun insieme.
Questo aiuta a ridurre il numero di casi di test da creare ed eseguire, pur fornendo una buona copertura. Le classi vengono definite in base ai requisiti funzionali o non funzionali e possono considerare fattori come tipologie di dati, intervalli e relazioni fra i valori di input.
Quando definisci le classi di equivalenza, assicurati sempre di includere anche quelle non valide, in modo da coprire anche gli scenari di test negativi. Per mia esperienza, la maggior parte dei difetti si trova utilizzando input non validi piuttosto che quelli validi.
Vediamo un esempio:
Hai un campo opzionale che consente solo valori interi compresi tra 1 e 10. Avresti le seguenti classi di equivalenza:
- nessun valore (partizione valida)
- valori tra 1 e 10 (partizione valida)
- valori inferiori a 1 (partizione non valida)
- valori superiori a 10 (partizione non valida)
Quindi avresti bisogno solo di 4 casi di test – uno per ciascuna partizione. Non aggiunge valore testare più valori all’interno della stessa partizione: se hai testato il valore 5, otterresti gli stessi risultati per i valori 4, 8, e così via.
2. Analisi dei Valori ai Limiti
L’analisi dei valori ai limiti è una tecnica utilizzata nel software testing per identificare e testare i valori di input che si trovano ai margini o vicino al "limite" del dominio degli input del programma. L’idea è che questi valori abbiano maggiori probabilità di causare errori o comportamenti inaspettati perché spesso coinvolgono casi particolari o estremi che il programma potrebbe non gestire adeguatamente.
Ad esempio, testando un programma che accetta un intervallo di numeri interi tra 1 e 100, i valori limite sarebbero 1, 100 e tutti i valori appena fuori da questo intervallo, come 0 e 101.
I due tipi di boundary testing sono:
- Test sui limiti interni: si concentra sui valori di input che sono appena all’interno del limite del dominio di input, ad esempio i valori minimo e massimo consentiti.
- Test sui limiti esterni: si concentra sui valori di input appena fuori dal limite del dominio di input, come valori leggermente superiori o inferiori rispetto al minimo e al massimo ammessi.
L'analisi dei limiti è una tecnica importante per individuare errori e garantire che un programma si comporti correttamente per tutti gli input, non solo per quelli che si trovano al centro del dominio degli input. Questo può aiutare a identificare e correggere bug che altrimenti potrebbero passare inosservati.
3. Test delle Tabelle di Decisione
Nel test delle tabelle di decisione, si verifica la logica e il comportamento del software quando sono disponibili più condizioni. È un modo per rappresentare le relazioni tra input e output in formato tabellare. La tabella presenta solitamente colonne per le condizioni e righe per le diverse combinazioni. Per ciascuna riga, occorre creare un caso di test specifico. L'output atteso per il caso di test deve anche essere incluso nella tabella.
Immaginiamo un esempio di requisito software in cui può essere applicata questa tecnica: un'app che calcola il costo di un acquisto in base all'articolo, alla quantità e al metodo di spedizione:

In questo esempio, Articolo, Quantità e Metodo di Spedizione sono gli input, mentre il Costo è l'output. La tabella mostra tutte le possibili combinazioni di input e il corrispondente output in ogni caso. Utilizzando questa tabella, è possibile individuare rapidamente i casi di test e i loro risultati attesi, facilitando la verifica e la prova delle combinazioni disponibili.
Il test delle tabelle di decisione è utile quando un programma ha più input e condizioni che interagiscono tra loro in modi complessi. Suddividendo gli input e le condizioni in una tabella, diventa più facile identificare e testare tutte le possibili combinazioni e variazioni.
4. Test di Transizione di Stato
Il test di transizione di stato è una tecnica di testing black box in cui si verifica il comportamento di un programma mentre passa tra diversi stati o modalità. Uno stato è una condizione o un insieme di condizioni in cui il programma può trovarsi, mentre una transizione è il passaggio da uno stato all'altro. L'idea alla base del test di transizione di stato è identificare tutti i possibili stati e transizioni che un programma può attraversare, e poi creare casi di test per verificare che il programma si comporti correttamente in ciascuno stato e compia transizioni valide tra gli stati.
Un esempio di test di transizione di stato potrebbe essere per un sito e-commerce dove i clienti possono aggiungere articoli al carrello, procedere al checkout, inserire le informazioni di pagamento e i dati di spedizione, e infine effettuare un ordine. Gli stati in questo esempio sarebbero:
- Navigazione dei prodotti
- Aggiunta di articoli al carrello
- Checkout
- Inserimento dei dettagli di pagamento e spedizione
- Conferma dell'ordine
Le transizioni tra questi stati sarebbero:
- Navigazione dei prodotti -> Aggiunta di articoli al carrello
- Aggiunta di articoli al carrello -> Checkout
- Checkout -> Inserimento dei dettagli di pagamento e spedizione
- Inserimento dei dettagli di pagamento e spedizione -> Conferma dell'ordine

Questa tecnica aiuta a identificare e testare tutti i possibili percorsi che un utente può intraprendere all’interno del sistema, e può aiutare a trovare e correggere bug relativi a flussi specifici. Il test di transizione di stato è particolarmente utile per testare sistemi con interazioni complesse, come sistemi finanziari, e-commerce, o sistemi che controllano dispositivi fisici.
5. Test Pairwise
Il test pairwise è una tecnica di testing black box utilizzata per creare casi di test che coprano tutte le possibili coppie di combinazioni di valori di input per un dato insieme di parametri. È usato quando il numero di input disponibili è elevato, rendendo estremamente difficile testare tutte le possibili combinazioni tra di essi.
Supponiamo di avere un'app con 3 campi: A, B e C. Ogni campo può accettare 3 valori possibili: 1, 2 o 3.
Con i metodi di test tradizionali, dovremmo testare singolarmente 27 (3^3) possibili combinazioni di input, per validare tutte le combinazioni possibili. Questo sarebbe estremamente dispendioso in termini di tempo e inefficiente.

Con il test pairwise, è possibile individuare casi d’uso che coprano tutte le possibili combinazioni uniche di input. Questo apparirebbe in questo modo:

Come si può vedere, il numero di test è stato drasticamente ridotto, da 27 a 9. La copertura dei test non è cambiata, stiamo ancora garantendo che tutte le possibili combinazioni di valori vengano prese in considerazione.
Esistono diversi strumenti per il test pairwise disponibili. Di seguito elenco alcuni esempi:
- AllPairs: Uno strumento per la creazione di casi di test a coppie sulla base di elenchi di parametri e vincoli specificati dall'utente. È disponibile sia in versione open-source che commerciale.
- PICT (Pairwise Independent Combinatorial Testing): Uno strumento che utilizza un algoritmo genetico per generare casi di test a coppie. È disponibile come strumento open-source.
- SmartBear TestComplete: Uno strumento commerciale per l'automazione dei test che include il supporto integrato per il testing a coppie.
- Pairwise Test Case Generator: Uno strumento open-source disponibile su GitHub che può essere usato per generare casi di test a coppie.
- I casi di test a coppie possono essere anche generati usando Excel o OpenOffice Calc tramite macro o plugin per creare i tuoi casi di test.
Questi sono solo alcuni esempi; potrebbero essere disponibili anche altri strumenti. Ti consiglio di ricercare e valutare le diverse opzioni disponibili e di vedere quale strumento si adatta meglio alle tue esigenze e ai tuoi requisiti specifici.
Considerazioni finali
Utilizzare queste tecniche è un ottimo modo per ottenere una buona copertura in qualsiasi fase del ciclo di vita dello sviluppo software. Puoi ottenere risultati ancora migliori se aggiungi altri tipi di testing nel tuo processo, come l'esplorativo o l'error-guessing, il testing di compatibilità, il testing di usabilità e così via.
Inoltre, se i casi di test risultanti entrano a far parte della suite di regressione, dovresti prendere in considerazione la loro automazione—per i test UI puoi usare strumenti come Selenium, Cypress e Appium; per il testing delle API puoi realizzare test di integrazione direttamente dal team di sviluppo oppure utilizzare strumenti come Postman.
Se hai trovato utile questo articolo, ti suggerisco di iscriverti alla newsletter di QA Lead, dove potrai rimanere aggiornato su tutti i nuovi contenuti e tutorial su quality assurance e testing.
