2017-01-05 12 views
0

Я хотел бы написать запрос xPath для SOAPUI для проверки параметра Score только под «BDS» для значения проверки в параметре.Как получить запрос XPath в ответ от SOAPUI

Все реакции из кода здесь:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
 
    <S:Body> 
 
     <MatchResponse xmlns="http://www.bottomline.com/intellinx/webservices"> 
 
     <MatchResult><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
 
<ResultBlock> 
 
<MatchSummary matches="1"> 
 
<TotalMatchScore>50</TotalMatchScore> 
 
<Rules totalRuleCount="5"> 
 
<Rule ruleCount="1"> 
 
<RuleID>Rule3_2_R</RuleID> 
 
<Score>10</Score> 
 
</Rule> 
 
<Rule ruleCount="1"> 
 
<RuleID>Rule18_In</RuleID> 
 
<Score>20</Score> 
 
</Rule> 
 
<Rule ruleCount="1"> 
 
<RuleID>Rule14_Su</RuleID> 
 
<Score>20</Score> 
 
</Rule> 
 
</Rules> 
 
</MatchSummary> 
 
<ExternalScores> 
 
<ExternalScore> 
 
<extClientLegacy>2003-01-03-03.26.32.285776</extClientLegacy> 
 
<SourceID>BDS</SourceID> 
 
<Score>-1.0</Score> 
 
</ExternalScore> 
 
<ExternalScore> 
 
<extClientLegacy>2003-01-03-03.26.32.285776</extClientLegacy> 
 
<SourceID>O2</SourceID> 
 
<Score>0.128</Score> 
 
</ExternalScore> 
 
</ExternalScores> 
 
<ErrorWarnings> 
 
<Errors errorCount="0"/> 
 
<Warnings warningCount="0"/> 
 
</ErrorWarnings> 
 
</ResultBlock>]]></MatchResult> 
 
     </MatchResponse> 
 
    </S:Body> 
 
</S:Envelope>

SoapUI на изображении. И вопрос в том, как я могу написать xpath .. Большое спасибо!

+0

Не могли бы вы прояснить вопрос? Вы хотите проверить 'Score' как' -1', когда 'ScoreID' является' BSD'? – Rao

+0

Pavel, Данные, опубликованные, не могут быть проанализированы. – Rao

+1

Пожалуйста, не публикуйте вопросы «напишите код для меня». Если у вас есть проблемы с определенным выражением XPath, включите это выражение и некоторые рассуждения об этом. Если у вас пока нет выражения XPath, потратьте еще немного времени, чтобы подумать о своей проблеме и придумать что-нибудь. – Tomalak

ответ

0

Поскольку данные находятся в пределах cdata, вам, возможно, придется использовать groovy для достижения того же.

Примечание, что ваш ответ XML является отредактирован, чтобы сделать его разобрать правильно. Вы не можете столкнуться с этой проблемой, поскольку у вас будет реальный ответ.

Короче говоря, вот что нужно сделать:
- экстракт cdata часть первая, чтобы получить фактический XML, где вам нужно, чтобы применить XPath
- затем извлечь xpath

Вот Groovy Script

def xml = """<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <MatchResponse xmlns="http://www.bottomline.com/intellinx/webservices"> 
     <MatchResult><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<ResultBlock> 
<MatchSummary matches="1"> 
<TotalMatchScore>50</TotalMatchScore> 
<Rules totalRuleCount="5"> 
<Rule ruleCount="1"> 
<RuleID>Rule3_2_R</RuleID> 
<Score>10</Score> 
</Rule> 
<Rule ruleCount="1"> 
<RuleID>Rule18_In</RuleID> 
<Score>20</Score> 
</Rule> 
<Rule ruleCount="1"> 
<RuleID>Rule14_Su</RuleID> 
<Score>20</Score> 
</Rule> 
</Rules> 
</MatchSummary> 
<ExternalScores> 
<ExternalScore> 
<extClientLegacy>2003-01-03-03.26.32.285776</extClientLegacy> 
<SourceID>BDS</SourceID> 
<Score>-1.0</Score> 
</ExternalScore> 
<ExternalScore> 
<extClientLegacy>2003-01-03-03.26.32.285776</extClientLegacy> 
<SourceID>O2</SourceID> 
<Score>0.128</Score> 
</ExternalScore> 
</ExternalScores> 
<ErrorWarnings/> 
<Errors errorCount="0"/> 
</ResultBlock>]]> 
</MatchResult> 
</MatchResponse> 
</S:Body> 
</S:Envelope>""" 

//The data you are looking for 
//You may edit as you needed 

def lookForScoreID = 'BDS' 
def expectedScore = '-1.0' 

//Closure to extract data of given node name 
def searchData = { data, element -> 
    def parsedData = new XmlSlurper().parseText(data) 
    parsedData.'**'.find {it.name() == element} as String 
} 

//Closure to check the xpath 
def searchByXpath = {data, xpath -> 
    def holder = new com.eviware.soapui.support.XmlHolder(data) 
    holder.getNodeValue(xpath) 
} 

//Gets the CDATA part of the response 
//NOTE: if you want to use Script Assertion, use **context.response** instead of **xml** in the below statement. Also, you can remove the above xml. 

def cdata = searchData(xml, 'MatchResult') 
println cdata 
def actualScore = searchByXpath(cdata, "//ExternalScore[SourceID = '$lookForScoreID']/Score") 
log.info actualScore 
assert expectedScore == actualScore, "Score is not matching for SourceID ${lookForScoreID}" 

Вы также можете использовать приведенный выше сценарий как Script Assertion вместо отдельного этапа тестирования groovy script, см. Примечание в части комментария, то есть используйте context.response вместо XML

Сказав, что вы не требуется xpath утверждение.