首页 > 代码库 > 使用soapui验证XML

使用soapui验证XML

验证XML消息

采样器TestSteps收到的所有消息都内部转换为对应的XML,这为断言和其他后处理提供了一个共同点。XPath Match和XQuery Match是两个最强大的断言,它们都利用命名技术来提供细粒度的消息验证的可能性。我们来看几个例子吧!


1. XPath 断言

XPath断言将指定的XPath表达式应用于接收到的消息,并根据预期值验证生成的节点。如果值与断言通过匹配,否则失败。让我们跳进去,这是一个我们要验证的登录响应消息;

 

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/">    <soapenv:Header/>    <soapenv:Body>       <sam:loginResponse>          <sessionid>10873286937963711</sessionid>       </sam:loginResponse>    </soapenv:Body> </soapenv:Envelope>  
基本上我们要检查SOAP Body中的loginResponse和sessionid元素,但忽略sessionid的实际值,因为它将在每个请求之间进行更改。

 

首先选择“Assertion”工具栏中的"Add Assertion"按钮,并在提示对话框中选择“XPath Match”断言:

 

技术分享


技术分享

对话框分为两个区域:顶部指定要应用的XPath表达式,并且底部包含预期结果。下一步是指定选择loginResponse元素的XPath表达式;

declare namespace sam=‘http://www.example.org/sample/‘;
//sam:loginResponse[1]

 

 

将此表达式输入到顶部编辑字段,然后按下面工具栏中的“Select from current”,如下:

 

 

技术分享

如您所见,“Select from current”操作将XPath表达式应用于基本响应消息,并在“预期结果”字段中显示结果;现在,这是SoapUI将每次接收到新的响应并执行断言时所进行比较的值。如果值不匹配,则断言失败。

1.1. 通配符

显然这里有一个问题; sessionid将每次都会有所不同,这将导致断言失败,我们来使用通配符来解决这个问题;

技术分享

在上面我们选择了“Allow Wildcards”选项,并用‘*‘替换了sessionid值,这将导致SoopUI在断言结果时忽略sessionid值。

如果我们想要声明整个响应消息,我们可以将配置更改为以下内容:

 

技术分享

1.2. XPath向导

在SoapUI Pro中,上述创建的断言或其XPath语句非常简单; XPath Match配置对话框中的左上角的按钮打开一个对话框,允许您为XPath表达式选择所需的目标节点,然后将自动为您创建。对于上述情况,如下所示:

 

技术分享


SoapUI Pro还向响应消息的outline视图的右键单击弹出菜单中添加了一些向导;右键单击要在outline视图中断言的节点,将打开以下弹出窗口:

 

技术分享

 

这里的前四个选项都为您创建预配置的XPath断言,例如选择“for Existence”选项创建以下XPath Assertion;

 

技术分享

如果我们选择了“for Content matching RegEx”选项,我们将首先被提示输入一个正则表达式,该表达式应用于验证所选节点;

技术分享

这里我们指定了只匹配数字的“.\d”正则表达式

技术分享

2. XQuery匹配断言

XQuery Match断言的作用与上述XPath断言一样,唯一的区别在于,使用XQuery表达式代替XPath来选择应该验证的XML,这对于复杂的验证有一些明显的优势;

 

  • 只能选择所需的节点并将其合并成一个XML结果来断言
  • 可以对结果进行排序,允许您创建不依赖于XML消息中项目顺序的断言等等

这就是一个例子。要验证以下响应消息;

 

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 	    <soapenv:Header/> 	    <soapenv:Body> 	        <sam:searchResponse> 	            <sam:searchResponse> 	                <item> 	                    <id>1</id> 	                    <description>One handy protocol droid</description> 	                    <price>1</price> 	                </item> 	                <item> 	                    <id>2</id> 	                    <description>Item nr 2</description> 	                    <price>2</price> 	                </item> 	                <item> 	                    <id>3</id> 	                    <description>Item nr 3</description> 	                    <price>3</price> 	                </item> 	                <item> 	                    <id>4</id> 	                    <description>Item nr 4</description> 	                    <price>4</price> 	                </item> 	                <item> 	                    <id>5</id> 	                    <description>Item nr 5</description> 	                    <price>5</price> 	                </item> 	            </sam:searchResponse> 	        </sam:searchResponse> 	    </soapenv:Body> 	</soapenv:Envelope>

现在我们假设你总是期望这些项目,但是订单是未定义的,你只想验证价格。以下XQuery Match断言将会做到这一点:

 

技术分享

指定的XQuery表达式选择所有项目,并按其ID排序,然后将价格提取为临时xml结果。按“Select from current”提供响应。

 

使用soapui验证XML