簡體   English   中英

比較Groovy / Java中的兩個XML字符串/文件

[英]Comparing two XML strings/files in 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中的任何解決方案都很好。

您可以像這樣使用Groovy XMLUnit實用程序:

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

XMLUnit.compareXML(expectedXml, actualXml)

比較XML文件而忽略語法差異。

問題和接受的答案(截至今天)對應於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()
}

也許有一種“更加時髦”的方式,但我覺得它可以用於插圖目的:)

較老的問題,但可能有趣,以備將來使用。
另一種可能性,不僅適用於XML,還可以用於您的問題。

對於這樣的測試,您還可以使用ApprovalTests( http://approvaltests.sourceforge.net ),這會導致單元測試中的代碼非常少。

使用ApprovalTests,您可以編寫測試並使用預期輸出檢查輸出。

簡短說明:在測試的第一次運行中,沒有預期的輸出,因此ApprovalTests寫入兩個文件 - “已接收”(代碼輸出)和“已批准”(代碼的預期輸出)。 在第一次運行中,“已批准”為空,因為您必須批准代碼的輸出。 這是通過diff工具完成的。 ApprovalTests打開diff工具並顯示其中的兩個文件。 如果代碼的輸出符合預期,則將輸出移動到批准的文件。 如果輸出沒有改變(接收==批准),現在所有后續測試運行都將通過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM