Test black-box di API basato su partizionamento - Ingegneria Informatica
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
Scuola Politecnica e delle Scienze di Base Corso di Laurea in Ingegneria Informatica Tesi di Laurea Triennale in Ingegneria Informatica Test black-box di API basato su partizionamento Anno Accademico 2018/2019 Relatore Ch.mo Prof Roberto Pietrantuono Candidato Mario Pisacane N46003598
Alla mia famiglia, a Martina e a tutti i miei amici e colleghi.
Indice Indice..................................................................................................................................................III Capitolo 1: Test Black Box e API........................................................................................................4 1.1 Test Black Box...........................................................................................................................4 1.2 Classi d’equivalenza...................................................................................................................5 1.3 API – Application Programming Interface.................................................................................6 Capitolo 2: Category Partition e Robustezza........................................................................................8 2.1.1 Identificazione delle caratteristiche dei parametri verificabili separatamente....................9 2.1.2 Identificazione dei valori rappresentativi..........................................................................11 2.1.3 Generazione delle specifiche del caso di prova.................................................................11 2.2 Analisi di Robustezza...............................................................................................................12 Capitolo 3 : Tools per l’ API-Testing.................................................................................................14 3.1 Postman....................................................................................................................................14 3.1.1 Request.............................................................................................................................14 3.1.2 Collections.........................................................................................................................16 3.1.3 Variables............................................................................................................................17 3.1.4 Riposta HTTP....................................................................................................................18 3.2 Altri tools..................................................................................................................................19 3.2.1 SoapUI...............................................................................................................................19 3.2.2 Katalon Studio...................................................................................................................19 3.2.3 Apigee................................................................................................................................20 3.2.4 Jmeter................................................................................................................................20 3.2.5 Assertible...........................................................................................................................20 3.2.6 Fiddler................................................................................................................................21 Capitolo 4 : Un approccio di category-partition per il test di API.....................................................22 4.1 : Collection...............................................................................................................................22 4.2 : Category Partition...................................................................................................................24 4.3 : Request...................................................................................................................................25 4.3.1 List users............................................................................................................................25 4.3.2 Single user.........................................................................................................................26 4.3.3 Create.................................................................................................................................26 4.3.4 Update................................................................................................................................29 4.3.5 Register e Login................................................................................................................31 4.3.6 Delete.................................................................................................................................33 4.4: Vincoli.....................................................................................................................................34 Conclusioni.........................................................................................................................................35 Bibliografia.........................................................................................................................................37
Test black-box di API basato su partizionamento Capitolo 1: Test Black Box e API 1.1 Test Black Box Il test funzionale è una tipologia di verifica che tenta di rispondere alla domanda "Quali casi di test devo usare per provare un programma?", considerando solo le specifiche di un programma e non la sua struttura di progettazione o implementazione. Essendo basato sulle specifiche e non direttamente sul codice, il test funzionale è anche chiamato test basato sulle specifiche o test Black-Box. Il test Black-Box è una tipologia di verifica complanare a quella White-Box, non ne è un'alternativa ma un completamento. Mentre i test White-Box si occupano di effettuare operazioni di verifica sul codice sorgente, mediante meccanismi basati sul concetto di copertura, ovvero la percentuale dei casi testati (ad esempio il numero di stringhe di codice testate in rapporto con il loro numero totale), il Black-Box è composto da tecniche che prescindono dalla struttura del programma, e, quasi sempre, si opera su software di cui non si conosce il codice sorgente, lo stato o il funzionamento interno. Sono tecniche che valutano il compito di un programma: si esercita il sistema immettendo input e valutando gli output. Per effettuare un buon test Black-Box si devono avere: delle specifiche da soddisfare, la conoscenza dell'interfaccia del sistema e la documentazione, in particolare, i documenti relativi alla fase d'analisi. Perché? I casi di test vengono derivati direttamente dalle specifiche, ovvero dall'obiettivo e/o dal compito che il programma deve portare a termine. In caso si fosse in possesso di una specifica scritta in un linguaggio formale esistono dei programmi per estrarre casi di test automaticamente e, anche, di derivare automaticamente risultati, che prendono il nome di oracoli. Un oracolo è un meccanismo usato nel collaudo del software e, più in generale, nell'ingegneria del software per determinare se un test ha avuto successo o è fallito. Viene utilizzato confrontando l'output di un sistema sotto analisi, dato in ingresso uno specifico caso di test, con il risultato che il prodotto dovrebbe 4
Test black-box di API basato su partizionamento fornire (determinato dall'oracolo). Gli obiettivi principali di questa tipologia di testing possono essere: la copertura degli scenari di esecuzione definiti dai casi d'uso e la copertura delle funzionalità previste. Per fare ciò occorre dividere i possibili input in gruppi i cui elementi si ritiene che saranno trattati similarmente dal processo elaborativo. Questi gruppi sono chiamati classi d'equivalenza. La definizione dei casi di test e dell’oracolo è fondata sulla base della sola conoscenza dei requisiti specificati del sistema e dei suoi componenti. Per definire l'insieme dei casi di test per ogni funzionalità, bisogna effettuare un numero di esecuzioni dedotte dai dati di ingresso e di uscita e dalle precondizioni e postcondizioni. Una volta definito il dominio dei dati di I/O non resta che scegliere i tests-case selezionando: 1 valori all’interno dell’intervallo; 2 valori all’esterno dell’intervallo; 3 valori “critici”. 1.2 Classi d’equivalenza Il metodo si occupa di esaminare i campi di variabilità degli input, ovvero il loro dominio. Questo dominio è normalmente troppo grande per un testing esaustivo dei valori, per esempio una funzione che ha in input due short richiederebbe 256x256 (= 65.000) casi di test. L’idea delle classi di equivalenza è di partizionare il dominio di input in un numero finito di sottoinsiemi in cui “ragionevolmente” il codice si comporta in maniera uniforme. Se l’unità computa correttamente per un caso di test, si può dedurre ragionevolmente che è corretto per ogni caso di test in quella classe. Ogni sottoinsieme è una classe di equivalenza, e serve come base per almeno un input ad 5
Test black-box di API basato su partizionamento un test. La tecnica del partizionamento in classi di equivalenza consiste nel testare almeno un caso nel campo dei valori all’interno del dominio, un campo dei valori esterni al dominio e, soprattutto, nel campo dei valori “critici”, quali possono essere i valori ai margini del dominio, per ogni classe d'equivalenza. Da una singola problematica è possibile estrarre molte classi di equivalenza da testare, partendo dalle specifiche. Una possibile suddivisione è quella in cui la classe d'equivalenza rappresenta un insieme di stati validi o non validi per una configurazione sulle variabili d'ingresso: 1 Se la variabile di input è un intervallo di valori: almeno una classe valida per valori interni all’intervallo, una non valida per valori inferiori al minimo, e una non valida per valori superiori al massimo. 2 Se la variabile di input è un elemento di un insieme discreto: una classe valida per ogni elemento dell’insieme, una non valida per un elemento non appartenente. 3 Se la variabile di input è un valore specifico: una classe valida per il valore specificato, una non valida per valori inferiori e una non valida per valori superiori. 4 Se la variabile di input è un valore booleano: una classe valida per il valore TRUE e una non valida per il valore FALSE. 1.3 API – Application Programming Interface In informatica con il termine con l'acronimo API si indica application programming interface, un insieme di procedure (in genere raggruppate per strumenti specifici) atte all'esplemento di un dato compito. Spesso al concetto di API viene associato il concetto di libreria software di un linguaggio di programmazione. 6
Test black-box di API basato su partizionamento Le API sono un insieme definito di regole, che contengono metodi di comunicazione definiti. Un' API aiuta diversi componenti software a interagire tra loro. Le interfacce consistono in una serie di funzioni, procedure, variabili e strutture dati. Una buona API fornisce una "scatola nera", basata su un pensiero Object-Oriented, per garantire l'Information Hiding, cioè un livello di astrazione che evita al programmatore di sapere come funzionato le API ad un livello inferiore. Questo permette di riprogettare o migliorare le funzioni all'interno dell'API senza cambiare il codice che si affida ad esse. L’API-Testing prevede la raccolta di API in un insieme e la conseguente verifica della conformità alle aspettative di funzionalità, affidabilità, prestazioni, sicurezza e di corretta risposta. Il test delle API viene utilizzato per determinare se l'output è ben strutturato e utile a un'altra applicazione oppure no, controlla la risposta in base al parametro di input (richiesta) e il tempo impiegato. Il formato più utilizzato in questo contesto è il JSON, acronimo di JavaScript Object Notation, un formato adatto all'interscambio di dati fra applicazioni client/server. È basato sul linguaggio JavaScript, ma ne è indipendente. Viene usato come alternativa a XML.La maggior parte dei linguaggi di programmazione possiede un typesystem molto simile a quello definito da JSON per cui sono nati molti progetti che permettono l'utilizzo di JSON con altri linguaggi. Fra i primi utilizzatori di JSON si trova Yahoo!, dal 2005. 7
Test black-box di API basato su partizionamento Capitolo 2: Category Partition e Robustezza 2.1 Category Partition Test Il Category Partition Test, come abbiamo detto, è un metodo per generare test funzionali da specifiche informali. Le seguenti fasi compongono il nucleo della metodologia: 1. Decomposizione delle specifiche in funzionalità testabili in modo indipendente: I progettisti dei test identificano le caratteristiche da testare separatamente, i parametri e tutti gli altri elementi dell'ambiente (environment) di esecuzione da cui l'unità dipende. Le dipendenze ambientali sono trattate in modo identico ai parametrii. Per ciascun parametro e/o elemento di ambiente, i progettisti identificano le caratteristiche elementari, che nel category partition vengono, solitamente, definite categorie (o classi d’equivalenza). 2. Identificazione dei valori rappresentativi: I progettisti dei test selezionano una serie di classi rappresentative di valori per ciascuna caratteristica del parametro. I valori (test-case) vengono selezionati separatamente, indipendentemente dalle altre caratteristiche dei parametri. Nel metodo partizione di categoria, le classi di valori sono chiamate scelte (test-frame) e questa attività è chiamata “partizionare le categorie in scelte”. 3. Generazione delle specifiche del caso di test: I progettisti del test impongono vincoli semantici sui valori per indicare combinazioni non valide e limitare le combinazioni valide (ad esempio, limitando combinazioni che coinvolgono valori eccezionali e non validi). Normalmente la scelta dei valori viene effettuata dopo la scelta dei vincoli. Categorie, scelte e vincoli possono essere forniti a uno strumento per generare 8
Test black-box di API basato su partizionamento automaticamente una serie di specifiche. Automatizzare attività banali e ripetitive, come queste, fa si che ci sia un uso migliore delle risorse umane e riduce gli errori dovuti alla distrazione. È possibile determinare il numero di casi di test che verranno generati (mediante calcoli o generandoli effettivamente) prima di investire lo sforzo umano nell'esecuzione del test. Se il numero di casi di test derivabili supera il budget per l'esecuzione e la valutazione del test, i progettisti di test possono ridurre il numero di casi di test imponendo ulteriori vincoli semantici. Il controllo del numero di casi di test prima dell'inizio dell'esecuzione è preferibile ad approcci ad hoc in cui si possono inizialmente creare suite di test molto approfondite e quindi testare sempre meno, a mano a mano che le scadenze si avvicinano. 2.1.1 Identificazione delle caratteristiche dei parametri verificabili separatamente Si assume che questa prima fase inizi selezionando una funzione da testare indipendentemente dalle altre. Questa fase richiede al progettista di test di identificare le caratteristiche dei parametri, cioè le caratteristiche elementari dei parametri e degli elementi ambientali che influenzano l'esecuzione dell'unità. Un singolo parametro può avere più caratteristiche elementari. Una lettura più attenta delle specifiche rivela ciò che è "valido", mentre una prima lettura può offrirci uno sguardo sui possibili elementi in gioco. Dopo aver identificato i parametri e gli elementi dell'ambiente, per testare la funzionalità, il progettista del test deve identificare le caratteristiche dei parametri. Non ci sono regole rigide per scegliere le categorie, e non è un compito banale. Le categorie riflettono il giudizio del progettista riguardo le classi di valori che possono essere trattate in modo diverso, oltre alle classi di valori che sono esplicitamente identificate nella specifica. I progettisti di test devono inoltre utilizzare la propria 9
Test black-box di API basato su partizionamento esperienza e conoscenza, del dominio dell'applicazione e dell'architettura del prodotto, per esaminare le specifiche e identificare le possibili caratteristiche nascoste. Il category partition test non prevede una disposizione precisa per i dati strutturati, come per esempio set di coppie . Un approccio tipico è quello di "appiattire" le categorie: descrivere le caratteristiche dell'intera categoria come caratteristiche di parametri. In genere la dimensione del parametro (la lunghezza di una stringa, ad esempio) è una caratteristica, mentre, le descrizioni delle possibili combinazioni di elementi (occorrenza di caratteri speciali in una stringa, ad esempio), sono altre caratteristiche del parametro, indipendenti dalle precedenti. Supponiamo che l'unica variazione significativa tra le coppie sia tra coppie compatibili e coppie incompatibili. Se considerassimo ogni coppia come una caratteristica separata e assumessimo n spazi, il category partition genererebbe tutte le 2^n combinazioni parametri compatibili e incompatibili. Quindi potremmo avere un caso di test in cui la prima opzione selezionata è compatibile, la seconda è compatibile e la terza incompatibile, e un diverso caso di test in cui la prima è compatibile ma la seconda e la terza sono incompatibili, e così via. Ognuna di queste combinazioni potrebbe essere combinata in diversi modi con altre caratteristiche dei parametri. Il numero di combinazioni, allora, esplode rapidamente. Scegliendo l'approccio dell’ “appiattimento”, quali classi d’equivalenza si prendono in considerazione? Una selezione compatibile e una incompatibile? Tutte le selezioni compatibili e tutte le selezioni incompatibili? Oppure un mix di due o più selezioni compatibili e due o più incompatibili? Sicuramente quest'ultimo è più completo, ma se il test ha un costo molto elevato, è una questione di giudizio del progettista la scelta di tale opzione . Come tutte le decisioni di progettazione, il modo in cui dati complessi e collezioni sono suddivisi in categorie richiede un giudizio basato su una combinazione di analisi ed esperienza. 10
Test black-box di API basato su partizionamento 2.1.2 Identificazione dei valori rappresentativi Questa fase consiste nell'identificare un elenco di valori rappresentativi (più precisamente un elenco di classi di valori) per ciascuna delle caratteristiche dei parametri identificate durante la fase precedente. I valori rappresentativi devono essere identificati per ciascuna categoria in modo indipendente, ignorando le possibili interazioni tra i valori per le diverse categorie, che sono considerati nella fase successiva. I valori rappresentativi possono essere identificati applicando manualmente una serie di regole note come test del valore limite o test di condizione errato. La regola di verifica del valore limite suggerisce la selezione di valori estremi all'interno di una classe (ad es., valori massimi e minimi dell'intervallo), valori esterni ma il più vicino possibile alla classe e valori "interni" (non estremi) della classe . I valori vicino al margine di una classe sono spesso utili per rilevare errori nei programmi. La regola della condizione errata suggerisce la selezione di valori che sono al di fuori del normale dominio del programma, poiché l'esperienza indica che la corretta gestione dei casi di errore è spesso trascurata dagli sviluppatori. 2.1.3 Generazione delle specifiche del caso di prova Una specifica del caso di prova per una caratteristica viene fornita come una combinazione di classi di valore, una per ogni caratteristica di parametro identificata. Sfortunatamente, la semplice combinazione di tutte le classi di valore possibili, per ciascuna caratteristica dei parametri, si traduce in un numero ingestibile di casi di test (molti dei quali sono impossibili), anche per specifiche semplici. Tuttavia, non tutte le combinazioni di classi di valore corrispondono a specifiche ragionevoli. 11
Test black-box di API basato su partizionamento Il category partition consente di omettere alcune combinazioni indicando classi di valore che non devono necessariamente essere combinate con tutti gli altri valori. Alcuni valori, inoltre, non sono errati di per sé, ma possono essere utili o addirittura validi in combinazioni particolari. Combinazioni errate di valori validi possono essere escluse con i vincoli di proprietà. Un vincolo di proprietà raggruppa i valori di una caratteristica di un singolo parametro per identificare sottoinsiemi di valori con proprietà comuni. La scelta di nomi significativi per caratteristiche dei parametri e classi di valore consente la generazione (semi) automatica delle specifiche del caso di test. Esistono tre tipologie di vincoli: Error, Propriety e Single. Il vincolo Error indica una classe di valore che dà luogo ad un errore; Property elimina le combinazioni invalide dei valori delle categorie; infine, Single indica una classe di valore che si desidera testare una sola volta e non su tutte le possibili combinazioni per ridurre il numero di test-case. 2.2 Analisi di Robustezza In termini generali, la robustezza di un software o di un algoritmo è la sua capacità di comportarsi in modo ragionevole in situazioni impreviste, non contemplate dalle specifiche. Situazioni di questo tipo in genere riguardano errori ed eccezioni di varia natura (dati di input scorretti, fallimenti di componenti software o hardware esterni al sistema e interagenti con esso, e così via). Anche in questo caso, l'idea intuitiva della robustezza implica certamente considerazioni di valore sugli effetti dannosi che il sistema o l'utente subiscono se il sistema reagisce in modo "irragionevole" a situazioni impreviste. Uno dei metodi per effettuare l’analisi di robustezza è il category partition test. Normalmente nel category partition test la maggior parte dei casi di test o delle prove viene effettuata mediante input validi, così da testare il comportamento del software nelle 12
Test black-box di API basato su partizionamento condizioni in cui è stato progettato. Sono solo pochi i casi in cui vengono testati input non validi, fuori dal corretto dominio di esecuzione. Per effettuare una buona analisi di robustezza si inverte questo procedimento e effettua, nelle quasi totalità dei casi, test su input “scorretti”. Andando a testare tanti input imprevisti si calcola il grado di robustezza del software in analisi. Lo scopo è trovare tutti quei casi in cui il programma fallisce, per esempio, se il programma a un determinato input imprevisto dà come risposta con un codice 404, anziché con modulo pensato ad hoc, è sintomo di robustezza perché, sebbene non gestita, il software è stato in grado di riconoscere l’input errato e muoversi di conseguenza. Sarebbe stato problematico se, invece, al posto del codice d’errore, avesse continuato la sua esecuzione e alterato lo stato interno della macchina. 13
Test black-box di API basato su partizionamento Capitolo 3 : Tools per l’ API-Testing 3.1 Postman Postman è una delle applicazioni devolute al testing delle API più utilizzate. Si basa sull’invio di richieste, request, a un web server e le annesse risposte. Consente agli utenti di configurare tutti gli Headers e i Cookies previsti dall'API al fine di controllare la risposta. Un test in Postman è un codice JavaScript, che viene eseguito dopo che una richiesta è stata inviata dal client e una risposta è stata ricevuta dal server. 3.1.1 Request Una request è una richiesta che viene effettuata a un server. può avere tante diverse consegne da comunicare, in base a quanti sono i metodi di richiesta. I metodi di richiesta, quindi, definiscono il tipo di richiesta da effettuare. Quelli disponibili in Postman sono consultabili nella Figura 3.1 : Metodi di un' API-Request figura 3.1. Quelli che vengono utilizzati più spesso sono: 1. POST - Per la creazione o l'aggiornamento dei dati; 2. PUT - per l'aggiornamento dei dati; 3. GET - per il recupero di dati; 4. DELETE – per la cancellazione di dati. 14
Test black-box di API basato su partizionamento Di una request si possono settare le autorizzazioni, le intestazioni, il corpo della richiesta, un eventuale script da eseguire prima della richiesta e i tests: Figura 3.2 : Settagi di un' API- Request Il campo URL di richiesta è atto ad inserire il link per la richiesta http. Per quanto riguarda le altre categorie: Headers: nelle intestazioni delle richieste sono presenti le coppie valore-chiave dell'applicazione. Vediamo, a titolo d’esempio, due coppie: 1. Content-type: un tipo di contenuto descrive il formato dei dati dell'oggetto. Uno di quelli più usati è senza dubbio application / json. 2. Authorization: un token di autorizzazione, incluso con le richieste, viene utilizzato per identificare il richiedente. Body: Nel campo Body (Corpo) si immettono gli input ai campi richiesti dal server, nel caso fossero necessari: 15
Test black-box di API basato su partizionamento Figura 3.3 : Body di un'API-Request Infine nei campi Pre-request Script e Tests si inserisce del codice che verrà eseguito rispettivamente prima di effettuare la richiesta o subito dopo la recezione della risposta. 3.1.2 Collections Una collection è un gruppo di API-Request che possono essere raggruppate in un certo ordine. Sono la “base” per effettuare operazioni più avanzate. Una collection può avere sia delle autorizzazioni, come un username e una password per entrare al suo interno, sia delle folders (cartelle) per Figura 3.4 : Creazione di una Collection migliorare l’organizzazione. Ogni cartella, a sua volta, può avere delle autorizzazioni per l’accesso. Una volta che in tutte le cartelle sono presenti più request è possibile mandare in esecuzione l’intera collection, la quale eseguirà le request presenti sequenzialmente in ogni cartella e fornirà i risultati. 16
Test black-box di API basato su partizionamento Le collections possono essere esportate o importate per favorire il loro riuso, mediante le sezioni di Import/Export. 3.1.3 Variables Sono elementi che possono assumere diversi valori, sia come stringhe che come valori numerici, ma anche altri tipi di dato. Sono visibili all’interno di una certa collection e possono essere create e/o modificate mediante la sezione “Edit” (della collection). Una variable è composta da due campi: key e value. La key rappresenterà la sua shortcut mentre value il suo corrispettivo. Per esempio con la key “url” si può intendere “www.miosito.it”, quindi ogni volta che si andrà a scrivere {{url}} al suo posto è come se ci fosse scritto “www.miosito.it”. È possibile creare anche variables con visibilità globale, quindi non solo relativa a una data collection, tramite la sezione “Manage Environment”. Infatti in questi Environments sono contenute tutte le nostre variables con scope globale. Si può, inoltre, creare un file .json con all’interno tutte le coppie valore-chiave per le variables: [ { “nome_key_1” : “value_1”, “nome_key_2” : “value_2”, “nome_key_3” : “value_3” }, { 17
Test black-box di API basato su partizionamento “email” : “mario@mario.mario” , “password” : “1234”, “url” : “www.ciao.ciao” }, { “email” : “ciao@ciao.ciao” , “password” : “1234”, “url” : “www.ciao.ciao” } ] Ogni blocco delineato dalle parentesi graffe indica un caso di test. I vari nomi_key invece sono le key utilizzate all’interno della collection, mentre i values, che variano di blocco in blocco, sono i casi di test da effettuare. Nell’esempio appena fatto, i blocchi due e tre simulano un eventuale login al sito www.ciao.ciao. 3.1.4 Riposta HTTP Alla request, l'API risponde inviando un messaggio composto da Corpo, Cookie, Intestazioni, Test, Codice di stato e Tempo di risposta dell'API. Postman organizza corpo e intestazioni in diverse schede. Per esempio il codice per il tempo impiegato per completare la request viene visualizzato in una scheda diversa dalle altre. Ci sono molti codici di stato, da cui si verifica la risposta. Quelli più frequenti sono: 1. 200 – Per dare un feedback di corretta esecuzione. 2. 201 – Per la corretta esecuzione della richiesta e la corretta creazione dei dati. 3. 204 - Per risposta vuota. 4. 400 - Per richiesta errata. Se la richiesta non può essere compresa o mancano i 18
Test black-box di API basato su partizionamento parametri richiesti. 5. 401 - Per l'accesso non autorizzato. Autenticazione fallita o mancanza di autorizzazioni per l'operazione richiesta. 6. 403 - Per accesso negato. 7. 404 - Per dati non trovati. 8. 405 – Per la presenza di un metodo non consentito o per la richiesta non supportata. 9. 500 – Per un errore interno del server. 10. 503 – Per un servizio non disponibile. 3.2 Altri tools 3.2.1 SoapUI SoapUI è uno strumento di test funzionale dedicato al test API, che consente agli utenti di testare facilmente API, SOAP ( protocolli che permettono lo scambio di messaggi tra software) e servizi Web. Pro: • Creazione test con Drag and drop, Point-and-click; • Riutilizzabilità degli script; • Creazione di codice personalizzato usando Groovy; • Caricamento dei dati da file, database ed Excel tali che possano simulare il modo in cui i consumatori interagiscono con le API 3.2.2 Katalon Studio Katalon Studio è uno strumento di automazione di test per applicazioni API, Web e Mobile. Sta emergendo come strumento leader per i test dei servizi API / Web e si posiziona come una soluzione completa di automazione end-to-end per sviluppatori e tester. 19
Test black-box di API basato su partizionamento Katalon Studio supporta sia le richieste SOAP che API con vari tipi di comandi e funzionalità di parametrizzazione. Inoltre ha la capacità di combinare UI e servizi API / Web per più ambienti (Windows, Mac OS e Linux) . 3.2.3 Apigee Apigee è uno strumento di test API cross-cloud, che consente agli utenti di misurare e testare le prestazioni delle API. Pro: • È multi-step e alimentato da Javascript • Identifica i problemi di prestazioni monitorando il traffico delle API, i tassi di errore e i tempi di risposta • Permette di creare facilmente proxy API e distribuirli nel cloud • Modello di distribuzione cloud • Apigee è costruito appositamente per il business digitale e le app basate su dispositivi mobili. 3.2.4 Jmeter JMeter è un software open-source ampiamente utilizzato per il test funzionale delle API sebbene sia stato effettivamente creato per il test del carico. Pro: • Supporta la riproduzione dei risultati del test • Funziona automaticamente con i file CSV, consentendo al team di creare rapidamente valori di parametri univoci per i test API. • Può essere utilizzato per test delle prestazioni sia statici che dinamici delle risorse 3.2.5 Assertible Assertible è uno strumento di test API che si concentra sull'automazione e l'affidabilità. Pro: 20
Test black-box di API basato su partizionamento • Supporto per l'automazione dei test API attraverso un'integrazione continua. • Supporto per la convalida delle risposte HTTP come la convalida dello schema JSON e i controlli di integrità dei dati. 3.2.6 Fiddler Fiddler è uno strumento che consente di monitorare, manipolare e riutilizzare le richieste HTTP. Fiddler permette di eseguire il debug dei problemi del sito Web ed estendere le sue funzionalità mediante degli opportuni Add-on. Uno di questi, l'estensione APITest, migliora notevolmente Fiddler per convalidare il comportamento delle API Web. Per uno sviluppo più dettagliato delle API è possibile utilizzare la libreria di classi. Questa è un'ottima scelta per i team che utilizzano i linguaggi .NET, dal momento che si può sviluppare i test utilizzando qualsiasi linguaggio .NET si desidera. 21
Test black-box di API basato su partizionamento Capitolo 4 : Un approccio di category-partition per il test di API In questo capitolo, è affrontato un approccio al category partition test pensato per l’API- Testing utilizzando tutte le tecniche e metodologie viste nei capitoli precedenti. Si parte dalla creazione di una collection, utilizzando Postman, passando, poi, alla creazione dei casi di test, che verranno forniti al programma tramite un file .json. Infine si effettuerà la verifica di tutte le request alla ricerca di eventuali bug. Il sito sotto analisi è https://reqres.in/, il quale permette di sperimentare, in modo controllato, varie tipologie di API. Il sito simula un catalogo di persone sul quale poter operare. 4.1 : Collection Il primo passo prevede la creazione della nostra Collection (figura 4.1). Nelle Variables della collection, per comodità, conviene creare una “url” con valore il sito da analizzare: figura 4.1 : Creazione della collection 22
Test black-box di API basato su partizionamento La collection viene divisa in quattro folder: Operazioni di Get, Operazioni di Delete, Operazioni con email e password e Operazioni con nome e lavoro. Mentre le prime due sottocategorie sono divise in base all’operazione che andranno a fare, le restanti due sono divise in base alla tipologia di dati che usano come input. Nelle Operazioni di GET sono presenti due request: la prima per ottenere tutti gli utenti presenti nel sito e la seconda per un singolo utente. Nelle Operazioni con email e password sono presenti due request: la prima per registrarsi al sito, la seconda per effettuare il login. Nelle Operazioni con nome e lavoro sono presenti due request: la prima per modificare il nome/lavoro di una persona, la seconda per la creazione di un nome/lavoro. Nelle Operazioni di DELETE, infine, è presente una request per eliminare una persona dal sito. figura 4.2 : Requests nella Collection 23
Test black-box di API basato su partizionamento 4.2 : Category Partition Prima di procedere all’analisi di ogni Request sono state create le classi d’equivalenza: Tipo Nome Descrizione Nome NomeEmpty Nome vuoto NomeNULL Nome con valore NULL NomeInvalid Nome invalido, per esempio con numeri al suo interno NomeValid Nome valido Cognome CognomeEmpty Cognome vuoto CognomeNULL Cognome con valore NULL CognomeInvalid Cognome invalido, per esempio con numeri al suo interno CognomeValid Cognome valido Email EmailEmpty Email vuota EmailNULL Email con valore NULL EmailInvalid Email invalida, ovvero in un formato diverso da abc@def.ghi EmailValid Email valida Password PasswordEmpty Password vuota PasswordNULL Password con valore NULL PasswordInvalid Password invalida, per esempio con caratteri non consoni o troppo lunga PasswordValid Password valida Id IdEmpty Id vuoto IdNULL Id con valore NULL IdInvalid Id invalido, per esempio con un carattere alfabetico IdValid Id valido Lavoro LavoroEmpty Lavoro vuoto LavoroNULL Lavoro con valore NULL LavoroInvalid Lavoro invalido, per esempio con un numero al suo interno LavoroValid Lavoro Valido Tabella 4.1 : Classi d’equivalenza Successivamente, per ogni requests, verranno approfonditi i test-case e presentati i relativi risultati. 24
Test black-box di API basato su partizionamento 4.3 : Request Il passo successivo consiste nel settare, per ogni richiesta, la sua url e l’Header: figura 4.3 : Setting delle request 4.3.1 List users figura 4.4 : List Users. Oracolo: 200 OK. La request interroga il sito, relativo alla pagina 2 degli users, e ottiene risposta. Lo status (cerchiato in rosso) ci fornisce il codice 200 (un feedback di corretta esecuzione), che 25
Test black-box di API basato su partizionamento rispecchia a pieno l’oracolo. 4.3.2 Single user figura 4.5 : Single User. Oracolo: 200 OK. La request chiede informazioni relative a un singolo utente, nell’esempio il secondo. Ottiene come riposta lo status 200, come previsto dall’oracolo. 4.3.3 Create La request Create prende in input un nome e un lavoro e li associa. L’API, inoltre, ha il compito di assegnare un ID e la data di creazione per ogni coppia nome-lavoro. L’output, infine, sarà nome, lavoro, id e data di creazione. Dalla tabella delle classi d’equivalenza si nota che si devono effettuare almeno sedici test frame, poiché sono presenti quattro classi relative al nome e quattro relative al lavoro. figura 4.6 : Request Create 26
Test black-box di API basato su partizionamento Parametrizzato il body della request (figura 4.6) si crea il file .json contenente i test, nella seguente forma: [ { “nome” : “test di nome”, “lavoro” : “test di lavoro” } ] Si passa ai test frame. Nella seguente tabella è presente il test frame con relativo oracolo e risultato ottenuto. Test-frame Test-Case Oracolo Risposta
Test black-box di API basato su partizionamento LavoroValid> Tabella 4.2 : I test frame della request Create figura 4.7. : Esecuzione della request Create Il sito non è per nulla robusto, come si nota dallo status “201” in risposta ad ogni request, poichè valuta “corretta” ogni scelta di nome o di lavoro. Nella quasi totalità dei casi è la risposta è discorde con l’oracolo. È stato effettuato, infine, anche un test relativo all’invio di un solo parametro, come il “nome” senza il parametro “lavoro”, e il sito risponde aggiungendo il nome, senza il campo lavoro. 28
Test black-box di API basato su partizionamento 4.3.4 Update Per la request “Update” sono stati usati gli stessi dati usati per la request Create, in quanto, la parametrizzazione comprende “nome” e “lavoro”. Il compito di questa richiesta è quello di aggiornare un lavoro, dato un nome. figura 4.8 : Esecuzione della Request Update Test-frame Test-Case Oracolo Risposta
Test black-box di API basato su partizionamento LavoroInvalid> imp1egato”> Tabella 4.3 : I test frame della request Update Anche in questo caso il sito è poco robusto: accetta in input qualsiasi scelta relativa alle classi d’equivalenza. A differenza della request vista in precedenza, però, se come input si usasse solo il parametro “nome”, senza “lavoro”, si avrebbe l’errore 400 Bad Request, in modo concorde all’oracolo (figura 4.9). figura 4.9 : Esecuzione della Request Update, senza il campo "lavoro" 30
Test black-box di API basato su partizionamento 4.3.5 Register e Login Poichè le due request condividono lo stesso file .json per i dati, si è optato per trattarle in contemporanea. Questa volta, a differenza delle precedenti, si è presentato un sistema più robusto, in grado di coprire un bel po’ delle classi d’equivalenza. La request Register consente di registrarsi al sito mediante un username e una password, mentre la request Login permette di accedere al sito con un username e una password. Analisi dei Test-Frame: Test-frame Test-Case Risposta Risposta Login Oracolo Oracolo Login Register Register 31
Test black-box di API basato su partizionamento Tabella 4.4 : I test frame delle requests Register e Login Dalla precedente tabella si è dedotto che il sistema è robusto in caso di Email e/o Passoword vuota, poiché in risposta è presente lo status “400 Bad Request”. Inoltre, nel caso di omissione del campo Password nella request, si presenterà un errore ancora più raffinato: missing password (figura 4.10). 32
Test black-box di API basato su partizionamento figura 4.10 : Esecuzione della Request Register, senza il campo "password" 4.3.6 Delete L’ultima request, Delete, ha il compito di eliminare un utente dal sistema. Oracolo: 204 No Content. In tal caso il sito non ha previsto nessun testo di risposta alla request, ma si può notare l’avvenuta cancellazione tramite la risposta “204 No Content”, in linea con l’oracolo. 33
Test black-box di API basato su partizionamento figura 4.11 : Esecuzione della Request Delete 4.4: Vincoli Il Category Partition, come visto nel capitolo due, si conclude con l’applicazione dei Vincoli, prima di effettuare i test-case. Questo procedimento consente di ridurre di molto il numero di test-frame e di ottimizzare i risultati. Nel Category Partition appena visto ciò non è avvenuto perché i test-frame erano trentadue, quindi del tutto gestibili. Ipotizzando, dunque, di voler ridurre il numero di test-frame si potrebbe implementare un vincolo di errore: [Error] Mancato Parametro. Questo vincolo avrebbe ridotto notevolmente i test frame in quanto i vari NomeEmpty, PasswordEmpty, IdEmpty e LavoroEmpty e NomeNULL, PasswordNULL, IdNULL e LavoroNULL sarebbero stati invalidati, così come le loro combinazioni. Da trentadue test-frame se ne otterrebbero otto. 34
Test black-box di API basato su partizionamento Conclusioni Sia la collection che il test nel loro stato attuale hanno alcuni aspetti che possono essere migliorati, ma comunque al momento soddisfa il requisito iniziale di category partition basato sull’ API-Testing. L’aspetto più vantaggioso nell’uso di questa metodologia sta nella capacità di valutare la robustezza di un insieme di API. Tutto questo è possibile grazie all’uso di Postman e alla creazione di file .json. Il punto di partenza, ovvero l’unico prerequisito dell’applicazione, è la conoscenza delle API del servizio. Si tratta di un prerequisito semplice da soddisfare, soprattutto se si pensa che le specifiche di un servizio, che successivamente diventeranno API, sono di fondamentale importanza nell’interazione tra diversi gruppi di lavoro: progettisti, sviluppatori e tester. Uno dei punti di forza è la capacità di individuare grossi errori in fase di implementazione. Ma, come descritto in precedenza, ci sono diversi aspetti che potrebbero essere migliorati: in un’ottica aziendale si potrebbe inserire nel codice degli script, che ,o descriveranno, con una stampa a video per esempio, ciò che si sta andando a testare, o verificheranno un determinato valore o parametro, così da stabilire se il test sia stato superato automaticamente. Attualmente Postman mette a disposizione “Pre-Request Script” e “Tests” per effettuare queste modifiche. Un altro aspetto da poter migliorare è sicuramente la creazione di nuove classi d’equivalenza, scelte e valori, così da poter fare un category partition più approfondito. Il sito in analisi, poiché pensato per provare sommariamente il funzionamento di test su delle API, è poco robusto, quindi creare nuovi classi d’equivalenza o scelte sarebbe uno spreco di risorse. Quindi è possibile approfondire il category partition, ma non con il sito in analisi. 35
Test black-box di API basato su partizionamento Infine, uno degli svantaggi di questa tipologia è la difficoltà di automatizzare il processo di creazione delle classi d’equivalenza, il ché comporta un notevole dispendio di risorse sia temporali, in quanto è necessario un lasso di tempo maggiore rispetto a un eventuale processo automatizzato, sia umane, in quanto gran parte del lavoro deve essere svolto manualmente da una persona. 36
Test black-box di API basato su partizionamento Bibliografia [1] Michal Young and Mauro Pezze, Software Testing and Analysis: Process, Principles and Techniques, John Wiley & Sons, Inc., USA, 2005 [2] C. Ghezzi, M. Jazayeri, D.Mandrioli, Ingegneria del software. Fondamenti e principi, Pearson, 2004 [3] Wikipedia, https://it.wikipedia.org/, 2019 37
Puoi anche leggere