SoapUI - 将请求输出中的多个元素实例传递给属性值

时间:2015-09-16 22:20:41

标签: xpath groovy xquery soapui

我有SoapUI脚本的以下Request输出:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cai3g="http://schemas.test.com/cai3g1.2/">
   <S:Header>
      <cai3g:SessionId>aaaa6227cc81d</cai3g:SessionId>
      <cai3g:TransactionId>333</cai3g:TransactionId>
      <cai3g:SequenceId>85966385</cai3g:SequenceId>
   </S:Header>
   <S:Body>
      <ns2:GetResponse xmlns:ns2="http://schemas.test.com/cai3g1.2/">
         <ns2:Attributes>
            <getResponse:getResponse publicId="sip:+12345678901@test_domain.org" xmlns="http://schemas.test.com/testnode/UserData/TEST_NODE/" xmlns:getResponse="http://schemas.test.com/testnode/UserData/TEST_NODE/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
               <publicId>sip:+12345678901@test_domain.org</publicId>
                  <services>
                  <incoming-communication-barring>
                     <icb-user-configuration>
                        <active>true</active>
                        <icb-ruleset>
                           <icb-rule id="rule1">
                              <id>rule1</id>
                           </icb-rule>
                           <icb-rule id="rule2">
                              <id>rule2</id>
                           </icb-rule>
                           <icb-rule id="rule3">
                              <id>rule3</id>
                           </icb-rule>
                        </icb-ruleset>
                     </icb-user-configuration>
                  </incoming-communication-barring>
               </services>
            </getResponse:getResponse>
         </ns2:Attributes>
      </ns2:GetResponse>
   </S:Body>
</S:Envelope>

我想以某种方式从中提取规则名称,例如“rule1”,“rule2”和“rule3”,并将它们存储在一个字符串中。理想情况下,我会将它们存储在Test Case的Properties中的属性值中,格式如下: [“rule1”,“rule2”,“rule3”]以便在以后的TestStep中我可以在for循环中迭代这些值。

我希望在以后的TestStep

中实现以下内容
String rules = ${Properties#rulesFromPropertyTransfer}
rules.each {
  //do something with each rule
}

然而,我无法弄清楚如何提取甚至publicId并将其存储在变量中,更不用说从树到icb规则了。

我尝试过各种变体:

declare namespace ns2='http://schemas.test.com/cai3g1.2/';
declare namespace getResponse='http://schemas.test.com/testnode/UserData/TEST_NODE/';
//ns2:GetResponse/ns2:Attributes/getResponse:getResponse/publicId

但我通常在属性转移窗口中得到“null”响应。我是不是错了,或者有办法做我想做的事情?

2 个答案:

答案 0 :(得分:0)

第一个问题是请求是无效标记。它包含一个没有开始<\services>标记的结束<services>标记。 XML解析器将对象。

修复后,你可以得到这样的规则:

def data = '''
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cai3g="http://schemas.test.com/cai3g1.2/">
   <S:Header>
      <cai3g:SessionId>aaaa6227cc81d</cai3g:SessionId>
      <cai3g:TransactionId>333</cai3g:TransactionId>
      <cai3g:SequenceId>85966385</cai3g:SequenceId>
   </S:Header>
   <S:Body>
      <ns2:GetResponse xmlns:ns2="http://schemas.test.com/cai3g1.2/">
         <ns2:Attributes>
            <getResponse:getResponse publicId="sip:+12345678901@test_domain.org" xmlns="http://schemas.test.com/testnode/UserData/TEST_NODE/" xmlns:getResponse="http://schemas.test.com/testnode/UserData/TEST_NODE/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
               <publicId>sip:+12345678901@test_domain.org</publicId>
                  <incoming-communication-barring>
                     <icb-user-configuration>
                        <active>true</active>
                        <icb-ruleset>
                           <icb-rule id="rule1">
                              <id>rule1</id>
                           </icb-rule>
                           <icb-rule id="rule2">
                              <id>rule2</id>
                           </icb-rule>
                           <icb-rule id="rule3">
                              <id>rule3</id>
                           </icb-rule>
                        </icb-ruleset>
                     </icb-user-configuration>
                  </incoming-communication-barring>
            </getResponse:getResponse>
         </ns2:Attributes>
      </ns2:GetResponse>
   </S:Body>
</S:Envelope>'''

def xml = new XmlSlurper().parseText(data)
def rules =  xml.Body.GetResponse.Attributes.getResponse.'incoming-communication-barring'.'icb-user-configuration'.'icb-ruleset'.'icb-rule'.id.list()
assert rules == ['rule1', 'rule2', 'rule3']

答案 1 :(得分:0)

你走了:

编辑:以下代码段可用作请求步骤的脚本断言

itemobj

稍后您将能够从Test Case属性“RESPONSE_RULES”中获取值,该值是逗号分隔的字符串。

在请求中,请将其用作import com.eviware.soapui.support.XmlHolder def xml = new XmlHolder(context.response) def responseRules = xml.getNodeValues("//*:icb-rule/@id").join(",") assert responseRules instanceof String log.info responseRules context.testCase.setPropertyValue('RESPONSE_RULES', responseRules)

在常规中使用它

- 作为字符串 ${#TestCase#RESPONSE_RULES}

- 作为列表或数组(这可能是您感兴趣的)

context.expand('${#TestCase#RESPONSE_RULES}')