SOAPUI属性传输xpath

时间:2016-06-02 11:23:19

标签: groovy soapui

我试图在SOAPUI中将响应从一个测试用例传输到另一个测试用例。这样我就可以按国家搜索并检索要使用的货币代码,然后按货币代码搜索。但是我不确定我的xpath是否正确。

使用的SOAP WSDL:http://www.webservicex.net/CurrencyConvertor.asmx?WSDL

这是即将交付的服务的惯例。

初步测试用例

    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://www.webserviceX.NET">
   <soap:Header/>
   <soap:Body>
      <web:GetCurrencyByCountry>
         <!--Optional:-->
         <web:CountryName>Belgium</web:CountryName>
      </web:GetCurrencyByCountry>
   </soap:Body>
</soap:Envelope>

响应

  <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <GetCurrencyByCountryResponse xmlns="http://www.webserviceX.NET">
         <GetCurrencyByCountryResult><![CDATA[<NewDataSet>
  <Table>
    <Name>Belgium</Name>
    <CountryCode>be</CountryCode>
    <Currency>Franc</Currency>
    <CurrencyCode>BEF</CurrencyCode>
  </Table>
  <Table>
    <Name>Belgium</Name>
    <CountryCode>be</CountryCode>
    <Currency>Franc</Currency>
    <CurrencyCode>BEF</CurrencyCode>
  </Table>
</NewDataSet>]]></GetCurrencyByCountryResult>
      </GetCurrencyByCountryResponse>
   </soap:Body>
</soap:Envelope>

然后我使用属性转移测试步骤,首先按如下方式设置下拉列表:

Source: Get Currency by Country; Property: Response Path Language: xpath

然后声明xpath如下:

declare namespace sam= 'http://www.webserviceX.NET';//GetCurrencyByCountryResult/table[2]/CurrencyCode

每次运行测试时,我都会得到Null响应。我曾尝试使用外卡,但我仍然无法获取该值。

2 个答案:

答案 0 :(得分:0)

您需要将CDATA内容存储到属性中,然后在groovy脚本中使用该属性值并访问CDATA内部xml,我在下面的示例<![CDATA[<isle>test</isle>]]>中引用。

eg:
 <test>
<elementa>
<![CDATA[<isle>test</isle>]]>
</elementa>
</test>

在您当前的场景中,Soapui只能理解XPATH,直到&#34; // GetCurrencyByCountryResult &#34;之后,提供的任何路径都归CDATA所有。

使用CDATA的SOAPUI是一种单独的机制。

请研究一下;它有很多关于CDATA和SOAPUI的信息,它肯定能解决你的问题

https://www.soapui.org/functional-testing/working-with-cdata.html

答案 1 :(得分:0)

这是一个groovy脚本,它完全符合您的要求:

在每个陈述之前适当添加评论以便更好地理解。

目前使用固定的xml响应。但是你可以替换它以使它变得动态。

因为你的xml有cdata而cdata又有xml。所以,这需要分两个阶段完成,第一次是cdata,然后是xpath,以获得所需的实际值。

import com.eviware.soapui.support.XmlHolder
def xml = '''<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">   <soap:Body>
      <GetCurrencyByCountryResponse xmlns="http://www.webserviceX.NET">
         <GetCurrencyByCountryResult><![CDATA[<NewDataSet>
  <Table>
    <Name>Belgium</Name>
    <CountryCode>be</CountryCode>
    <Currency>Franc</Currency>
    <CurrencyCode>BEF</CurrencyCode>
  </Table>
  <Table>
    <Name>Belgium</Name>
    <CountryCode>be</CountryCode>
    <Currency>Franc</Currency>
    <CurrencyCode>BEF</CurrencyCode>
  </Table>
</NewDataSet>]]></GetCurrencyByCountryResult>
      </GetCurrencyByCountryResponse>
   </soap:Body>
</soap:Envelope>'''
//If you want this script to handle dynamic response
// remove above xml and uncomment below line and replace your previous step name in
// place of STEP_NAME
//def xml = context.expand( '${STEP_NAME#Response}' )
//Please replace the actual response in place of xml
def holder = new XmlHolder(xml)
//Get the CDATA part
def countryCodeResult = holder.getNodeValue('//*:GetCurrencyByCountryResult')
//log the content of CDATA
log.info countryCodeResult
//Again convert cdata string as xml holder
def cdataHolder = new XmlHolder(countryCodeResult)
//Get the actual xpath
def currencyCode = cdataHolder.getNodeValue("//Table[2]/CurrencyCode")
log.info currencyCode
//now you may store this currency code as suite level propery so that
//you can use it in next test case as ${#TestSuite#CURRENCY_CODE}
context.testCase.testSuite.setPropertyValue('CURRENCY_CODE', currencyCode)

正如您在上面的评论中看到的那样,脚本将货币代码存储到测试套件级属性中。这允许您使用属性扩展在不同的测试用例或步骤中使用货币代码,例如${#TestSuite#CURRENCY_CODE}