比较Groovy/Java中的两个XML字符串/文件



我正在编写单元测试来检查一些XML构建器。

现在我遇到了预期结果和实际结果之间语法差异的问题,尽管它们的语义相同。

示例:

预期结果:

<parent><child attr="test attribute">text here</child></parent>

实际结果:

<parent>
<child attr="test attribute">
text here
</child>
</parent>

我尝试使用XmlUtil.serialize()规范xml,但这似乎保留了空白,留下了语法差异。

如何获得xml字符串的规范化/规范化形式,以便使测试更加健壮?

我正在编写一个Grails应用程序,所以我对Groovy或Java中的任何解决方案都很满意。

您可以像这样使用GroovyXMLUnit实用程序:

XMLUnit.setIgnoreWhitespace(true)
XMLUnit.setIgnoreComments(true)
XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true)
XMLUnit.setNormalizeWhitespace(true)
XMLUnit.compareXML(expectedXml, actualXml)

在忽略语法差异的情况下比较XML文件。

问题和已接受的答案(截至目前)对应于XMLUnit的遗留版本。

对于那些有兴趣了解如何在Groovy上使用XMLUnitv2的人:

def "XMLs must be identical"() {
setup:
def control = '<foo><bar></bar></foo>'
def test = '''
<foo>
<bar></bar>
</foo>
'''
when:
Diff d = DiffBuilder.compare(Input.fromString(control))
.withTest(Input.fromString(test))
.ignoreWhitespace()
.ignoreComments()
.normalizeWhitespace()
.build()
then:
!d.hasDifferences()
}

也许有一种"groover"的方法可以做到这一点,但我认为出于说明的目的,这是可以的:)

以前的问题,但可能对将来的使用很感兴趣
另一种可能性,它不仅适用于XML,也可以用于您的问题。

对于这样的测试,您也可以使用ApprovalTest(http://approvaltests.sourceforge.net),这将导致单元测试中的代码非常少。

使用ApprovalTests,您可以编写测试并将输出与预期输出进行核对。

简短描述:在测试的第一次运行中,没有预期的输出,因此ApprovalTests编写了两个文件——"已接收"(代码的输出)和"已批准"(代码预期的输出)。在第一次运行中,"已批准"为空,因为您必须批准代码的输出。这是用diff工具完成的。ApprovalTests打开一个diff工具并显示其中的两个文件。如果代码的输出是您所期望的,则将输出移到已批准的文件中。现在,如果输出没有更改(已接收==已批准),则所有后续测试运行都将通过。

相关内容

  • 没有找到相关文章