2012-12-05 20 views
6

Sto scrivendo test di unità per verificare alcuni builder XML.Confronto di due stringhe/file XML in Groovy/Java

Ora mi sto imbattendo nel problema delle differenze sintattiche tra il risultato atteso e il risultato effettivo, nonostante la loro semantica identica.

Esempio:

Risultato atteso:

<parent><child attr="test attribute">text here</child></parent> 

Risultato effettivo:

<parent> 
    <child attr="test attribute"> 
    text here 
    </child> 
</parent> 

Ho provato a normalizzare l'xml usando XmlUtil.serialize(), tuttavia questo sembra mantenere gli spazi bianchi, lasciando differenze sintattiche.

Come posso ottenere la forma normalizzata/canonica delle stringhe xml al fine di rendere i miei test più robusti?

Sto scrivendo un'applicazione Grails, quindi sto bene con qualsiasi soluzione in Groovy o Java.

+2

[I documenti mostrano l'uso di xmlunit] (http: //groovy.codehaus.org/Creating + XML + using + Groovy's + StreamingMarkupBuilder) ... –

+0

Qual è la differenza se ottieni questo? –

risposta

16

È possibile utilizzare il Groovy XMLUnit programma di utilità come questo:

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

XMLUnit.compareXML(expectedXml, actualXml) 

per confrontare i file XML, ignorando le differenze sintattiche.

+0

Grazie, questo è quello che stavo cercando. – Will

0

Domanda precedente, ma forse interessante per l'utilizzo futuro.
Un'altra possibilità, che funziona non solo per XML, ma potrebbe anche essere utilizzata per il tuo problema.

Per i test di questo tipo, è possibile utilizzare anche ApprovalTests (http://approvaltests.sourceforge.net), che risulta in un codice molto piccolo nel test dell'unità.

Con ApprovalTests si scrive il test e si controlla l'output con l'output previsto.

Breve descrizione: Nella prima esecuzione del test, non è previsto alcun output, quindi ApprovalTests scrive due file: un "ricevuto" (output del codice) e "approvato" (output previsto del codice). Nella prima esecuzione, "approvato" è vuoto, perché devi approvare l'output del tuo codice. Questo è fatto con uno strumento diff. ApprovalTests apre uno strumento diff e mostra i due file in esso contenuti. Se l'output del tuo codice è quello che ti aspettavi, sposta l'output nel file approvato. Ora passeranno tutte le prove successive, se l'output non cambia (ricevuto == approvato).

0

La domanda e la risposta accettata (ad oggi) corrispondono a una versione legacy di XMLUnit.

Per chi è interessato a sapere come farlo con XMLUnit v2 su 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() 
} 

Forse c'è un modo "groovier" di farlo, ma penso che sia OK a scopo illustrativo :)