SOAPUI中使用groovy断言

SOAPUI中使用groovy断言,groovy,soapui,Groovy,Soapui,Groovy新手,总体上是一个编程新手,但我正在尝试,所以请耐心听我说。如果我没有提前道歉,但我在这里试图实现的细节不够详细 我正在SOAPUI中为一个SOAP调用编写脚本测试,该调用具有同一命名节点(“//ns2:AddOnCode”)的多个实例。在此节点的实例中,我已经得到了期望返回的值的预期结果 到目前为止,我已经创建了以下内容,它只在所有这些值都存在时才起作用。但是我想更进一步,如果这个节点返回了一个我没有定义的值,那么测试就会失败 因此,如果说所有这5个值都返回了,但是第6个值也返回了

Groovy新手,总体上是一个编程新手,但我正在尝试,所以请耐心听我说。如果我没有提前道歉,但我在这里试图实现的细节不够详细

我正在SOAPUI中为一个SOAP调用编写脚本测试,该调用具有同一命名节点(“//ns2:AddOnCode”)的多个实例。在此节点的实例中,我已经得到了期望返回的值的预期结果

到目前为止,我已经创建了以下内容,它只在所有这些值都存在时才起作用。但是我想更进一步,如果这个节点返回了一个我没有定义的值,那么测试就会失败

因此,如果说所有这5个值都返回了,但是第6个值也返回了,比如说“999”,那么我希望这个测试失败

def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def holder = groovyUtils.getXmlHolder( messageExchange.responseContent )

assert holder["//ns2:AddOnCode"].contains('029')
assert holder["//ns2:AddOnCode"].contains('030')
assert holder["//ns2:AddOnCode"].contains('040')
assert holder["//ns2:AddOnCode"].contains('083')
assert holder["//ns2:AddOnCode"].contains('105')
以下是我的回答。您可以看到AddOnCode有各种各样的实例,这些就是我在测试中提到的。我的上述断言成功通过,因为响应中存在这五个断言,但我需要添加进一步的步骤,以查找不在断言值列表中的任何其他AddOnCode值

                 <ns2:AddOnService>
                    <ns2:AddOnCode>029</ns2:AddOnCode>
                    <ns2:AddOnDesc>OVERPAYMENT</ns2:AddOnDesc>
                 </ns2:AddOnService>
                 <ns2:AddOnService>
                    <ns2:AddOnCode>030</ns2:AddOnCode>
                    <ns2:AddOnDesc>REWARDS POOL</ns2:AddOnDesc>
                 </ns2:AddOnService>
                 <ns2:AddOnService>
                    <ns2:AddOnCode>040</ns2:AddOnCode>
                    <ns2:AddOnDesc>NON URGENT</ns2:AddOnDesc>
                 </ns2:AddOnService>
                 <ns2:AddOnService>
                    <ns2:AddOnCode>083</ns2:AddOnCode>
                    <ns2:AddOnDesc>EXGRATIA</ns2:AddOnDesc>
                 </ns2:AddOnService>
                 <ns2:AddOnService>
                    <ns2:AddOnCode>105</ns2:AddOnCode>
                    <ns2:AddOnDesc>MISC NON CLAIMABLE</ns2:AddOnDesc>
                 </ns2:AddOnService>
              </ns2:AddOnServices>

029
多付
030
奖励池
040
非紧急
083
特惠
105
杂项不可索赔

您没有正确使用。
更改为:

assert holder["//ns2:AddOnCode"].contains('029')
致:

编辑:根据OP注释,存在重复节点

由于OP正在使用脚本断言,下面是脚本 它需要
expectedCodes
作为输入,检索
实际代码
,并对两者进行比较,如果不匹配则失败

//Please edit if needed
def expectedCodes = ['029', '030', '040', '083', '105']
def pxml = new XmlSlurper().parseText(context.response)
def actualCodes = pxml.'**'.findAll{it.name() == 'AddOnCode' }*.text()
assert expectedCodes.sort() == actualCodes.sort()

注意:Matthew,上面是脚本断言的独立代码,不需要您现有的代码。

您是说not运算符吗?像这样:
assert!holder[“//ns2:AddOnCode”]。包含('999')
感谢您的回复。我知道不是操作员。但是如果我已经编写好的代码都没有返回,我需要应用not操作符。如果您的示例告诉我999是否错误到达,那将很好,但是这个节点可以用任何值填充,而不仅仅是999。如果返回的值不是我期望的5,那么我希望测试失败。assert holder.getNodeValue(“//ns2:AddOnCode”)。包含('030')| | | | 029 false com.eviware.soapui.support。XmlHolder@115c3a47(toString()抛出了java.lang.NullPointerException)对不起。在了解如何将文本识别为代码时遇到问题。请显示您的回复,并说明需要提取哪些数据。我已编辑了我的原始帖子以包含回复。希望这有助于更好地解释。@MatthewThomas,那么您需要提取所有值吗?并断言它们?看起来你有重复的节点。
//Please edit if needed
def expectedCodes = ['029', '030', '040', '083', '105']
def pxml = new XmlSlurper().parseText(context.response)
def actualCodes = pxml.'**'.findAll{it.name() == 'AddOnCode' }*.text()
assert expectedCodes.sort() == actualCodes.sort()