我正在编写单元测试来检查一些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工具并显示其中的两个文件。如果代码的输出是您所期望的,则将输出移到已批准的文件中。现在,如果输出没有更改(已接收==已批准),则所有后续测试运行都将通过。