Asserzioni in SoapUI: script, XQuery, esercitazione sui tipi XPath

Cos'รจ un'asserzione?

Asserzione significa atto di affermare o affermare qualcosa. Puรฒ anche essere interpretato come punto di controllo o punto di convalida.

Una volta inviata una richiesta a un server Web, viene ricevuta una risposta. Dobbiamo verificare se la risposta contiene i dati che ci aspettiamo. Per validare la risposta dobbiamo utilizzare delle asserzioni.

Tipi di asserzione

Esistono vari modi per affermare una risposta; tuttavia, ci concentreremo sui tipi di asserzioni SoapUI comunemente utilizzati durante la convalida di una risposta. Di seguito sono riportati quelli disponibili nella versione Open Source di SoapUI.

  1. Contenuto della proprietร 
  2. Standard sullo stato di conformitร 
  3. Copione
  4. SLA
  5. JMS
  6. Sicurezza
Tipi di asserzioni in SoapUI
Tipi di asserzioni in SoapUI

Oltre a quelli elencati sopra, la versione PRO ha anche un'asserzione JDBC integrata utilizzando la quale possiamo affermare se il servizio web ha aggiornato correttamente il database.

CONTIENE ASSERZIONE

Cerca l'esistenza della stringa specificata. Supporta anche le espressioni regolari.

Continueremo con lo stesso esempio del tutorial precedente con la richiesta WSDL as http://www.dneonline.com/calculator.asmx.

Passo 1: Per impostazione predefinita non ci sono asserzioni.

  • Il numero di asserzioni รจ mostrato nella scheda Asserzioni.
  • Per aggiungere una nuova asserzione, fare clic sul pulsante "Aggiungi nuova asserzione".

Contiene asserzione

Passo 2: Adesso,

  1. Seleziona la categoria di asserzione.
  2. Seleziona il tipo di asserzione.
  3. Fai clic su "Aggiungi"

Contiene asserzione

Passo 3: Convalidiamo se la stringa '46' esiste nella risposta. Fare clic su "OK"

Nota: possiamo anche ignorare maiuscole e minuscole e aggiungere espressioni regolari.

Contiene asserzione

Passo 4: Dopo averlo aggiunto, viene eseguita immediatamente l'asserzione e viene mostrato se VALIDO o NON VALIDO.

Contiene asserzione

Passo 5: Ora supponiamo di modificare il contenuto di "Contiene asserzione in SoapUI" in "47" e vediamo cosa succede.

Contiene asserzione

Passo 6: L'asserzione viene eseguita e il risultato viene inviato all'utente. Poichรฉ nella risposta non รจ presente la stringa "47", l'asserzione non รจ riuscita.

Contiene asserzione

NON CONTIENE ASSERZIONE

Cerca la non esistenza della stringa specificata. Supporta anche le espressioni regolari.

Passo 1: Ora, dopo aver fatto clic sul pulsante "aggiungi nuove asserzioni",

  1. Seleziona la categoria di asserzione.
  2. Seleziona il tipo di asserzione: in questo caso "NON contiene"
  3. Fai clic su "Aggiungi"

Non contiene asserzione

Passo 2: Convalidiamo se la stringa 'intA' esiste nella risposta. Inserisci la stringa "FromCurrency" e fai clic su "OK"

Non contiene asserzione

Passo 3: Non appena viene aggiunta un'asserzione, viene eseguita e visualizza il risultato. Finora abbiamo aggiunto due asserzioni, quindi entrambe le asserzioni vengono eseguite e visualizzato il risultato.

Non contiene asserzione

Passo 4: Ora modifichiamo il contenuto di "Non contiene asserzione" e vediamo cosa succede. Verificheremo l'inesistenza della stringa โ€œAddResultโ€.

Non contiene asserzione

Passo 5: La stringa "AddResult" รจ effettivamente presente nella risposta, quindi l'asserzione "NOT Contiene" fallirร  come mostrato di seguito.

Non contiene asserzione

ASSERZIONE DI CORRISPONDENZA XPATH

si utilizza XPath espressione per selezionare il nodo di destinazione e i suoi valori. XPath, รจ un linguaggio di query XML per la selezione di nodi da un documento XML.

Passo 1: Ora, dopo aver fatto clic sul pulsante "Aggiungi nuove asserzioni",

  1. Seleziona la categoria di asserzione.
  2. Seleziona il tipo di asserzione: in questo caso "XPath Match"
  3. Fai clic su "Aggiungi"

Asserzione corrispondenza XPath

Passo 2: Si apre la finestra Aggiungi XPath.

Prima di aggiungere SoapUI XPath, dobbiamo dichiarare il NameSpace. Uno spazio dei nomi XML รจ una raccolta di nomi, identificati da un riferimento URI (Uniform Resource Identifier), utilizzati nei documenti XML come nomi di elementi e attributi. Lo stesso viene utilizzato nell'asserzione SOAP UI XPath.

Per dichiarare lo spazio dei nomi XML, dobbiamo solo fare clic sul pulsante "Dichiara" che farebbe il lavoro per noi, altrimenti possiamo anche dichiarare manualmente uno spazio dei nomi.

Dopo aver dichiarato lo spazio dei nomi, dobbiamo fare riferimento a XPath utilizzando lo spazio dei nomi creato.

Facendo clic sul pulsante "Dichiara", verranno visualizzati due spazi dei nomi poichรฉ abbiamo due URI. Uno di questi รจ l'URL dello schema e l'altro corrisponde all'URL del servizio Web effettivo. Dobbiamo utilizzare lo spazio dei nomi effettivo in cui si trova il servizio Web e NON lo spazio dei nomi dello schema mentre facciamo riferimento a XPath.

Asserzione corrispondenza XPath

dichiarare lo spazio dei nomi soap='http://schemas.xmlsoap.org/soap/envelope/';

dichiarare lo spazio dei nomi ns1='http://tempuri.org/';

Asserzione corrispondenza XPath

Passo 3: Ora dobbiamo inserire l'XPath del nodo XML che dobbiamo validare.

//ns1:AddResult Ci fornisce il valore del nodo racchiuso tra & e ns1 corrisponde allo spazio dei nomi dichiarato che punta a "http://tempuri.org/"

Dopo aver inserito l'XML, dobbiamo fare clic su "Seleziona da corrente" in modo che il valore della risposta corrente venga prelevato per il confronto futuro.

Asserzione corrispondenza XPath

Passo 4: Finora,

  1. Dopo aver dichiarato gli spazi dei nomi, abbiamo inserito il nodo XPath del XML che dobbiamo convalidare.
  2. Dobbiamo fare clic su "Seleziona da corrente" per rendere il valore corrente come valore previsto.
  3. All'utente viene mostrato il valore corrente che possiamo modificare se necessario.
  4. Fare clic su "Salva".

Asserzione corrispondenza XPath

Passo 5: L'asserzione aggiunta in SoapUI verrร  visualizzata come mostrato di seguito.

Asserzione corrispondenza XPath

Asserzioni di scripting

Questa tecnica di asserzione รจ quella piรน utilizzata poichรฉ รจ estremamente difficile gestire e mantenere centinaia di asserzioni.

L'interfaccia utente SOAP utilizza entrambi Groovy Script o JavaCopione per le asserzioni di scripting. La tecnica di scripting รจ adottata per sviluppare un framework per testare SOAP. Le asserzioni di scripting sono utilizzate nelle seguenti circostanze.

Lo scripting consente all'utente di eseguire alcune operazioni prima e dopo l'esecuzione di un TestCase utilizzando rispettivamente i metodi di impostazione e smontaggio. L'impostazione รจ una procedura che viene eseguita prima di eseguire un metodo particolare (esempio: creazione e inizializzazione di oggetti) mentre lo smontaggio รจ una procedura che viene eseguita dopo aver eseguito il metodo (ad esempio: distruzione di oggetti e pulizia). Questa funzionalitร  non รจ disponibile in altri tipi di asserzione e puรฒ essere eseguita solo tramite codifica.

Consente agli utenti di eseguire l'apertura/chiusura di un progetto, per inizializzare o pulire le impostazioni relative al progetto e anche per lavorare con variabili ambientali che sono molto utili durante lo scripting.

Ci aiuta ad affermare un contenuto di risposta dinamico.

Le asserzioni di scripting vengono utilizzate per creare asserzioni definite dall'utente che NON sono predefinite dall'interfaccia utente SOAP.

Per dimostrare l'asserzione dello script in SoapUI, utilizzeremo la calcolatrice WSDL, il test case "Aggiungi" che avevamo creato in precedenza.

Passo 1: La procedura per aggiungere uno script groovy รจ la stessa di quella delle altre asserzioni, tranne per il fatto che l'asserzione non รจ predefinita. Si tratta invece di un'asserzione definita dall'utente che offre maggiore flessibilitร  rispetto a quelle integrate.

Selezionare la fase del test rispetto alla quale deve essere aggiunta l'asserzione.

Asserzioni di scripting

Fare clic sul pulsante "Aggiungi asserzione" come mostrato di seguito.

Asserzioni di scripting

Passo 2: Ora seleziona la categoria Asserzione.

  1. In questo caso รจ Script.
  2. Seleziona Asserzione script SoapUI e non sono presenti sottotipi associati.
  3. Fare clic su "Aggiungi".

Asserzioni di scripting

Passo 3: Si apre la finestra di dialogo Scripting in cui l'utente potrร  scrivere uno script definito dall'utente per convalidare l'XML di risposta.

Asserzioni di scripting

Passo 4: Ora scriviamo uno script interessante per convalidare il tasso di conversione. Lo script รจ allegato di seguito con i commenti incorporati. Si consiglia di avere conoscenze in merito Java Scrittura o Groovy Script prima di provare a scrivere il tuo script.

//Define Groovy Utils and holder for validating the XML reponse content
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def holder = groovyUtils.getXmlHolder(messageExchange.responseContent)

//Define the NameSpace
holder.namespaces["ns1"] = "http://tempuri.org/"

//Get the Value of the Node 'AddResult' and assign to a variable
def addResult = holder.getNodeValue("//ns1:AddResult")

//print the value of the result in the Output panel
log.info "The result value for integers is " + addResult

//Comparing the value to print 'Pass' or 'Fail'
if(addResult=="46")
{ log.info "Pass" }
else
{ log.info "fail"}
  1. Fare clic sul pulsante "Esegui" per attivare l'esecuzione.
  2. L'output dello script viene visualizzato nel riquadro Output. Ha stampato sia il valore di conversione che il risultato finale (Passato o Fallito)
  3. Viene visualizzata l'informazione "Asserzione script superata". Fare clic su OK.

Nota: il popup informativo finale verrร  sempre visualizzato con il messaggio "Asserzione script superata" purchรฉ lo script sia sintatticamente corretto. Non ha alcuna correlazione con la tua affermazione all'interno della sceneggiatura.

Asserzioni di scripting

fare clic su OK

Passo 5: Ora la scheda asserzioni mostra tutte le asserzioni che abbiamo aggiunto per questa suite di test con lo Stato rispetto a ciascuna di esse.

Asserzioni di scripting

Passo 6: Ora

  1. Selezionare la Test Suite dall'albero del Navigatore
  2. Fare clic sul pulsante "Esegui".
  3. I risultati verranno visualizzati per l'intera suite di test.

Asserzioni di scripting

Asserzione di corrispondenza Xquery

Utilizza un'espressione Xquery per selezionare il contenuto dalla proprietร  di destinazione. Abbiamo bisogno di un XML di risposta molto piรน grande per comprendere meglio l'asserzione XQuery in SoapUI. Importiamo un altro WSDL come mostrato di seguito: http://www.webservicex.net/medicareSupplier.asmx?WSDL

Passo 1: Esegui un clic destro sul progetto esistente e seleziona "Aggiungi WSDL".

Asserzione di corrispondenza Xquery

Passo 2: Esegui un clic destro sul progetto esistente e seleziona "Aggiungi WSDL". Lasciare le altre opzioni come predefinite e fare clic sul pulsante "OK".

Asserzione di corrispondenza Xquery

Passo 3: Tutte le operazioni sono elencate come mostrato di seguito.

Asserzione di corrispondenza Xquery

Passo 4: Ora aggiungiamo a Test Case all'interno della stessa suite di test per cui avevamo creato Collaudo il convertitore di valuta.

Asserzione di corrispondenza Xquery

Passo 5: Immettere il nome del caso di test e fare clic sul pulsante "OK".

Asserzione di corrispondenza Xquery

Passo 6: Il caso di test viene creato come mostrato di seguito.

Asserzione di corrispondenza Xquery

Passo 7: Aggiungi
una nuova fase di test di tipo "Soap Test Request" come mostrato di seguito.

Asserzione di corrispondenza Xquery

Passo 8: Immettere il nome della fase di test. Diciamo: Supplier_by_City che sarebbe piรน significativo. Fare clic su "OK".

Asserzione di corrispondenza Xquery

Passo 9: Seleziona il Operazione che vorremmo convalidare. In questo caso รจ 'MedicareSupplierSoap -> GetSupplierByCity'. Fai clic su 'OK'.

Asserzione di corrispondenza Xquery

Passo 10: Immettere il nome del caso di test e fare clic su "OK".

Asserzione di corrispondenza Xquery

Passo 11: La struttura XML della richiesta verrร  visualizzata come mostrato di seguito.

 Asserzione di corrispondenza Xquery

Passo 12: Cerchiamo ora di trovare tutte le informazioni sui fornitori per la cittร  di "New York".

Per farlo, aggiungi le seguenti righe al tuo codice.

<GetSupplierByCity xmlns="http://www.webservicex.net/">

<City>New York</City>

</GetSupplierByCity>

WSDL nell'URL seguente โ€“ http://www.webservicex.net/medicareSupplier.asmx?op=GetSupplierByCity

Asserzione di corrispondenza Xquery

Passo 13: Dopo aver eseguito il test, riceviamo la risposta seguente

Asserzione di corrispondenza Xquery

Passo 14: Diciamo che dobbiamo convalidare tutto il numero del fornitore. Non possiamo utilizzare XPath Assertion poichรฉ dobbiamo avere centinaia di XPath Assertion. Quindi l'utilizzo di XQuery in questo caso รจ inevitabile.

XQuery Assertion ci aiuta a convalidare un gruppo di risposte XML di natura ripetitiva.

Asserzione di corrispondenza Xquery

Passo 15: Ora fai clic su "Aggiungi un'asserzione",

  1. Selezionare la "Categoria di asserzione" โ€“ Contenuto della proprietร  in questo caso.
  2. Seleziona il tipo di asserzione come "Asserzione XQuery"
  3. Fare clic su "Aggiungi".

Asserzione di corrispondenza Xquery

Passo 16: Similmente a XPath Assertion, dobbiamo dichiarare lo spazio dei nomi.

  1. Fare clic sul pulsante "Dichiara" per consentire automaticamente all'interfaccia utente SOAP di dichiarare lo spazio dei nomi. Facendo clic sul pulsante di dichiarazione, all'utente verrร  visualizzato un "POP up" con il messaggio "dichiara invece lo spazio dei nomi dallo schema". Fare clic su "Sรฌ" per procedere come mostrato di seguito.

    Nota: Premendo il pulsante "Dichiara" potresti ritrovarti con URL diversi come dichiarazione dello spazio dei nomi, tuttavia, lo spazio dei nomi della posizione del servizio Web effettivo รจ quello che verrebbe considerato per la codifica.

    Asserzione di corrispondenza Xquery

  2. Per recuperare tutto il Numero Fornitore, dobbiamo scrivere una query XPath e la inseriremo all'interno di <Numero Fornitore> e Tag.
  3. Fare clic su "Seleziona dalla corrente" per eseguire la risposta corrente.
  4. Facendo clic su "Seleziona dal corrente", vengono elencati tutti i numeri del fornitore.
  5. Fare clic su "Salva".
// Namespace declaration
declare namespace soap='http://schemas.xmlsoap.org/soap/envelope/';
declare namespace ns1='http://www.webservicex.net/';
declare namespace x = '';

// Placing the result in Myresult Tags

{
// Iterating through all the supplier number 
for $x in //ns1:GetSupplierByCityResponse/ns1:SupplierDataLists/ns1:SupplierDatas/ns1:SupplierData

//Return all the Supplier number within โ€˜SupplierNumberโ€™ Tags.
return {data($x/ns1:SupplierNumber)}
}

Asserzione di corrispondenza Xquery

Passo 17: L'asserzione XQuery viene eseguita e visualizza il risultato finale nel pannello "Asserzione" come mostrato di seguito. Ora abbiamo aggiunto con successo un'asserzione Xquery utilizzando la quale abbiamo convalidato tutte le informazioni sul numero del fornitore. Lo stesso verrebbe confrontato con i dati effettivi, ogni volta che la richiesta viene inviata al server web.

Nota: i valori effettivi non verranno visualizzati. Se tutti i valori effettivi sono uguali a quelli attesi, verrร  visualizzato VALID altrimenti verrร  visualizzato 'Failed'.

Asserzione di corrispondenza Xquery

Quando utilizzare l'asserzione incorporata?

  • Quando una risposta รจ breve in modo tale da poter essere convalidata utilizzando una di quelle asserzioni integrate.
  • Possiamo anche utilizzare Inbuilt Assertion se la risposta inviata dal server web รจ sempre di natura statica. Se รจ dinamico, non saremo in grado di affermarlo utilizzando asserzioni integrate.
  • Quando l'utilizzo di asserzioni integrate come asserzioni di timeout e asserzioni di sicurezza diventa inevitabile.
  • Le asserzioni integrate sono abbastanza valide per l'utilizzo una tantum in cui i test non devono essere ripetuti.

Opzioni di asserzioni

Le asserzioni create possono essere controllate al meglio con l'aiuto del pannello di controllo evidenziato di seguito.

Opzioni di asserzioni

Le asserzioni create consentono ai tester di configurare le seguenti cose dalla cassetta degli attrezzi delle asserzioni.

Opzione Descrizione

Opzioni di asserzioni

L'asserzione selezionata avanza nell'ordine.

Opzioni di asserzioni

L'asserzione selezionata si sposta verso il basso nell'ordine.

Opzioni di asserzioni

Rimuove l'asserzione selezionata

Opzioni di asserzioni

Riconfigurare/modificare l'asserzione selezionata.
  • Di seguito sono riportate le funzionalitร  disponibili esclusivamente nella versione PRO dell'interfaccia utente SOAP. La versione PRO ci aiuta anche a Raggruppare le asserzioni in modo da poter aggiungere un ulteriore livello di convalida alle asserzioni create.
  • AND: Tutte le asserzioni vengono valutate come VALIDE, il che risulterร  in una condizione di gruppo PASSATA. OPPURE: Almeno una delle asserzioni all'interno del gruppo deve essere VALIDA per poter affermare una condizione di gruppo PASSATA.

  • La versione Pro consente anche Clonazione di asserzioni: questa opzione consente ai tester di copiare un'asserzione in una fase di test diversa nello stesso o in un progetto diverso.
  • Disabilita/Abilita asserzioni: questa opzione consente di disabilitare o abilitare qualsiasi asserzione raggruppata o non raggruppata. Se un'asserzione รจ disabilitata, viene visualizzata in grigio e quando viene eseguito un test case, le asserzioni disabilitate non verranno eseguite.
  • Separa asserzioni: qualsiasi asserzione raggruppata puรฒ essere separata se i tester decidono di farlo.

Elenco completo dei metodi disponibili in vari tipi di asserzioni

Meccanismo di affermazione

Descrizione

CONTENUTO DELL'IMMOBILE
contiene Cerca l'esistenza della stringa specificata. Supporta anche le espressioni regolari.
Non contiene Cerca la non esistenza della stringa specificata. Supporta anche le espressioni regolari.
Corrispondenza XPath Utilizza l'espressione XPath per selezionare il nodo di destinazione e i relativi valori.
Corrispondenza XQuery Utilizza un'espressione Xquery per selezionare il contenuto dalla proprietร  di destinazione.
Conformitร , stato, standard
HTTP Scarica tutte le risorse Convalida il documento HTML dopo il download e rimane valido per qualsiasi proprietร  contenente HTML.
Codici di stato HTTP non validi Verifica se la risposta HTML contiene un codice di stato che non รจ presente nell'elenco dei codici definiti.
Non รจ un errore SOAP Verifica se l'ultimo messaggio ricevuto non รจ un errore SOAP. รˆ ovvio che รจ applicabile solo per le fasi del test SOAP.
Conformitร  allo schema Verifica se l'ultimo messaggio ricevuto รจ conforme alla definizione dello schema standard WSDL o WADL. Vale anche per le fasi di test SOAP e REST.
Errore SOAP Verifica se l'ultimo messaggio ricevuto รจ un errore SOAP. รˆ l'inverso delle asserzioni di errore "NOT SOAP".
Risposta SAPONE Verifica se l'ultima risposta ricevuta รจ una risposta SOAP valida e vale solo per i passaggi della richiesta di test SOAP.
Codici di stato HTTP validi Verifica se la risposta HTML contiene un codice di stato presente nell'elenco dei codici definiti. รˆ l'inverso dell'asserzione "Codici di stato HTTP non validi".
Richiesta di indirizzamento WS Verifica se l'ultima richiesta ricevuta contiene intestazioni WS-Addressing appropriate.
Risposta all'indirizzamento WS Verifica se l'ultima risposta ricevuta contiene intestazioni WS-Addressing appropriate.
Stato WS-Security Convalida se l'ultimo messaggio ricevuto contiene intestazioni WS-Security valide e vale solo per le richieste SOAP.
Copione
Asserzione di copione Consente agli utenti di eseguire uno script personalizzato per eseguire convalide definite dall'utente.
SLA
SLA di risposta Convalida se il tempo di risposta dell'ultima risposta ricevuta rientrava nel limite definito.
JMS
Stato JMS Verifica se la richiesta JMS della fase di test รจ stata eseguita correttamente ed รจ valida per le fasi di test con un endpoint JMS.
Timeout JMS Verifica se la risposta JMS di una fase di test non ha richiesto piรน tempo della durata specificata.
Sicurezza
Esposizione di informazioni sensibili Verifica se il messaggio di risposta non espone informazioni riservate sul sistema di destinazione. Possiamo utilizzare questa affermazione per le fasi di test REST, SOAP e HTTP.

SCARICA IL PROGETTO SOAPUI CONTENENTE LE ASSERZIONI DI CUI SOPRA

Errori comuni e risoluzione dei problemi

Utilizza lo spazio dei nomi corretto. Lo spazio dei nomi dovrebbe essere l'URL in cui si trova il servizio Web.

Se viene generato un errore durante lo sviluppo di un'asserzione di scripting, utilizzare 'log.info' per stampare il contenuto delle variabili

Se non si ottiene l'output desiderato, verificare che nella richiesta venga passato un input valido.

Ad esempio, nel convertitore di valuta, se inserisci "intA" come "x" che non รจ un numero intero, l'output genera un codice di errore come "SOAP-Client", il che significa che il problema riguarda il parametro che viene passato dal dalla parte del cliente.

Errori comuni e risoluzione dei problemi

Errori comuni e risoluzione dei problemi

Assicurarsi di utilizzare la sintassi corretta durante l'utilizzo dell'asserzione XPATH e XQuery. NON dovresti usare punto(.) invece di due punti(:) mentre usi l'asserzione precedente. La sintassi รจ //namespace:Tagnaname e NON //namespace.tagname. In questo modo, potresti ritrovarti con il messaggio "NESSUNA corrispondenza nella risposta corrente" anche se il nome del tag รจ corretto.

Errori comuni e risoluzione dei problemi

Riassumi questo post con: