2017-03-22 1 views
1

J'ai besoin d'un peu d'aide pour m'habituer à Rest Assured.RestAssured: impossible d'analyser la réponse pour la valeur requise à l'aide de Xpath

J'ai une requête que je construis en tant que String (ces tests sont nécessairement simplifiés pour l'instant comme cela sera maintenu par les testeurs donc l'utilisation de concepts plus avancés comme JAXB est en retard).

String request = myPayRequest.searchPaymentOptions(dataObject);

La chaîne Je passe est en fait une enveloppe de savon qui ressemble à ceci:

<?xml version="1.0" encoding="UTF-8" ?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Body> 
<searchPaymentOptions xmlns="http://website.stuff.com"> 
    <header xmlns=""> 
    <ns1:credentials organisation="stuff" password="password" username="foobar" xmlns:ns1="http://website.stuff.com"/> 
    <ns2:invocationDetails system="FindAndBook" trackingId="qqdG6jVIqIkw459wSj0ymokh" type="NATIVE" xmlns:ns2="http://website.stuff.com"/> 
    </header> 
    <criteria xmlns=""> 
    <performFundingCheck>false</performFundingCheck> 
    <preferredPayment> 
     <productSupplier> 
     <ns3:thingyCode xmlns:ns3="http://website.stuff.com">ABC</ns3:thingyCode> 
     </productSupplier> 
     <requiredFunds amount="35.63" currency="GBP"/> 
    </preferredPaymentCriterions> 
    </criteria> 
</searchPaymentOptions> 

RÉPONSE:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Body> 
    <ns2:preferredPaymentSearch xmlns:ns2="http://website.com"> 
     <header> 
      <issueAudit> 
       <info> 
        <issues> 
         <issue host="website/10.2.333.46" issueCode="Host" issueId="b5b006c7-42b6-4d8c-8e07-c2f2e1634a9e" issueMessage="website/10.2.333.46" severity="INFO" timestamp="2017-03-23T13:04:53.106Z"/> 
         <issue host="website/10.2.333.46" issueCode="TrackingId" issueId="38f73e0d-5c42-415b-b88d-1aba098e1a59" issueMessage="qqdG6jVIqIkw459wSj0ymokh" severity="INFO" timestamp="2017-03-23T13:04:53.106Z"/> 
        </issues> 
       </info> 
       <warnings> 
        <issues/> 
       </warnings> 
       <errors> 
        <issues/> 
       </errors> 
      </issueAudit> 
      <status>SUCCESS</status> 
      <ver>1.0.0-SNAPSHOT</ver> 
     </header> 
     <results> 
      <preferredPaymentResults> 
       <preferredPaymentCriterion> 
        <productSupplier> 
         <ns2:actorCode>ABC</ns2:actorCode> 
        </productSupplier> 
        <requiredFunds amount="35.63" currency="GBP"/> 
       </preferredPaymentCriterion> 
       <preferredPaymentOption> 
        <preferredCardOption> 
         <cardForm>GENERATABLE</cardForm> 
         <cardType>VISA_CREDIT</cardType> 
         <provider>wibble</provider> 
        </preferredCardOption> 
       </preferredPaymentOption> 
      </preferredPaymentResults> 
     </results> 
    </ns2:preferredPaymentSearch> 
</soap:Body> 

La réponse doit & ne contient une enveloppe SOAP avec l'extrait suivant <status>SUCCESS</status>

Quand je effectuez les opérations suivantes:

String response = given().body(request) 
      .when().post().andReturn().asString(); 

    expect().body(hasXPath("//soap:Body//*[name()='status']", equalTo("FAILURE"))); 

... le test passe même quand le succès est la valeur des données

De même, j'ai essayé d'utiliser une syntaxe différente mais cela donne aussi un faux positif:

given().config(newConfig().xmlConfig(xmlConfig().with().namespaceAware(true))); 
    given().body(request).post(); 
    expect().body(hasXPath("//soap:Body//*[name()='status']", equalTo("SUCCESS"))); 

Où est-ce que je me trompe? Je ne devrais pas réellement besoin de lire la réponse en tant que chaîne, je crois que l'exemple un peut être malodorant. Mais l'exemple 2 passe également mais devrait échouer.

+0

Dans hasXPath(), ne voulez-vous pas dire soapenv: Body à la place de soap: Body? –

+0

peut-être - mais cela n'explique toujours pas pourquoi les tests passent lorsque la réponse ne contient pas la valeur xpath attendue – Steerpike

+0

Dans votre premier exemple, la valeur matcher 'equalTo (" FAILURE ")' n'est pas un argument de hasXPath() . Est-ce exact? –

Répondre

1

Essayez le format suivant:

expect().body("Envelope.Body.preferredPaymentSearch.header.status", equalTo("SUCCESS")) 
    .given().body(request) 
    .when().post() 
+0

cela ne fonctionne pas. J'obtiens un '' java.lang.AssertionError: 1 attente a échoué.Attendu: un document XML avec XPath // soap: Body // * [nom() = 'status'] Réel: ' ... avec la réponse d'enveloppe de savon restante – Steerpike

+0

n'oubliez pas que 'request' dans mon exemple est une chaîne, pas un document XML.Mais, je reçois une enveloppe de savon valide dans la réponse, donc je ne sais pas pourquoi je ne peux pas sembler simplement l'analyser pour la valeur Xpath attendue – Steerpike

+0

étant donné que je dois utiliser ma demande comme une chaîne, peut-être que cela me lie à convertir la réponse en document XML (soap) avant de pouvoir l'utiliser de la manière suggérée – Steerpike

0

Si vous êtes débutant avec Assured REST, voir si vous pouvez évaluer Karate car il est beaucoup mieux pour les tests SOAP et XML.

Désistement: am dev.

Voici le lien vers le documentation of the SOAP/XML support.

Les expressions XPath sont prises en charge de manière native et la plupart du temps, vous pouvez comparer deux charges utiles telles quelles.

+1

Cela semble intéressant merci, je vais jeter un oeil – Steerpike