xml文件对比或xml大字符串对比方法(蛮精简的)

  现在测试很多接口返回的类型是xml的字符串,当返回值为较小的值的时候。期望结果直接写在代码里边是靠普的。但是当返回结果相当大的时候,期望值保存在哪里呢,以前我也做过直接写在代码里,结果造成代码行相当的长,几乎一个测试用例只能看见期望结果的数据了,自然不好。那么如果存在文件里如何呢?可能会有这样的问题存在文件里如何对比呢,采用文本内容对比吗?总觉得不太靠普,至少xml特性没能体现,譬如不能告诉我是哪个节点出错了。
    今天我发现xmlunit有这个功能(有点后知后觉,大家不要笑话);而且结合xml其他的jar包可以快速解决这个问题,而且代码也很精简,特贴代码如下
 public void tet() throws Exception
 {
  String actXmlText ="<?xml version=\"1.0\" encoding=\"utf-8\"?>" +"\r\n"+
  "<error_response>" +"\r\n"+
  " <args>" +"\r\n"+
  "  <arg></arg>" +"\r\n"+
  " </args>" +"\r\n"+
  " <code>16</code>" +"\r\n"+
  " <msg>wang wang service return error</msg>" +"\r\n" +
  " <sub_code>33000</sub_code>" +"\r\n" +
  " <sub_msg>wang wang service error: param error.</sub_msg>" +"\r\n" +
  "</error_response>";
  System.out.println(actXmlText);
  DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
  DocumentBuilder dombuilder=domfac.newDocumentBuilder();
  InputStream is= new FileInputStream("c:/11.xml");
  Document doc = dombuilder.parse(is);
  InputStream is1 = new FileInputStream("c:/12.xml");
  Document doc1 = dombuilder.parse(is1);
  Document doc2  =  dombuilder.parse( new  ByteArrayInputStream(actXmlText.getBytes()));
  XMLAssert.assertXMLEqual(doc2, doc);
  XMLAssert.assertXMLEqual(doc2, doc1);
 }
 这里为了方便代码展示没有将actXmlText写成大字符串,实际上通常测试场景中这个代表调用接口返回值,代码会是类似下面的代码
  WebConversation conversation = new WebConversation();
  WebRequest request = new PostMethodWebRequest(Url);
  WebResponse response = conversation.getResponse(request);
  System.out.println(response.getText());
  String actXmlText = response.getText();
 测试结果错误会报如下内容,明确告诉你哪个节点出错了:
  junit.framework.AssertionFailedError: org.custommonkey.xmlunit.Diff
[different] Expected text value ‘16′ but was ‘15′ – comparing 16 at /error_response[1]/code[1]/text()[1] to 15 at /error_response[1]/code[1]/text()[1]



本文转自elbertchen 51CTO博客,原文链接:http://blog.51cto.com/linkyou/282596,如需转载请自行联系原作者
上一篇:QXmlStreamReader和QXmlStreamWriter实现将一个xml文件读取后保存为另一个xml


下一篇:【错误记录】Android Studio 编译报错 ( Could not find com.android.tools.build:gradle:4.2.1. )