我试图在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
响应。我曾尝试使用外卡,但我仍然无法获取该值。
答案 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}