2012-12-05 39 views
6

Tôi đang viết các kiểm tra đơn vị để kiểm tra một số trình xây dựng XML.So sánh hai chuỗi/tệp XML trong Groovy/Java

Bây giờ tôi đang gặp vấn đề về sự khác biệt về cú pháp giữa kết quả mong đợi và kết quả thực tế, mặc dù ngữ nghĩa giống hệt nhau của chúng.

Ví dụ:

Kết quả mong đợi:

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

kết quả thực tế:

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

Tôi đã thử chuẩn hóa xml bằng cách sử dụng XmlUtil.serialize(), tuy nhiên điều này dường như giữ khoảng trắng, để lại những khác biệt về cú pháp.

Làm cách nào để nhận được chuỗi xml chuẩn hóa/chuẩn hóa để làm cho thử nghiệm của tôi mạnh mẽ hơn?

Tôi đang viết một ứng dụng Grails, vì vậy tôi ổn với bất kỳ giải pháp nào trong Groovy hoặc Java.

+2

[Các tài liệu hiển thị bằng cách sử dụng xmlunit] (http: //groovy.codehaus.org/Tạo + XML + bằng cách sử dụng + Groovy + StreamingMarkupBuilder) ... –

+0

Sự khác biệt nếu bạn nhận được điều này là gì? –

Trả lời

16

Bạn có thể sử dụng Groovy XMLUnit tiện ích như thế này:

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

XMLUnit.compareXML(expectedXml, actualXml) 

Để so sánh các file XML trong khi bỏ qua những khác biệt cú pháp.

+0

Cảm ơn, đó là những gì tôi đang tìm kiếm. – Will

0

Câu hỏi cũ hơn, nhưng có thể thú vị để sử dụng trong tương lai.
Một khả năng khác, hoạt động không chỉ cho XML, mà còn có thể được sử dụng cho vấn đề của bạn.

Đối với các thử nghiệm như thế này, bạn cũng có thể sử dụng Kiểm tra phê duyệt (http://approvaltests.sourceforge.net), điều này dẫn đến rất ít mã trong thử nghiệm đơn vị của bạn.

Với phê duyệt Kiểm tra, bạn viết kiểm tra và kiểm tra kết quả của mình với đầu ra mong muốn.

Mô tả ngắn: Trong lần chạy thử đầu tiên, không có kết quả mong đợi, vì vậy ApprovalTests ghi hai tệp - một "đã nhận" (đầu ra mã của bạn) và "được phê duyệt" (đầu ra dự kiến ​​mã của bạn). Trong lần chạy đầu tiên, "được chấp thuận" trống, bởi vì bạn phải phê duyệt đầu ra của mã của bạn. Điều này được thực hiện với một công cụ khác. ApprovalTests mở một công cụ khác và hiển thị hai tệp trong đó. Nếu đầu ra của mã của bạn là những gì bạn mong đợi, bạn di chuyển đầu ra đến tệp đã được phê duyệt. Bây giờ tất cả các bài kiểm tra tiếp theo sẽ chạy, nếu đầu ra không thay đổi (nhận được == đã được phê duyệt).

0

Câu hỏi và câu trả lời được chấp nhận (tính đến hôm nay) tương ứng với phiên bản cũ của XMLUnit.

Đối với những người muốn biết làm thế nào để làm điều đó với XMLUnit v2 trên 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() 
} 

Có lẽ đó là một cách "groovier" làm việc đó nhưng tôi nghĩ rằng đó là OK cho mục đích minh hoạ :)