2012-12-05 30 views
6

私はいくつかのXMLビルダーをチェックするための単体テストを書いています。Groovy/Javaで2つの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

[docsはxmlunitを使って表示する](http://groovy.codehaus。org/Create + XML + + Groovy's + StreamingMarkupBuilder)... –

+0

これを取得すればどのような違いがありますか? –

答えて

16

あなたはこのようなGroovy XMLUnitユーティリティを使用することができます:構文の違いを無視してXMLファイルを比較するには

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

XMLUnit.compareXML(expectedXml, actualXml) 

を。

+0

ありがとう、それは私が探していたものです。 – Will

0

古い質問ですが、今後の使用には面白いかもしれません。
もう1つの可能性は、XMLだけでなく、あなたの問題にも使用できます。

このようなテストでは、ApprovalTests(http://approvaltests.sourceforge.net)を使用すると、単体テストにはほとんどコードが作成されません。

承認テストでは、テストを作成し、期待される出力で出力を確認します。

短い説明: テストの最初の実行では、期待される出力がないため、ApprovalTestsは2つのファイル、「受信」(コード出力)と「承認」(コードの予想出力)を書き込みます。最初の実行では、コードの出力を承認する必要があるため、「承認済み」は空です。これはdiffツールを使って行います。 ApprovalTestsは差分ツールを開き、その中に2つのファイルを表示します。あなたのコードの出力が期待どおりであれば、出力を承認されたファイルに移動します。出力が変更されない(受信==承認された)場合、以降のテストはすべて実行されます。

0

質問と受諾された回答(今日)は、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() 
} 

おそらくそこにそれを行うの「groovier」の方法があるが、私はそれが説明のためにOKだと思います:)