Test black-box di API basato su partizionamento - Ingegneria Informatica

Pagina creata da Asia Mauri
 
CONTINUA A LEGGERE
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