2017-09-18 2 views
0

J'ai été récemment aidé par un problème ici où je voulais identifier plusieurs valeurs d'une réponse SOAPUI. Cela a été répondu avec succès here.Identification de plusieurs valeurs dans la réponse de l'interface utilisateur SOAP avec Groovy

J'ai essayé de prendre cette même approche pour un nouveau problème que j'ai. Cette fois, je voudrais prendre 4 valeurs de chaque section à utiliser comme résultats escomptés.

Ci-dessous un exemple de ma réponse que je veux exécuter les assert résultats attendus contre:

 <ns1:LimitAndUsageDetailsList> 
      <ns2:LimitAndUsageDetails xmlns:ns2="http://www."> 
      <ns2:LimitCode>022</ns2:LimitCode> 
      <ns2:LimitCodeDesc>APPLIANCES</ns2:LimitCodeDesc> 
      <ns2:LimitType>N</ns2:LimitType> 
      <ns2:LimitBenefit>500.0</ns2:LimitBenefit> 
      <ns2:LimitBenefitUsed>0.0</ns2:LimitBenefitUsed> 
      <ns2:LimitBenefitAvailable>500.0</ns2:LimitBenefitAvailable> 
      <ns2:LimitBenefitService>0</ns2:LimitBenefitService> 
      <ns2:LimitBenefitUsedService>0</ns2:LimitBenefitUsedService> 
      <ns2:LimitBenefitAvailableService>0</ns2:LimitBenefitAvailableService> 
      <ns2:QualifyingPeriodIndicator/> 
      <ns2:ClaimIndicator>B</ns2:ClaimIndicator> 
      <ns2:LimitPeriod>1</ns2:LimitPeriod> 
      <ns2:LimitPeriodType>C</ns2:LimitPeriodType> 
      <ns2:LimitScale>INDIV</ns2:LimitScale> 
      </ns2:LimitAndUsageDetails> 
      <ns2:LimitAndUsageDetails xmlns:ns2="http://www."> 
      <ns2:LimitCode>023</ns2:LimitCode> 
      <ns2:LimitCodeDesc>NEBULISER</ns2:LimitCodeDesc> 
      <ns2:LimitType>N</ns2:LimitType> 
      <ns2:LimitBenefit>0.0</ns2:LimitBenefit> 
      <ns2:LimitBenefitUsed>0.0</ns2:LimitBenefitUsed> 
      <ns2:LimitBenefitAvailable>0.0</ns2:LimitBenefitAvailable> 
      <ns2:LimitBenefitService>1</ns2:LimitBenefitService> 
      <ns2:LimitBenefitUsedService>0</ns2:LimitBenefitUsedService> 
      <ns2:LimitBenefitAvailableService>1</ns2:LimitBenefitAvailableService> 
      <ns2:QualifyingPeriodIndicator/> 
      <ns2:ClaimIndicator>B</ns2:ClaimIndicator> 
      <ns2:LimitPeriod>3</ns2:LimitPeriod> 
      <ns2:LimitPeriodType>R</ns2:LimitPeriodType> 
      <ns2:LimitScale>INDIV</ns2:LimitScale> 
      </ns2:LimitAndUsageDetails> 

Je suis intéressé par LimitCode, LimitType, LimitPeriod and LimitPeriodType éléments.

J'ai essayé le script assert suivant mais cela ne fonctionne pas.

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context) 
def holder = groovyUtils.getXmlHolder(messageExchange.responseContent) 
def pxml = new XmlSlurper().parseText(context.response) 

def expected = [ 
"022":"N":"1":"C" 
'023':'N':'3':'R', 
'030':'N':'1':'C', 
] 
def xml = new XmlSlurper().parseText(context.response) 


def actual = xml.'**'.findAll{it.name() == 'LimitAndUsageDetails'}.collectEntries{[(it.LimitCode.text()): it.LimitType.text(): it.LimitPeriod.text(): it.LimitPeriodType.text()]} 
assert expected == actual 
+0

essayer la solution et voir si cela est utile. – Rao

Répondre

2

Voici ce que vous devez faire.

  • Les données attendues nécessitent quelques éléments supplémentaires par rapport à la question précédente.
  • Il faut donc créer une carte (pour identifier les données à quel élément)
  • Puisqu'il y a une liste de détails à vérifier, les données attendues devraient être une liste de cartes.

S'il vous plaît voir le Script Assertion ci-dessous:

assert context.response, 'Response is empty or null' 

//list of maps; each map for single usage detail 
//If the details are more, you may use a csv data file; solution may vary slightly 
def expected = [ 
    [ LimitCode: '022', LimitType: 'N', LimitPeriod: 1, LimitPeriodType: 'C'], 
    [ LimitCode: '023', LimitType: 'N', LimitPeriod: 3, LimitPeriodType: 'R'] 
] 
  
  
def xml = new XmlSlurper().parseText(context.respone) 

//Build the actual list of map from response 
def actual = xml.'**'.findAll{it.name() == 'LimitAndUsageDetails'}.collect{ [ 
        LimitCode  : it.LimitCode.text(), 
        LimitType  : it.LimitType.text(), 
        LimitPeriod  : it.LimitPeriod.text() as Integer, 
        LimitPeriodType : it.LimitPeriodType.text() 
       ] 
       }.sort {it.LimitCode} 
assert expected == actual 

Vous pouvez essayer rapidement la même ligne demo

+0

Merci beaucoup pour cette réponse très complète. Je travaille juste à travers cela maintenant et digérer la nouvelle approche. J'ai d'abord essayé d'exécuter cette assertion avant de l'ajuster pour l'adapter à mon scénario mais cela échouera un message "nul" qui ne me donne pas grand chose à faire. Je vais continuer à chercher quelques idées pour lesquelles je pourrais obtenir ceci mais à travers cela vaut la peine de répondre tout de suite au cas où vous auriez connaissance d'une solution à ce problème. – Matt

+0

OK. J'ai trouvé le problème et l'ai corrigé et ce script fonctionne parfaitement. Je peux l'utiliser pour la base d'un tas de tests maintenant, donc je vais y aller. Merci beaucoup pour votre aide. – Matt

0

Vous pouvez utiliser le code ci-dessous qui est aussi pour obtenir des valeurs de nœud de réponse dans

def groovyutils=new com.eviware.soapui.support.GroovyUtils(context) 
def holder=groovyutils.getXmlHolder(messageExchange.responseContent) 

holder.namespaces["ns"]="http://www.webserviceX.NET/" 

def conversionRate=holder.getNodeValue("//ns:ConversionRateResult") 

Je n'ai pas pu tester sur votre code puisque je n'ai pas l'espace de noms correct, mais ce code fonctionne parfaitement bien pour obtenir une valeur de la réponse du convertisseur de devises

Vous avez juste besoin de changer xpath dans getNodeValue et l'URL de l'espace de noms. de cette façon, c'est plus simple