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

时间:2012-12-05 16:30:51

标签: java xml groovy compare

我正在编写用于检查某些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中的任何解决方案都没问题。

3 个答案:

答案 0 :(得分:16)

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

XMLUnit.setIgnoreWhitespace(true)
XMLUnit.setIgnoreComments(true)
XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true)
XMLUnit.setNormalizeWhitespace(true)

XMLUnit.compareXML(expectedXml, actualXml)

比较XML文件而忽略语法差异。

答案 1 :(得分:1)

问题和接受的答案(截至今天)对应于XMLUnit的旧版本。

对于那些有兴趣知道如何在Groovy上使用XMLUnit v2进行操作的人:

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()
}

也许有一种“更加时髦”的做法,但我认为这可以用于说明目的:)

答案 2 :(得分:0)

较早的问题,但未来的使用可能会很有趣 另一种可能性,不仅适用于XML,还可以用于解决您的问题。

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

使用ApprovalTests,您可以编写测试并使用预期输出检查输出。

简短说明: 在测试的第一次运行中,没有预期的输出,因此ApprovalTests写入两个文件 - “已接收”(代码输出)和“已批准”(代码的预期输出)。在第一次运行中,“已批准”为空,因为您必须批准代码的输出。这是通过diff工具完成的。 ApprovalTests打开diff工具并显示其中的两个文件。如果代码的输出符合预期,则将输出移动到批准的文件。如果输出没有改变(接收==已批准),现在所有后续测试都将通过。