2012-12-05 40 views
6

我正在编写用于检查某些XML生成器的单元测试。比较Groovy/Java中的两个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中的任何解决方案。

+2

[文档使用xmlunit显示](http://groovy.codehaus。org /使用+ Groovy's + StreamingMarkupBuilder创建+ XML +)... –

+0

如果你得到这个,有什么区别? –

回答

16

您可以使用Groovy的XMLUnit测试效用是这样的:

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

XMLUnit.compareXML(expectedXml, actualXml) 

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

+0

谢谢,那就是我一直在寻找的。 – Will

0

老问题,但可能对未来的使用感兴趣。
另一种可能性,不仅适用于XML,也适用于您的问题。

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

通过ApprovalTests,您可以编写测试,并检查输出是否具有预期输出。

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

0

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

对于那些想知道如何与XMLUnit V2 Groovy的做到这一点:

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

或许有那么这是一种“更巧妙”的方式,但我认为这是确定用于说明目的:)