2012-12-05 19 views
6

में दो एक्सएमएल स्ट्रिंग्स/फ़ाइलों की तुलना करना मैं कुछ एक्सएमएल बिल्डर की जांच के लिए यूनिट परीक्षण लिख रहा हूं।ग्रोवी/जावा

अब मैं उनके समान अर्थशास्त्र के बावजूद अपेक्षित परिणाम और वास्तविक परिणाम के बीच वाक्य रचनात्मक मतभेदों की समस्या में भाग रहा हूं।

उदाहरण:

अपेक्षित परिणाम:

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

वास्तविक परिणाम:

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

मैंने XmlUtil.serialize() का उपयोग करके एक्सएमएल को सामान्य करने की कोशिश की, हालांकि ऐसा लगता है कि सफेद जगहों को सिंटेक्टिकल मतभेद छोड़कर लगता है।

मेरे परीक्षणों को और अधिक मजबूत बनाने के लिए मैं xml तारों के सामान्यीकृत/कैनोलिक रूप को कैसे प्राप्त कर सकता हूं?

मैं एक ग्रेल्स एप्लिकेशन लिख रहा हूं, इसलिए मैं ग्रोवी या जावा में किसी भी समाधान के साथ ठीक हूं।

+2

के लिए ठीक है [दस्तावेज़ xmlunit का उपयोग करते हुए दिखाते हैं] (http: //groovy.codehaus।संगठन/+ एक्सआरओ + + ग्रोवी के + स्ट्रीमिंगमार्कअपबिल्डर का उपयोग कर) ... –

+0

यदि आपको यह मिलता है तो क्या अंतर है? –

उत्तर

16

आप इस तरह उपयोगिता ग्रूवी XMLUnit उपयोग कर सकते हैं:

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

XMLUnit.compareXML(expectedXml, actualXml) 

जबकि वाक्य-मतभेद अनदेखी एक्सएमएल फाइल तुलना करने के लिए।

+0

धन्यवाद, यही वह है जिसे मैं ढूंढ रहा था। – Will

0

पुराना सवाल, लेकिन शायद भविष्य के उपयोग के लिए दिलचस्प है।
एक और संभावना, जो न केवल एक्सएमएल के लिए काम करती है, बल्कि आपकी समस्या के लिए भी इस्तेमाल की जा सकती है।

इस तरह के टेस्ट के लिए, आप ApprovalTests (http://approvaltests.sourceforge.net) का उपयोग भी कर सकते हैं, जिसके परिणामस्वरूप आपके यूनिट परीक्षण में बहुत कम कोड होता है।

स्वीकृति के साथ आप अपना परीक्षण लिखते हैं और अपेक्षित आउटपुट के साथ अपना आउटपुट जांचते हैं।

संक्षिप्त विवरण: आपके परीक्षण के पहले भाग में, कोई अपेक्षित आउटपुट नहीं है, इसलिए ApprovalTests दो फाइलें लिखता है - एक "प्राप्त" (आपके कोड का आउटपुट) और "अनुमोदित" (आपके कोड की अपेक्षित आउटपुट)। पहले भाग में, "अनुमोदित" खाली है, क्योंकि आपको अपने कोड के आउटपुट को स्वीकार करना होगा। यह एक diff उपकरण के साथ किया जाता है। ApprovalTests एक diff उपकरण खोलता है और इसमें दो फाइलें दिखाता है। यदि आपके कोड का आउटपुट आपको अपेक्षित है, तो आप आउटपुट को अनुमोदित फ़ाइल में ले जाते हैं। अगर आउटपुट नहीं बदलता है (प्राप्त == अनुमोदित), तो सभी बाद के परीक्षण रन पास होंगे।

0

प्रश्न और स्वीकृत उत्तर (आज के रूप में) XMLUnit के विरासत संस्करण से मेल खाता है।

कैसे 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" तरीका है, लेकिन मुझे लगता है कि यह समझाने के उद्देश्य से :)