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 et datejma.)

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…).

Liens (potentiellement) utiles

Autres billets

Date: <2014-07-28>

Generated by Emacs 24.3.1 (Org mode 8.2.4) - Show Org source (htmlized)

CSS inspired by Tontof, colors by Chaotic Soul

Validate