Pages

mardi 26 novembre 2013

Gatling épisode 3 : tester un webservice SOAP

Je vous propose aujourd’hui un troisième article dans cette saga afin de partager un exemple de test d’un webservice SOAP.



Dans l’épisode 1 je suis revenu sur l’intervention du fondateur de Gatling, Stéphane Landelle venu au Jug Lyon présenté l’outil

Dans l’épisode 2 j’ai expliqué comment rapidement démarrer un projet Gatling

Récupérer les requêtes SOAP de votre application
Lorsque vous devez tester un webservice distant vous pouvez soit développer un client webservice (voir l’article où j’explique comment le faire avec Spring et celui sur l’interception des messages) soit utiliser un client générique. Personnellement j’utilise souvent la version libre de SoapUI. SoapUI est une solution très simple qui génère automatiquement des patterns d’appel à un webservice en fonction de son contrat (fichier wsdl).

Le protocole SOAP est basé sur du HTTP donc si vous utilisez la première solution c’est assez simple de faire pointer votre client vers le proxy fourni par le Recorder Gatling. Pour la deuxième solution vous avez déjà la requête SOAP.

Dans l’exemple que je vais vous donner je connais la requête SOAP
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:ns="http://javamind.com/gatling/sample/1.0">
  <soapenv:Header/>
    <soapenv:Body>
      <ns:produitTarifeRequest>
        <critere>
          <codePays>FR</codePays>
          <typeDeProduit>COMPLEXE</typeDeProduit>
          <forme>AE</forme>
          <volumePoids>12</volumePoids>
        </critere>
      </ns:produitTarifeRequest>
    </soapenv:Body>
 </soapenv:Envelope>

La réponse attendue est la suivante
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://scnhemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <ns2:produitTarifeResponse 
            xmlnsn:ns2="http://javamind.com/gatling/sample/1.0">
      <id>1372</id>
      <codeProdTarif>E 1041</codeProdTarif>
    </ns2:produitTarifeResponse>
  </soapenv:Body>
</soapenv:Envelope>

Je ne vais pas m’attarder sur le wsdl pour ne pas surcharger l’article. On considérera simplement que le nom de l’opération SOAP sera
http://javamind.com/demanderProduit

Création du scénario d’appel
Maintenant que nous connaissons la requête et la réponse, le script est assez simple à mettre en place

class GtaSimulation extends Simulation {

  val httpConf = httpConfig
        .acceptHeader("text/html,text/xml,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
        .acceptEncodingHeader("gzip, deflate")
        .acceptLanguageHeader("fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3")
        .connection("keep-alive")
        .userAgentHeader("Apache-HttpClient/4.1.1 (java 1.5)")

  //On indique dans le header HTTP la SOAP Action que nous allons appeler 

  val  headers_2 = Map(
        "Accept-Encoding" -> """gzip,deflate""",
        "Content-Type" -> """text/xml;charset=UTF-8""",
        "SOAPAction" -> """http://javamind.com/demanderProduit"""
  )

  val scn = scenario("Appel exemple")
      .exec(
        http("test appel WS")
          .post("http://localhost:8080/javamind/sample-ws")
          .headers(headers_2)
          .body("""<soapenv:Envelope 
                        xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                        xmlns:ns="http://javamind.com/gatling/sample/1.0">
                    <soapenv:Header/>
                    <soapenv:Body>
                    <ns:produitTarifeRequest>
                    <critere>
                    <codePays>FR</codePays>
                    <typeDeProduit>COMPLEXE</typeDeProduit>
                    <forme>AE</forme>
                    <volumePoids>12</volumePoids>
                    </critere>
                    </ns:produitTarifeRequest>
                    </soapenv:Body>
                    </soapenv:Envelope> """)

          .check(status.is(200))

          //Contrôle du contenu du fichier via Xpath
          .check(
            xpath("/soapenv:Envelope/soapenv:Body/ns2:produitTarifeResponse/codeProdTarif",
              List("soapenv" -> "http://schemas.xmlsoap.org/soap/envelope/",
                "ns2" -> "http://javamind.com/gatling/sample/1.0"))
          .is("E 1041"))
        )
  setUp(scn.users(1000).ramp(250).protocolConfig(httpConf))

}

L'utilisation de Xpath n'est pas toujours simple à comprendre surtout dans le cas des messages SOAP où l'on utilise plusieurs namespaces pour les données. Dans notre exemple, je vérifie que le code retourné est bien égal à la valeur E 1041.

Il ne vous reste plus qu'à exécuter votre scénario

Erreur éventuelle avec les check xpath
Attention si vous utilisez une version de Gatling < 1.5.3 vous pouvez avoir l’erreur ci dessous

22:16:09.921 [INFO ] c.e.e.g.h.a.HttpRequestAction - Sending Request 'test appel WS': Scenario 'Appel exemple', UserId #73
[ERROR] [11/25/2013 22:16:09.937] [GatlingSystem-akka.actor.default-dispatcher-2]
[akka://GatlingSystem/user/$b/$ib] null
java.nio.BufferUnderflowException
at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:145)
at com.excilys.ebi.gatling.core.util.ByteBufferInputStream.read(ByteBufferInputStream.scala:30)

Donc utilisez bien la dernière version de l’outil.


Aucun commentaire:

Enregistrer un commentaire

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.