使用xmlUnit对XML字符串对比的一些技巧

时间:2023-02-11 22:27:01

今天又遭遇比较变态的 XML 字符串对比。所以特意将几种特殊的对比总结了一下:

1.     如何对比 XML 中某些特定路径节点是否相等,而不是整体对比。

测试场景,如得到订购信息,可能订购的结束日期是实时生成的,假如我们不需要对比(每次回归都回出错)。那么参加如下脚本

 String ExpXmlText ="<?xml version=/"1.0/" encoding=/"utf-8/"?><AppSubscResult>"+"/r/n"+
       "  <result>Yes</result>"+"/r/n"+
       "  <subscUserId>9950001</subscUserId>"+"/r/n"+
       "  <appInstanceId></appInstanceId>"+"/r/n"+
       "  <gmtStart>2008-08-11 00:00:00</gmtStart>"+"/r/n"+
       "  <gmtEnd>2008-10-10 23:59:59</gmtEnd>"+"/r/n"+
       "  <subscUrl></subscUrl>"+"/r/n"+
       "  <errorMessage></errorMessage>"+"/r/n"+
       "</AppSubscResult>";

  String path1 = "/AppSubscResult/result";
          String path2 = "/AppSubscResult/subscUserId";
          String path4 = "/AppSubscResult/gmtStart";
          String path5 = "/AppSubscResult/gmtEnd";
          String path6 = "/AppSubscResult/subscUrl";
          String path7 = "/AppSubscResult/errorMessage";
          XMLAssert.assertXpathValuesEqual(path1,ExpXmlText,path1,ActXmlText);
          XMLAssert.assertXpathValuesEqual(path2,ExpXmlText,path2,ActXmlText);
          XMLAssert.assertXpathValuesEqual(path4,ExpXmlText,path4,ActXmlText);
          XMLAssert.assertXpathValuesEqual(path5,ExpXmlText,path5,ActXmlText);
          XMLAssert.assertXpathValuesEqual(path6,ExpXmlText,path6,ActXmlText);
          XMLAssert.assertXpathValuesEqual(path7,ExpXmlText,path7,ActXmlText);

2.     如果 xml 文件中含多个同节点路径的节点,如何只断言内容,而不关注节点次序。

测试场景如下,测试下面的期望结果,不关系 a 节点的排序情况。

<root>

<a>1</a>

  <a>2</a>

  <a>3</a>

</root>

 String ActXmlText = response.getText();
       System.out.println(ActXmlText);
  
     Diff myDiff = new Diff(ExpXmlText, ActXmlText);
     myDiff.overrideElementQualifier(new MultiLevelElementNameAndTextQualifier(1));
     XMLAssert.assertXMLEqual("GetTribMemberList
列表 ",
                     myDiff, true);

3 但是如果用 xmlunit1.1 的版本对于下面的 xml 字符串,如果期望附录 a 的节点的次序不一致的问题就无能为力了

那么用户就要升级 xmlunit 了,升级到 xmlunit1.2 的版本

<root>

  <a><c>1.1</c><d>1.2</d></a>

  <a><c>2.1</c><d>2.2</d></a>

</root>

代码如下:

Diff myDiff = new Diff(ExpXmlText, ActXmlText);
     //RecursiveElementNameAndTextQualifier
     myDiff.overrideElementQualifier(new RecursiveElementNameAndTextQualifier());
     XMLAssert.assertXMLEqual("GetTribChiefUser
列表 ",
                     myDiff, true);