Quelques notes SoapUI
Voici un premier article sur SoapUI. Un second arrivera prochainement :]
Les informations sont un peu brutes, cela me sert surtout de notes. Du
coup, c’est directement technique et suppose que vous connaissiez déjà
SoapUI. D’abord un « rappel » sur les property expansions
puis
comment on peut passer des paramètres entre les différents pas du cas
de test et comment faire des assertions variables.
Property Expansion
Voir property expansion (soapui.org).
À l’intérieur d’une requête/assertion/… on peut mettre des choses
comme ${[scope]propertyName[#xpath-expression]}
. Avec scope
parmi :
#Project#
;#TestSuite#
;#TestCase#
;#MockService#
;#Global#
;#System#
;#Env#
;[TestStep name]#
.
Par exemple ${Search
Request#Response#//ns1:Item[1]/n1:Author[1]/text()}
prend la réponse
(propertyName
= Response
) du step Search Request
(scope
=
Search Request#
) et prend le texte du nœud Item/Author
(xpath-expression
= #//ns1:Item[1]/n1:Author[1]/text()
).
On peut également utiliser une expression groovy avec ${= expr
groovy)
à l’intérieur d’une requête :
${=(int)(Math.random()*1000)}
insère un nombre aléatoire entre 0 et 999.${=request.operation.interface.project.name}
insère le nom du projet (on part de la requète et on remonte l’arbre soapUI ModelItem.
Passer des paramètres entre test steps
On va voir comment récupérer des valeurs dans un test step. Tout d’abord, créer des propriétés dans le projet (ou le testSuite ou le testCase).
- Cliquer sur le projet.
- Cliquer sur
Custom Properties
. - Ajouter des propriétés. (Pour cet exemple :
login
etdatejma
.)
On va les changer dès l’initialisation, donc pas besoin de mettre des valeurs.
Dans le test Case
On se place maintenant au niveau du cas de test et on va initialiser nos deux « propriétés ».
Initialisations
Voir scripting and the script library (soapui.org).
On peut initialiser grâce à un Groovy Script
que l’on renommera init
par
exemple, ou alors dans le test Case
, dans Setup Script
.
Dans les deux cas, on ajoute :
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context ) //on définit nos variables def login = "user" + System.currentTimeMillis().toString()[-5..-1] //user12345 def datejma = new Date().format("dd/MM/yyyy") //on change les propriétés du projet testRunner.testCase.testSuite.project.setPropertyValue("login", login) testRunner.testCase.testSuite.project.setPropertyValue("datejma" ,datejma) //on récupère la requête du step authentification def holder = groovyUtils.getXmlHolder("authentification#Request") holder.namespaces["ns"] = "http://schemas.xmlsoap.org/soap/envelope/" //On change le noeud qui va bien (<in0...>user12345</in0>) holder.setNodeValue("//ns:Body/*/in0", login) //On met à jour les changements dans l’enveloppe holder.updateProperty()
Une ligne comme testRunner.testCase.testSuite.project.setPropertyValue("maPropriete",
maValeur)
permet d’instancier maPropriete
à la valeur maValeur
dans les Custom Properties
du projet. (get and set properties (soapui.org).)
- Si on enlève
.project
on change la propriété dans la test suite. - Si on enlève
.testSuite.project
on change dans le test case.
Ici, on définit donc deux variables et on instancie les propriétés du projet à ces valeurs.
On met ensuite l’enveloppe de la requête à jour. Dans cette exemple,
on pourrait bien évidemment mettre directement dans le nœud <in0...>${#Project#login}</in0>
Passage de valeurs entre Steps
On peut également récupérer la valeur d’une balise d’une réponse pour s’en servir dans la requête suivante.
Pour cela, on peut ajouter un step property transfer
.
On choisit les propriétés de la source (Request
ou Response
d’un
step), de la cible, puis on choisit le nœud à extraire/renseigner. Par
exemple :
declare namespace ns = "http://schemas.xmlsoap.org/soap/envelope/"; //soap:Body/*/retour/idSession
dans la source et
declare namespace ns = "http://schemas.xmlsoap.org/soap/envelope/"; //soap:Header/*/identification/idSession
dans la cible.
Assertions
On va voir ici comment vérifier que la balise d’une réponse contient bien ce que l’on veut. Parce que « Contains » peut être assez limité (même avec des regexp), on va voir comment utiliser XPath Match, puis un script.
XPath Match
On choisit le nœud a tester :
declare namespace ns = "http://schemas.xmlsoap.org/soap/envelope/"; //ns:Body/*/maBalise
On dit ce que l’on attend :
${#Project#login},1234 * auie,${#Project#datejma}
Le *
, lorsque Allow Wildcards
est coché, permet de matcher
n’importe quelle valeur. (Voir xpath and xquery assertions
(soapui.org). J’ai eu des soucis lorsqu’il y en a plusieurs, ou comme
ici, lorsqu’on l’utilise avec les property expansions.)
script Assertion
Voir script assertions (soapui.org).
On peut également utiliser un script groovy si l’on veut faire des choses plus poussées. Bon, là l’exemple est le plus simple possible :
groovyUtils = new com.eviware.soapui.support.GroovyUtils(context) //la requete holder = groovyUtils.getXmlHolder( "authentification#Request" ) holder.namespaces["ns"] = "http://schemas.xmlsoap.org/soap/envelope/" reqLogin = holder.getNodeValue("//ns:Body/*/in0") //la reponse holder2 = groovyUtils.getXmlHolder( "authentification#Request" ) holder2.namespaces["ns"] = "http://schemas.xmlsoap.org/soap/envelope/" repLogin = holder2.getNodeValue("//ns:Body/*/libelleCodeRetour") //on teste que la reponse est bien celle attendue assert repLogin.equals(reqLogin)
Bien pratique si l’on veut formatter la chaîne (mettre en capitales par exemple, supprimer les traits d’union…).