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

Mickael BARON

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 Commentez .

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

- Auteur : Mickael BARON

- Parution : 20 février 2011

- Mise à jour : 19 novembre 2018

- Licence : 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 et 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.

Sommaire

- I. Exercice 1 - Inspecter et invoquer des services web

- I-A. But

- I-B. Description

- I-C. Étapes à suivre

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

- II-A. But

- II-B. Description

- II-C. Étapes à suivre

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

- III-A. But

- III-B. Description

- III-C. Étapes à suivre

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

- IV-A. But

- IV-B. Description

- IV-C. Étapes à suivre

- V. Pour aller plus loin …

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

1. <operation name="NDFDgen">

2. <documentation>Returns National Weather Service digital weather forecast data...</documentation>

3. <input message="tns:NDFDgenRequest"/>

4. <output message="tns:NDFDgenResponse"/>

5. </operation>

6. <operation name="NDFDgenLatLonList">

7. <documentation>Returns National Weather Service digital weather forecast data...</documentation>

8. <input message="tns:NDFDgenLatLonListRequest"/>

9. <output message="tns:NDFDgenLatLonListResponse"/>

10. </operation>

11. <operation name="LatLonListSubgrid">

12. <documentation>Returns a list of Latitude and longitude pairs for a rectangle defined by its lower left and upper right points...</documentation>

13. <input message="tns:LatLonListSubgridRequest"/>

14. <output message="tns:LatLonListSubgridResponse"/>

15. </operation>

Création d'un nouveau projet SOAP-UI basé sur le WSDL de la NOAA

Structure des opérations d'un projet SOAP-UI

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

Ajouter une requête à un cas de test

Suite de tests avec trois cas de tests

Exécution de la suite de tests

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

1. log.info("Chargement des propriétés à partir du fichier testprops.txt")

2. props = new java.util.Properties()

3. fis = new FileInputStream("c:/testprops.txt")

4. props.load(fis)

5. today = props.getProperty("startDate")

6. zipCode = props.getProperty("zipCode")

7. targetStep = testRunner.testCase.getTestStepByName("Properties")

8. targetStep.setPropertyValue("startDate", today)

9. targetStep.setPropertyValue("zipCode", zipCode)

10. log.info("startDate : " + today)

11. log.info("zipCode : " + zipCode)

1. startDate = 2018-11-17

2. zipCode = 10001

1. <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">

2. <soapenv:Header/>

3. <soapenv:Body>

4. <ndf:LatLonListZipCode soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

5. <zipCodeList xsi:type="xsd:string">${Properties#zipCode}</zipCodeList>

6. </ndf:LatLonListZipCode>

7. </soapenv:Body>

8. </soapenv:Envelope>

1. groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )

2. holder = groovyUtils.getXmlHolder("LatLonListZipCode - Request 1#Response" )

3. listLatLonOut = holder.getNodeValue( "//listLatLonOut" )

4. assert listLatLonOut != null

5. assert listLatLonOut.length() > 0

6. latlonNode = groovyUtils.getXmlHolder(listLatLonOut)

7. latlon = latlonNode.getNodeValue("//latLonList")

8. log.info(latlon)

9. assert latlon != null

10. context["latlon"] = latlon

1. <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">

2. <soapenv:Header/>

3. <soapenv:Body>

4. <ndf:NDFDgenByDayLatLonList soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

5. <listLatLon xsi:type="xsd:string">${latlon}</listLatLon>

6. <startDate xsi:type="xsd:date">${Properties#startDate}</startDate>

7. <numDays xsi:type="xsd:integer">1</numDays>

8. <Unit xsi:type="xsd:string">m</Unit>

9. <format xsi:type="xsd:string">24 hourly</format>

10. </ndf:NDFDgenByDayLatLonList>

11. </soapenv:Body>

12. </soapenv:Envelope>

1. groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)

2. holder = groovyUtils.getXmlHolder("NDFDgenByDayLatLonList - Request 1#Response")

3. dwmlByDayOut = holder.getNodeValue( "//dwmlByDayOut" )

4. log.info(dwmlByDayOut)

5. assert dwmlByDayOut.length() > 298

6. dwml = groovyUtils.getXmlHolder(dwmlByDayOut)

7. headTitle = dwml.getNodeValue("//head/product/title")

8. headField = dwml.getNodeValue("//head/product/field")

9. log.info(headTitle)

10. log.info(headField)

11. assert "NOAA's National Weather Service Forecast by 24 Hour Period".equals(headTitle)

12. assert "meteorological".equals(headField)

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

1. <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/">

2. <SOAP-ENV:Body>

3. <ns1:LatLonListZipCodeResponse xmlns:ns1="https://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl">

4. <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>

5. </ns1:LatLonListZipCodeResponse>

6. </SOAP-ENV:Body>

7. </SOAP-ENV:Envelope>

V - Pour aller plus loin …

- http://architects.dzone.com/articles/functional-web-services-1 : premier tutoriel sur SOAP-UI

- http://architects.dzone.com/articles/functional-web-services-2 : deuxième tutoriel sur SOAP-UI

- http://architects.dzone.com/articles/functional-web-services-3 : troisième tutoriel sur SOAP-UI

- http://www.soapui.org/ : site de l'outil

Vous pouvez retrouver cette série d'exercices sur mon compte Github : https://github.com/mickaelbaron/soapui-tutorial.

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