我正在尝试在SOAPUI中执行以下操作:
- 读取响应并从中提取节点
- 将节点插入另一个请求
- 在Groovy脚本中生成一些xml并存储在TestCase属性中
- 将属性中生成的xml作为子节点插入到步骤2中插入的节点中
对于1和2:响应的结构有点像
<A><B>bb</B><C>cc</C><D>dd</D></A>
我通过属性转移步骤提取它,使用//a来识别节点的开始,并在下一个测试步骤中将节点及其子节点传递给请求。在此之前,请求中的节点没有任何内容。这有效。
对于3,我生成类似的东西
<E>ee</E>
步骤4之后的目标是一个如下所示的请求结构:
<A><E>ee</E><B>bb</B><C>cc</C><D>dd</D></A>
使用的解决方案
${#TestCase#new_xml}
插入节点不起作用,因为没有办法将属性放置在E节点应该所在的位置(据我所知)。
我尝试通过另一个属性转移测试步骤插入E节点-属性的值作为A节点的子节点插入到请求中(与步骤2中从对下一个请求的响应复制A节点的方式相同)。结果是:
<A><![CDATA[<E>ee</E>]]<<B>bb</B><C>cc</C><D>dd</D></A>
我想知道:
如何将E节点作为子节点插入a节点,同时避免CDATA(或随后删除CDATA)。
为什么在步骤2中传递xml时没有CDATA,该步骤也使用SOAPUI属性传递步骤,但在步骤4中没有。
任何提示都将不胜感激!
对于1&2,您可以只使用一个简单的属性扩展。
假设你的回复看起来像:
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>
假设您想要传输整个节点DDD
,包括子节点。在您的下一个请求中,您将使用${<TestStep_name>#Response//*:DDD}
。注意,*:
的意思是"任何名称空间",因为在真正的SOAP响应中,您可能会有某种名称空间。
对于3:
// Generate some xml in a Groovy script
def xml = '<AAA><BBB/><CCC/><BBB/><BBB/><DDD><BBB/></DDD><CCC/></AAA>'
// store in a TestCase property
testRunner.testCase.setPropertyValue('my_property', xml)
如果您想获得更多的兴趣,您可以使用许多JavaXML库中的一个,其中一些库与SoapUI打包在一起。这里有一种可能性。
对于4,您将再次使用属性扩展:${#TestCase#my_property}