2012-12-05 71 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() 
} 

或許有那麼這是一種「更巧妙」的方式,但我認爲這是確定用於說明目的:)