9

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

4

3 回答 3

19

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

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

XMLUnit.compareXML(expectedXml, actualXml)

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

于 2012-12-05T19:14:26.923 回答
4

问题和接受的答案(截至今天)对应于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()
}

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

于 2017-01-12T09:12:52.187 回答
0

较旧的问题,但可能对将来的使用很有趣。
另一种可能性,它不仅适用于 XML,也可用于解决您的问题。

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

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

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

于 2013-12-22T12:17:01.560 回答