验证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”提供响应。