使用groovy脚本断言比较SoapUI中的两个字符串的正确方法是什么?

使用groovy脚本断言比较SoapUI中的两个字符串的正确方法是什么?,groovy,soapui,assertion,groovyscriptengine,Groovy,Soapui,Assertion,Groovyscriptengine,我需要比较SoapUI中的两个字符串。第一个来自本地目录中存储的文本文件,第二个来自RESTAPI操作得到的XML响应。在比较这两个字符串之前,我对它们使用了一些方法来删除标题,因为它们包含诸如日期和处理时间之类的信息,每次都会有所不同 下面是我试过的 def xml = messageExchange.responseContentAsXml String fileData = new File("C://Users/362784/project/outputPGB123.txt&q

我需要比较SoapUI中的两个字符串。第一个来自本地目录中存储的文本文件,第二个来自RESTAPI操作得到的XML响应。在比较这两个字符串之前,我对它们使用了一些方法来删除标题,因为它们包含诸如日期和处理时间之类的信息,每次都会有所不同

下面是我试过的

def xml = messageExchange.responseContentAsXml
String fileData = new File("C://Users/362784/project/outputPGB123.txt").text

String responseContent = new XmlSlurper().parseText(xml)

String fileDataFiltered = fileData.substring(fileData.indexOf("PASSED :"))
String responseContentFiltered = responseContent.substring(responseContent.indexOf("PASSED :"))

log.info(fileDataFiltered)
log.info(responseContentFiltered)

assert fileDataFiltered == responseContentFiltered
这是我收到的错误

和我的两个相同的log.info

我是SoapUI新手,我不确定这两个用户究竟在比较什么,但我已经在上查看了它们的log.info,内容是相同的。但是,此断言返回一个错误


有人能指出我做错了什么,以及如何得到传递的结果吗?

在Java/Groovy中,您可以比较字符串值是否相等,如下所示:

assert fileDataFiltered.equals(responseContentFiltered)
看看这是否解决了你的问题

例如,==比较器可以比较对象实例,即使文本值相同,对象实例也可能失败。有关更深入的说明,请参阅

编辑:

看过您的示例后,您正在比较的值似乎在XML字符数据(CDATA)中

考虑以下示例:

一些XML:

def response = '''<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
   xmlns:sam="http://www.example.org/sample/">
   <soapenv:Header/>
   <soapenv:Body>
      <sam:searchResponse>
         <sam:searchResponse>
            <item><id>1234</id><description><![CDATA[<item><width>123</width><height>345</height><length>098</length><isle>A34</isle></item>]]></description><price>123</price>
            </item>
         </sam:searchResponse>
      </sam:searchResponse>
   </soapenv:Body>
</soapenv:Envelope>
'''
如您所见,返回的值是objectnodechildren。可以使用以下命令将其转换为字符串:

log.info cdata.toString()
log.info cdata.toString().getClass()
让我们做一个比较(根据cfrick的评论,您可以使用==或.equals()


正如您所看到的,可能存在多个级别的失败。您必须完成它。

在groovy
=
中使用它自己的语义,最终使用
等于
。如果你想通过身份进行比较,你必须明确地这样做。除非SOAUI违背了这个承诺,否则这不会有什么区别。我试过了,但还是出了同样的错误。。可能是因为字符串太长了吗?除了将它们作为字符串进行比较,还有其他选择吗?@catreedle您能在您的问题中添加一段XML吗?清理机密信息。字符串文字量可能只有一些下限。弦可能会变得很大,所以不太可能达到极限。更可能的情况是,您正在比较苹果和桔子(字符串和非字符串),或者比较看起来相似但不相似的字符串(例如空格),甚至只是编码不匹配等。我刚刚添加了XML代码段。如果您想获得更可靠的调试信息,请不要记录字符串,而是使用
.dump()
。例如,
log.info(fileDataFiltered.dump())
。它将为您显示字符串字节,如果您没有以字符串结尾,这可能会使其更加明显。dump提供了此附加信息INFO:和INFO:那么这两个转储如何比较?除非你比较这两个变量,否则它不会有多大帮助。这些信息是来自这两个变量的转储。我看到的唯一区别是字符串@和哈希=。第二个字符串具有负(-)散列。我不确定如何处理这些信息这两个
value=[…]
是否相同?
log.info cdata.toString()
log.info cdata.toString().getClass()
def expectedCdata = '<item><width>123</width><height>345</height>length>098</length><isle>A34</isle></item>'

if (cdata.toString().equals(expectedCdata)) { log.info 'Equal' }
else {log.info 'Different'}
if (cdata.toString().replaceAll("\\s","").equals(expectedCdata)) { log.info 'Equal' }
else {log.info 'Different'}