9

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のどのソリューションでも問題ありません。

4

3 に答える 3

19

GroovyXMLUnitユーティリティは次のように使用できます。

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

XMLUnit.compareXML(expectedXml, actualXml)

構文上の違いを無視してXMLファイルを比較します。

于 2012-12-05T19:14:26.923 に答える
4

質問と受け入れられた回答(今日の時点)は、XMLUnitのレガシーバージョンに対応しています。

GroovyのXMLUnitv2でそれを行う方法を知りたい人のために:

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

おそらくそれを行うための「よりグルーヴィーな」方法がありますが、説明の目的では問題ないと思います:)

于 2017-01-12T09:12:52.187 に答える
0

古い質問ですが、将来の使用のためにおそらく興味深いものです。
もう1つの可能性は、XMLだけでなく、問題にも使用できる可能性があります。

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

ApprovalTestsを使用して、テストを作成し、期待される出力で出力を確認します。

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

于 2013-12-22T12:17:01.560 に答える