是否可以使用Groovy脚本从字面上将'<'和'>'字符注入SoapUI请求XML中?

时间:2019-06-07 16:54:51

标签: xml string groovy character-encoding soapui

我正在与SoapUI一起进行Web服务功能测试。我正在使用SpecFlow来促进参数化数据驱动的测试。

作为我过程的一部分,我有一个Groovy脚本,该脚本在测试用例请求之前执行。该脚本读取在命令行调用中传递的参数,并将其注入请求XML参数中。

我的请求如下所示:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" >
  <soap:Header/>
  <soap:Body>
    <soap:TestArg1>TestArgValue1</soap:TestArg1>
    <soap:TestArg2>TestArgValue2</soap:TestArg2>
    <soap:TestArg3>TestArgValue3</soap:TestArg3>
  </soap:Body>
</soap:Envelope>

我的脚本运行正常,并且按预期正确注入了字符串值。

但是,在测试期间,我们发现许多测试输入args将包含特殊字符(连字符,斜杠等)。 为了解决此问题,我使用CDATA指令中包含的请求XML中的每个参数测试了服务测试,如下所示:

<![CDATA[TestArg-Hyphen]]>

在SoapUI GUI中的测试已成功;我更新了Groovy脚本以连接

<[CDATA[

之前和

]]>

在变量之后。

但是,当将串联的值注入到请求XML中时,标记如下所示:

&lt;![CDATA[TestArg-Hyphen]]&gt;

我花了很长时间在网上寻找解决这个问题的方法;似乎不能像其他特殊字符(“-”,“ /”等)那样简单地转义“ <”和“>”字符。

我尝试将字符串括在单,双,三,斜线,美元斜线引号中:都产生相同的结果。

我敢肯定有一种方法可以做到这一点(只是Groovy文档中没有突出显示),但是到目前为止,我还无法识别它。

非常感谢您提供任何帮助或建议。 感谢您的关注。

更新: 我的Groovy脚本的相关部分如下所示:

// Get next test step info
def nextStep = testRunner.testCase.getTestStepAt(context.currentStepIndex + 1)

// Create the XmlHolder object for the request step
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def holder = groovyUtils.getXmlHolder(nextStep.name + "#Request")

// Inject arg values into request XML
for (i=0; i < argsNamesArray.length; i++) {
    argNode = "//" + argsNamesArray[i]
    def argValue = "<![CDATA[" + argsValuesArray[i] + "]]>"
    log.info argValue
    holder[argNode] = argValue
}
holder.updateProperty()

请注意

log.info argValue

返回要注入到请求中的参数值:

<![CDATA[TestArg-Hyphen]]>

但是,执行脚本后,请求XML仍会更新为显示:

&lt;![CDATA[TestArg-Hyphen]]&gt;

真的没有简单,直接的方法吗?

1 个答案:

答案 0 :(得分:1)

恕我直言,这不是一个 Groovy 问题,而是一个 XML 问题。

唯一需要转义的字符是“ <”本身。

您只需要用lt替换“ <”即可;在XML中。

示例:

def param1 = "<foo-bar>"
println param1.replace("<", "&lt;")