[英]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.