IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Tutoriel sur les tests fonctionnels de services web avec SOAP-UI

Le but de cette première série d'exercices est d'apprendre à inspecter et à invoquer un service web SOAP via l'outil SOAP-UI. La leçon insiste sur la découverte des standards WSDL et SOAP et sur l'outillage proposé par SOAP-UI pour réaliser des tests fonctionnels (simulation, test de performance, validation de messages SOAP…).

Cette leçon est inspirée des articles publiés par Meera SUBBARAO sur le site de DZone.

Buts pédagogiques : lecture d'un WSDL, lecture et écriture de messages SOAP, invoquer une opération d'un service web sans programmation, création de tests fonctionnels, simulation de services web à partir de sa description.

Les codes pour les exercices sont disponibles sur le dépôt Git suivant : https://github.com/mickaelbaron/soapui-tutorial (pour récupérer le code faire : $ git clone https://github.com/mickaelbaron/soapui-tutorial).

La solution de tous les exercices est disponible sur la branche solution : $ git checkout solution

Pour réagir au contenu de ce tutoriel, un espace de dialogue vous est proposé sur le forum 11 commentaires Donner une note à l´article (5).

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Exercice 1 - Inspecter et invoquer des services web

I-A. But

  • Construire un projet SOAP-UI à partir de la description WSDL d'un service web.
  • Invoquer certaines opérations.

I-B. Description

Le site de la National Oceanic and Atmospheric Administration's (NOAA) est un service du gouvernement des États-Unis qui fournit un accès à la base complète des conditions climatiques sur le sol américain. La NOAA fournit par le biais d'un service web des opérations permettant d'interroger cette base pour connaître, par exemple, le temps dans une région donnée. Dans cet exercice, nous nous intéressons à appeler des opérations pour afficher les conditions météorologiques sur la ville de Manhattan. Consultez cette page http://graphical.weather.gov/xml/ pour obtenir des informations sur le service web.

I-C. Étapes à suivre

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<operation name="NDFDgen">
    <documentation>Returns National Weather Service digital weather forecast data...</documentation>
    <input message="tns:NDFDgenRequest"/>
    <output message="tns:NDFDgenResponse"/>
  </operation>
  <operation name="NDFDgenLatLonList">
    <documentation>Returns National Weather Service digital weather forecast data...</documentation>
    <input message="tns:NDFDgenLatLonListRequest"/>
    <output message="tns:NDFDgenLatLonListResponse"/>
  </operation>
  <operation name="LatLonListSubgrid">
    <documentation>Returns a list of Latitude and longitude pairs for a rectangle defined by its lower left and upper right points...</documentation>
    <input message="tns:LatLonListSubgridRequest"/>
    <output message="tns:LatLonListSubgridResponse"/>
  </operation>
  • Examiner le document WSDL en identifiant clairement les opérations disponibles.
  • Télécharger SOAP-UI à l'adresse suivante : http://www.soapui.org/ (onglet Download) en préférant la version compactée ZIP. SOAP-UI est un outil développé en Java. Par conséquent, faire attention à la version de votre machine virtuelle Java (32 bits ou 64 bits).
  • Démarrer ensuite SOAP-UI.
  • Construire un nouveau projet via le menu File -> New soapUI Project.
  • Dans le champ Project Name, saisir le nom du projet SOA-Labs1-NOAA, puis valider (laisser les autres paramètres par défaut).
  • Dans le champ Initial WSDL/WADL, saisir la précédente adresse de la description du service web : http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl.
Création d'un nouveau projet SOAP-UI basé sur le WSDL de la NOAA
Création d'un nouveau projet SOAP-UI basé sur le WSDL de la NOAA
  • Une fois le projet créé, SOAP-UI affiche toutes les opérations disponibles et crée un squelette de chaque requête.
Structure des opérations d'un projet SOAP-UI
Structure des opérations d'un projet SOAP-UI
  • Nous pouvons dès à présent invoquer une opération de ce service web. Double-cliquer sur le nœud Request 1 de l'opération LatLonListZipCode. Cette opération retourne des couples de valeurs Latitude/Longitude en fonction d'une liste de codes postaux américains.
  • Dans le corps de l'élément zipCodeList, saisir la valeur 10001 qui correspond au code postal de la ville de New York puis soumettre le message SOAP.
  • Vérifier le résultat de la réponse, les valeurs Latitude/Longitude doivent être 40.7198/-73.993.
  • Invoquer l'opération NDFDgenByDay qui retourne des prévisions météorologiques en fonction de la latitude, longitude, une date, une durée et un format de date. Utiliser les valeurs suivantes : latitude = 40.7198 ; longitude = -73.993 ; startDate = YYYY-MM-DD (où YYYY est l'année, MM est le mois et DD est le jour. Il faut mettre une date postérieure à la date du jour); numDays = 1, unit = m et format = 24 hourly.
  • Vérifier le résultat de la réponse, vous devriez obtenir des informations concernant la prévision météorologique sur la ville de New York (température, type de temps…).
  • Invoquer l'opération NDFDgenByDayLatLonList qui retourne des informations météorologiques en fonction d'une liste de couples de valeurs latitude/longitude, une date, une durée et un format de date. Récupérer les informations météorologiques de la ville de New York (40.7198,-73.993) et de la municipalité de Beverly Hills (code zip : 90210). Les éléments de la liste latitude/longitude sont séparés par une espace.
  • Vérifier de nouveau le résultat obtenu, vous devriez obtenir des informations concernant les prévisions météorologiques sur la ville de New York et sur la municipalité de Beverly Hills.

II. Exercice 2 - Construire une suite de tests simple (TestSuite)

II-A. But

  • Construire une suite de tests.
  • Définir des assertions pour vérifier le bon fonctionnement du service web.

II-B. Description

La création d'une suite de tests permet d'enchaîner un ensemble de cas de tests (TestCase). Un cas de test regroupe un ensemble d'étapes à réaliser. Cela peut correspondre par exemple à l'invocation d'une ou plusieurs opérations du service web. Cet exercice montre comment invoquer une opération et vérifier des assertions (contraintes qui doivent être vérifiées) à travers une suite de tests.

II-C. Étapes à suivre

  • Cliquer droit sur le nœud du projet SOA-Labs1-NOAA puis choisir New TestSuite. Saisir le nom SimpleTestSuite comme nom de la suite de tests.
  • Pour ajouter un nouveau cas de test, nous allons réutiliser les valeurs liées aux précédentes invocations (voir exercice 1). Sélectionner la requête de l'opération LatLonListZipCode, cliquer droit et faire Add to TestCase.
  • Une boîte de dialogue avec un composant à choix multiples est proposée. Choisir la valeur Simple TestSuite -> Create new TestCase puis valider.
  • Nommer le nouveau cas de test LatLonListZipCode Test Case puis valider.
  • Laisser les paramètres par défaut (voir figure ci-dessous).
Ajouter une requête à un cas de test
Ajouter une requête à un cas de test
  • Réitérer l'ajout d'un nouveau cas de test pour les opérations NDFDgenByDay et NDFDgenByDayLatLonList en nommant respectivement les cas de tests NDFDgenByDay Test Case et NDFDgenByDayLatLonList Test Case. Vous devriez obtenir le résultat suivant pour la suite de test SimpleTestSuite.
Suite de tests avec trois cas de tests
Suite de tests avec trois cas de tests
  • Les trois cas de tests sont définis dans la suite de tests. Exécuter ces cas de tests (flèche verte en haut à gauche) et vous devriez réussir les invocations des opérations.
Exécution de la suite de tests
Exécution de la suite de tests
  • À ce stade, seule l'exécution de l'opération est vérifiée. Une assertion peut être associée au résultat de manière à garantir que le test a réussi ou pas. Par défaut, seule l'assertion SOAP Response est définie. Cette assertion vérifie qu'un message SOAP est correctement retourné au client SOAP-UI. Double-cliquer sur la requête du cas de test LatLonListZipCode Test Case pour ouvrir le contenu de la requête SOAP.
Image non disponible
  • Cliquer sur le bouton Assertions situé en bas à gauche de la fenêtre requête ouverte précédemment (voir figure ci-dessous).
Image non disponible
  • Ajouter une assertion Contains permettant de vérifier si une valeur donnée est présente dans la réponse.
Image non disponible
  • Une boîte de dialogue Contains Assertion s'ouvre. Dans le champ Content indiquer la valeur 40.7198,-73.993.
Image non disponible
  • Au niveau du message SOAP de la requête, changer la valeur contenue dans le corps de l'élément zipCodeList par la valeur 20001.
  • Exécuter de nouveau la suite de tests. Le cas de test LastLonListZipCode Test Case ne doit pas passer. L'assertion sur le contenu n'est pas correcte puisque la valeur 40.7198,-73.993 n'apparaît pas dans la réponse.
  • Ajouter pour les deux autres opérations en cas de tests (NDFDgenByDay Test Case et NDFDgenByDayLatLonList Test Case), une assertion sur le contenu. Vous vérifierez notamment que le résultat SOAP de chaque opération retourne correctement les informations de localisation (balise location).

III. Exercice 3 - Construire une suite de tests complexe (TestSuite)

III-A. But

  • Enchaîner des appels à des opérations en séquence.
  • Scripts SOAP-UI via le langage Groovy.

III-B. Description

Précédemment nous avons vu comment créer des cas de tests en ajoutant des assertions pour vérifier le bon fonctionnement d'une opération. Toutefois, dans les tests précédents l'enchaînement des opérations se fait de manière manuelle. La sortie d'une opération est transférée dans l'entrée d'une autre opération. Ainsi nous montrons dans cet exercice comment enchaîner les invocations des opérations LatLonListZipCode et NDFDgenByDayLatLonList en utilisant des scripts pour transférer automatiquement la sortie à l'entrée d'une opération.

III-C. Étapes à suivre

  • À partir du projet SOA-Labs1-NOAA, créer une nouvelle suite de tests que vous appellerez Complex TestSuite.
  • Définir dans cette suite de tests un cas de test nommé LatLonListZipCode - NDFDgenByDayLatLonList Test Case.
  • Pour initialiser les entrées de l'opération LatLonListZipCode, un fichier de propriétés est utilisé contenant la date de départ (startDate) et le code postal (zipCode). Ces valeurs sont chargées puis stockées dans la suite de tests. De cette façon pour changer les paramètres d'invocation, il n'est plus nécessaire de modifier la configuration du projet SOAP-UI. Au niveau du nœud du cas de test, faire bouton droit de la souris, puis Add Step et enfin Properties (laisser le nom par défaut).
  • Une nouvelle fenêtre Properties est affichée. Créer une propriété startDate dont la valeur par défaut est 2013-MM-DD (jour qui suit la date du jour). Créer une seconde propriété zipCode dont la valeur par défaut est 10001. Le résultat attendu est celui présenté sur la figure ci-dessous.
Image non disponible
  • Au niveau de la fenêtre du cas de test LatLonListZipCode - NDFDgenByDayLatLonList Test Case, cliquer sur le bouton Setup Script et saisir le code Groovy ci-dessous qui permet de charger les propriétés d'un fichier et initialiser celles définies précédemment.
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
log.info("Chargement des propriétés à partir du fichier testprops.txt")
props = new java.util.Properties()
fis = new FileInputStream("c:/testprops.txt")
props.load(fis)
today = props.getProperty("startDate")
zipCode = props.getProperty("zipCode")
targetStep = testRunner.testCase.getTestStepByName("Properties")
targetStep.setPropertyValue("startDate", today)
targetStep.setPropertyValue("zipCode", zipCode)
log.info("startDate : " + today)
log.info("zipCode : " + zipCode)
Image non disponible
  • Créer à la racine du lecteur C un fichier nommé testprops.txt.
  • Modifier le contenu du fichier de la manière suivante.
 
Sélectionnez
1.
2.
startDate = 2018-11-17
zipCode = 10001
  • Exécuter le cas de test et remarquer dans la console de log (script log) l'affichage des valeurs des propriétés startDate et zipCode.
Image non disponible
  • Ajouter au cas de test en cours la requête de l'opération LatLonListZipCode (bien s'assurer de choisir le cas de test de la suite de test ComplexTestSuite). Une deuxième étape a été normalement ajoutée dans le cas de test.
  • Modifier le message SOAP de la requête de ce deuxième cas de test de manière à ajouter la valeur ${Properties#zipCode} dans la liste des codes postaux (voir résultat attendu sur la figure ci-dessous).
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ndf="https://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl">
   <soapenv:Header/>
   <soapenv:Body>
      <ndf:LatLonListZipCode soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <zipCodeList xsi:type="xsd:string">${Properties#zipCode}</zipCodeList>
      </ndf:LatLonListZipCode>
   </soapenv:Body>
</soapenv:Envelope>
Image non disponible
  • Ajouter dans le cas de test, une nouvelle étape qui est un script Groovy. Nommer ce script Parse LatLonListZipCode Response.
  • Ajouter le code Groovy comme montré ci-dessous. Ce script extrait des informations issues de la réponse XML de l’opération appelée. Des assertions sont également réalisées pour assurer que la réponse soit correcte.
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
holder = groovyUtils.getXmlHolder("LatLonListZipCode - Request 1#Response" )
listLatLonOut = holder.getNodeValue( "//listLatLonOut" )
assert listLatLonOut != null
assert listLatLonOut.length() > 0
latlonNode = groovyUtils.getXmlHolder(listLatLonOut)
latlon = latlonNode.getNodeValue("//latLonList")
log.info(latlon)
assert latlon != null
context["latlon"] = latlon
  • Exécuter la suite de test et s’assurer que dans la console de log la latitude et la longitude soient correctement affichées.
Image non disponible
  • Ajouter au cas de test en cours, la requête de l'opération NDFDgenByDayLatLonList. Une quatrième étape a été ajoutée dans le cas de test.
  • Modifier le message SOAP de la requête de ce quatrième cas de test de manière à ajouter la valeur ${latlon} dans la liste des latitudes et longitudes (élément listLatLon) et à ajouter la valeur ${Properties#startDate} pour la date de départ (élément startDate), voir ci-dessous.
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ndf="https://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl">
   <soapenv:Header/>
   <soapenv:Body>
      <ndf:NDFDgenByDayLatLonList soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <listLatLon xsi:type="xsd:string">${latlon}</listLatLon>
         <startDate xsi:type="xsd:date">${Properties#startDate}</startDate>
         <numDays xsi:type="xsd:integer">1</numDays>
         <Unit xsi:type="xsd:string">m</Unit>
         <format xsi:type="xsd:string">24 hourly</format>
      </ndf:NDFDgenByDayLatLonList>
   </soapenv:Body>
</soapenv:Envelope>
Image non disponible
  • Ajouter dans le cas de test, une dernière étape qui est un script Groovy. Nommer ce script Parse NDFDgenByDayLatLonList Response.
  • Ajouter le code Groovy comme montré sur le code ci-dessous. Ce script extrait des informations issues de la réponse XML et effectue des assertions pour vérifier que le comportement de cette opération est correct.
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
holder = groovyUtils.getXmlHolder("NDFDgenByDayLatLonList - Request 1#Response")
dwmlByDayOut = holder.getNodeValue( "//dwmlByDayOut" )
log.info(dwmlByDayOut)
assert dwmlByDayOut.length() > 298
dwml = groovyUtils.getXmlHolder(dwmlByDayOut)
headTitle = dwml.getNodeValue("//head/product/title")
headField = dwml.getNodeValue("//head/product/field")
log.info(headTitle)
log.info(headField)
assert "NOAA's National Weather Service Forecast by 24 Hour Period".equals(headTitle)
assert "meteorological".equals(headField)
  • Ouvrir l'éditeur du cas de test LatLonListZipCode - NDFDgenByDayLatLonList Test Case et l'exécuter pour s'assurer que le test passe.
Image non disponible

IV. Exercice 4 - Simuler un service web à partir de sa description WSDL

IV-A. But

  • But : simuler un service web (MockService, MockResponse) à partir d'une description WSDL.

IV-B. Description

La simulation d'un service web est utilisée dans le cas où l'implémentation du service web en question n'est pas encore implémentée ou si le service web est actuellement dans un état d'indisponibilité (serveur indisponible dû à une défaillance). Dans cet exercice, nous considérons que l'appel à l'opération LatLonListZipCode n'est plus autorisé (opération en maintenance). Par conséquent nous mettons en place une simulation du comportement de cette opération.

IV-C. Étapes à suivre

  • À partir du projet SOA-Labs1-NOAA, cliquer droit et créer un New MockService appelé MockService NOAA.
  • Choisir l'opération LatLonListZipCode dans la liste des opérations disponibles et faire Add to MockService.
  • Une réponse est automatiquement créée (Response 1). Modifier le contenu en s'assurant que la valeur de la latitude et de la longitude correspondent aux valeurs suivantes : 40.7198 et -73.993.
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
      <ns1:LatLonListZipCodeResponse xmlns:ns1="https://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl">
         <listLatLonOut xsi:type="xsd:string">&lt;?xml version='1.0'?>&lt;dwml version='1.0' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='https://graphical.weather.gov/xml/DWMLgen/schema/DWML.xsd'>&lt;latLonList>40.7198,-73.993&lt;/latLonList>&lt;/dwml></listLatLonOut>
      </ns1:LatLonListZipCodeResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  • Sélectionner la réponse (Response 1) de MockService NOAA, faire un clic droit puis Open Request.
  • Choisir Create New et définir comme nom Request From MockService NOAA. Au niveau de l'opération LatLonListZipCode deux requêtes sont maintenant disponibles (voir figure ci-dessous).
Image non disponible
  • Ajouter la requête (Request From MockService NOAA) au cas de test LatLonListZipCode - NDFDgenByDayLatLonList Test Case défini dans l'exercice 3 (ComplexTestSuite).
  • Déplacer la nouvelle requête de l'opération LatLonListZipCode en deuxième position puis désactiver la requête Request 1 (voir figure ci-dessous).
Image non disponible
  • Démarrer la simulation de MockService NOAA (clic droit sur MockService NOAA puis Start Minimized).
  • Exécuter la suite de tests pour s'assurer que le test est passé.

V. Pour aller plus loin …

Vous pouvez retrouver cette série d'exercices sur mon compte Github : https://github.com/mickaelbaron/soapui-tutorialApprendre à inspecter et à invoquer un service web SOAP via l’outil SOAP-UI.

Je tiens à remercier f-leb pour sa relecture orthographique attentive de cet article.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Mickael BARON. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.