SoapUI 中的断言:脚本、XQuery、XPath 类型教程

什么是断言?

断言是指肯定或陈述某事的行为。它也可以解释为检查点或验证点。

一旦将请求发送到 Web 服务器,就会收到响应。我们需要验证响应是否包含我们期望的数据。为了验证响应,我们需要使用断言。

断言类型

断言响应的方式多种多样;不过,我们将重点介绍验证响应时常用的 SoapUI 断言类型。以下是 SoapUI 开源版本中可用的类型。

  1. 物业内容
  2. 合规状况 标准
  3. 脚本
  4. SLA
  5. JMS
  6. 安全性
SoapUI 中的断言类型
SoapUI 中的断言类型

除了上面列出的之外,PRO 版本还具有内置的 JDBC 断言,我们可以使用它来断言 Web 服务是否正确更新了数据库。

包含断言

搜索指定字符串是否存在。它也支持正则表达式。

我们将继续使用上一个教程中的相同示例,使用 WSDL 请求作为 http://www.dneonline.com/calculator.asmx.

步骤1: 默认情况下没有断言。

  • 断言的数量显示在断言选项卡中。
  • 要添加新的断言,请单击“添加新断言”按钮。

包含断言

步骤2: 现在,

  1. 选择断言类别。
  2. 选择断言类型。
  3. 点击“添加”

包含断言

步骤3: 让我们验证响应中是否存在字符串“46”。单击“确定”

注意:我们也可以忽略大小写并添加正则表达式。

包含断言

步骤4: 添加后,立即执行断言并显示是否有效或无效。

包含断言

步骤5: 现在让我们将“SoapUI 中包含断言”的内容更改为“47”,看看会发生什么。

包含断言

步骤6: 执行断言并将结果抛给用户。由于响应中没有字符串“47”,因此断言失败。

包含断言

不包含断言

搜索指定字符串是否存在。它也支持正则表达式。

步骤1: 现在点击“添加新断言”按钮后,

  1. 选择断言类别。
  2. 选择断言类型——本例中为“不包含”
  3. 点击“添加”

不包含断言

步骤2: 让我们验证响应中是否存在字符串“intA”。输入字符串“FromCurrency”并单击“确定”

不包含断言

步骤3: 一旦添加了断言,它就会执行并显示结果。到目前为止,我们已经添加了两个断言,因此两个断言都已执行并显示结果。

不包含断言

步骤4: 现在让我们改变“不包含断言”的内容,看看会发生什么。我们将检查字符串“AddResult”是否存在。

不包含断言

步骤5: 字符串“AddResult”实际上存在于响应中,因此“不包含”断言将失败,如下所示。

不包含断言

XPATH 匹配断言

使用 XPath的 表达式来选择目标节点及其值。XPath 是一种用于从 XML 文档中选择节点的 XML 查询语言。

步骤1: 现在点击“添加新断言”按钮后,

  1. 选择断言类别。
  2. 选择断言类型——在本例中为“XPath Match”
  3. 点击“添加”

XPath 匹配断言

步骤2: 添加 XPath 窗口打开。

在添加 SoapUI XPath 之前,我们需要声明命名空间。XML 命名空间是名称的集合,由统一资源标识符 (URI) 引用标识,在 XML 文档中用作元素和属性名称。SOAP UI XPath 断言中也使用相同的名称。

为了声明 XML 命名空间,我们只需要单击“声明”按钮,它就会为我们完成这项工作,否则我们也可以自己手动声明命名空间。

声明命名空间后,我们需要使用创建的名称空间来引用 XPath。

单击“声明”按钮后,将弹出两个命名空间,因为我们有两个 URI。其中一个是架构 URL,另一个对应于实际的 Web 服务 URL。在引用 XPath 时,我们需要使用 Web 服务所在的实际命名空间,而不是架构命名空间。

XPath 匹配断言

声明命名空间 soap='http://schemas.xmlsoap.org/soap/envelope/';

声明命名空间 ns1='http://tempuri.org/';

XPath 匹配断言

步骤3: 现在我们需要输入我们需要验证的 XML 节点的 XPath。

//ns1:AddResult 给出了包含在以下节点之间的值& ns1 对应于指向“http://tempuri.org/”的声明命名空间

输入 XML 后,我们需要点击“从当前选择”,这样就可以选取当前响应中的值来进行进一步的比较。

XPath 匹配断言

步骤4: 到目前为止,

  1. 声明命名空间后,我们输入了需要验证的 XML 节点的 XPath。
  2. 我们需要点击‘从当前选择’以使当前值成为预期值。
  3. 当前值显示给用户,如果需要我们可以修改。
  4. 点击“保存”。

XPath 匹配断言

步骤5: SoapUI 中添加的断言将显示如下。

XPath 匹配断言

脚本断言

这种断言技术是最广泛使用的技术,因为管理和维护数百个断言极其困难。

SOAP UI 使用 Groovy 脚本或 JavaScript 用于脚本断言。采用脚本技术来开发用于测试 SOAP 的框架。在以下情况下使用脚本断言。

脚本允许用户分别使用设置和拆卸方法在执行 TestCase 之前和之后执行某些操作。设置是在执行特定方法之前执行的过程(例如 - 对象创建和初始化),而拆卸是在执行该方法之后执行的过程(例如:销毁对象和清理)。此功能在其他断言类型中不可用,只能通过编码完成。

它允许用户打开/关闭项目,以便初始化或清理项目相关设置,以及使用环境变量,这在脚本编写期间非常有用。

它帮助我们断言动态的响应内容。

脚本断言用于创建未由 SOAP UI 预定义的用户定义断言。

为了演示 SoapUI 中的脚本断言,我们将使用计算器 WSDL,即我们之前创建的测试用例“添加”。

步骤1: 添加 Groovy 脚本的步骤与其他断言相同,只是断言不是预定义的。相反,它是一个用户定义的断言,比内置断言提供了更大的灵活性。

选择需要添加断言的测试步骤。

脚本断言

单击“添加断言”按钮,如下所示。

脚本断言

步骤2: 现在选择断言类别。

  1. 在这种情况下,它是脚本。
  2. 选择 SoapUI 脚本断言,并且没有与其关联的子类型。
  3. 单击“添加”。

脚本断言

步骤3: 脚本对话框打开后,用户可以在其中编写用户定义的脚本来验证响应 XML。

脚本断言

步骤4: 现在让我们编写一个 Groovy 脚本来验证转换率。脚本附在下面,并嵌入了注释。建议了解 Java 脚本或 Groovy 在尝试编写自己的脚本之前,请先编写脚本。

//Define Groovy Utils and holder for validating the XML reponse content
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def holder = groovyUtils.getXmlHolder(messageExchange.responseContent)

//Define the NameSpace
holder.namespaces["ns1"] = "http://tempuri.org/"

//Get the Value of the Node 'AddResult' and assign to a variable
def addResult = holder.getNodeValue("//ns1:AddResult")

//print the value of the result in the Output panel
log.info "The result value for integers is " + addResult

//Comparing the value to print 'Pass' or 'Fail'
if(addResult=="46")
{ log.info "Pass" }
else
{ log.info "fail"}
  1. 单击“执行”按钮即可触发执行。
  2. 脚本的输出显示在“输出”窗格中。它打印了转换值以及最终结果(通过或失败)
  3. 显示信息“脚本断言已通过”。单击“确定”。

注意:只要脚本语法正确,最终的信息弹出窗口将始终显示“脚本断言已通过”消息。它与脚本中的断言没有任何关联。

脚本断言

单击确定

步骤5: 现在,断言选项卡显示我们为此测试套件添加的所有断言以及每个断言的状态。

脚本断言

步骤6: 现在

  1. 从导航器树中选择测试套件
  2. 点击“运行”按钮
  3. 将显示整个测试套件的结果。

脚本断言

Xquery 匹配断言

它使用 Xquery 表达式从目标属性中选择内容。我们需要更大的响应 XML 才能更好地理解 SoapUI 中的 XQuery 断言。让我们导入另一个 WSDL,如下所示: http://www.webservicex.net/medicareSupplier.asmx?WSDL

步骤1: 右键单击现有项目并选择“添加 WSDL”。

Xquery 匹配断言

步骤2: 右键单击现有项目并选择“添加 WSDL”。保留其他选项的默认设置,然后单击“确定”按钮。

Xquery 匹配断言

步骤3: 所有操作列出如下。

Xquery 匹配断言

步骤4: 现在让我们添加一个 测试用例 在我们为 测试与验证 货币转换器。

Xquery 匹配断言

步骤5: 输入测试用例的名称,然后单击“确定”按钮

Xquery 匹配断言

步骤6: 测试用例创建如下所示。

Xquery 匹配断言

步骤7: 添加
一个新的类型为“Soap Test Request”的测试步骤,如下所示。

Xquery 匹配断言

步骤8: 输入测试步骤的名称。假设为 – Supplier_by_City,这样更有意义。单击“确定”。

Xquery 匹配断言

步骤9: 点击 Opera我们希望验证的 tion。在本例中为 'MedicareSupplierSoap -> GetSupplierByCity'。单击“OK”。

Xquery 匹配断言

步骤10: 输入测试用例的名称,然后单击“确定”。

Xquery 匹配断言

步骤11: 请求 XML 大纲将显示如下。

Xquery 匹配断言

步骤12: 现在让我们查找“纽约”城市的所有供应商信息。

为此,请将以下几行添加到您的代码中。

<GetSupplierByCity xmlns="http://www.webservicex.net/">

<City>New York</City>

</GetSupplierByCity>

以下 URL 中的 WSDL – http://www.webservicex.net/medicareSupplier.asmx?op=GetSupplierByCity

Xquery 匹配断言

步骤13: 执行测试后,我们收到以下响应

Xquery 匹配断言

步骤14: 假设我们需要验证所有供应商编号。我们不能使用 XPath 断言,因为我们需要数百个 XPath 断言。因此,在这种情况下,使用 XQuery 是不可避免的。

XQuery 断言帮助我们验证一组本质上重复的 XML 响应。

Xquery 匹配断言

步骤15: 现在点击“添加断言”,

  1. 在这种情况下,选择“断言类别” - 属性内容。
  2. 选择断言类型为“XQuery 断言”
  3. 单击“添加”。

Xquery 匹配断言

步骤16: 与 XPath 断言类似,我们需要声明命名空间。

  1. 单击“声明”按钮可自动允许 SOAP UI 声明命名空间。单击“声明”按钮后,将向用户显示一个“弹出窗口”,其中包含“改为从架构声明命名空间”消息。单击“是”继续,如下所示。

    请注意: 点击‘声明按钮’后,您可能会得到不同的 URL 作为命名空间声明,但是,实际的 Web 服务位置命名空间才是编码时要考虑的。

    Xquery 匹配断言

  2. 为了检索所有供应商编号,我们需要编写一个 XPath 查询,并将其放在 <SupplierNumber> 中,然后标签。
  3. 单击“从当前选择”将从当前响应执行。
  4. 单击“从当前选择”后,将列出所有供应商编号。
  5. 点击“保存”。
// Namespace declaration
declare namespace soap='http://schemas.xmlsoap.org/soap/envelope/';
declare namespace ns1='http://www.webservicex.net/';
declare namespace x = '';

// Placing the result in Myresult Tags

{
// Iterating through all the supplier number 
for $x in //ns1:GetSupplierByCityResponse/ns1:SupplierDataLists/ns1:SupplierDatas/ns1:SupplierData

//Return all the Supplier number within ‘SupplierNumber’ Tags.
return {data($x/ns1:SupplierNumber)}
}

Xquery 匹配断言

步骤17: 执行 XQuery 断言并在“断言”面板中显示最终结果,如下所示。现在我们已成功添加 Xquery 断言,我们已使用该断言验证了所有供应商编号信息。每次将请求发送到 Web 服务器时,都会将其与实际情况进行比较。

注意:不会显示实际值。如果所有实际值与预期值相同,则显示“VALID”,否则将显示“Failed”。

Xquery 匹配断言

何时使用内置断言?

  • 当响应很短时,可以使用其中一个内置断言进行验证。
  • 如果 Web 服务器发送的响应本质上始终是静态的,我们也可以使用内置断言。如果它是动态的,我们将无法使用内置断言对其进行断言。
  • 当使用内置断言(如超时断言和安全断言)变得不可避免时。
  • 内置断言非常适合一次性使用且不需要重复测试的情况。

断言选项

在下面突出显示的控制面板的帮助下可以最好地控制创建的断言。

断言选项

创建的断言允许测试人员从断言工具箱中配置以下内容。

附加选项 描述

断言选项

选定的断言将向上移动。

断言选项

选定的断言将按顺序向下移动。

断言选项

删除选定的断言

断言选项

重新配置/编辑所选的断言。
  • 以下是 SOAP UI PRO 版本独有的功能。PRO 版本还帮助我们对断言进行分组,以便我们可以为创建的断言添加另一层验证。
  • AND:所有断言均被评估为有效断言,这将导致组条件通过。OR:为了断言组条件通过,组内至少一个断言必须是有效的。

  • 专业版还允许 断言的克隆:此选项允许测试人员将断言复制到同一项目或不同项目中的不同测试步骤。
  • 禁用/启用断言:此选项允许禁用或启用任何分组或未分组的断言。如果断言被禁用,它将变灰,并且在执行测试用例时,不会执行禁用的断言。
  • 取消分组断言:如果测试人员决定这样做,任何分组的断言都可以取消分组。

各种断言类型中可用的方法的完整列表

断言机制

描述

物业内容
包含 搜索指定字符串是否存在。它也支持正则表达式。
不包含 搜索指定字符串是否存在。它也支持正则表达式。
XPath 匹配 使用 XPath 表达式选择目标节点及其值。
XQuery 匹配 使用 Xquery 表达式从目标属性中选择内容。
合规性、状态、标准
HTTP 下载所有资源 下载后验证 HTML 文档,并且它适用于任何包含 HTML 的属性。
无效的 HTTP 状态代码 验证 HTML 响应是否包含定义代码列表中未包含的状态代码。
非 SOAP 错误 验证最后收到的消息是否不是 SOAP 错误。很明显,它仅适用于 SOAP 测试步骤。
架构合规性 验证最后收到的消息是否符合 WSDL 或 WADL 标准架构定义。适用于 SOAP 和 REST 测试步骤。
SOAP 故障 验证最后收到的消息是否为 SOAP 错误。它与“非 SOAP”错误断言相反。
SOAP 响应 验证最后收到的响应是否是有效的 SOAP 响应,并且仅适用于 SOAP 测试请求步骤。
有效的 HTTP 状态代码 验证 HTML 响应是否包含已定义代码列表中的状态代码。它是“无效 HTTP 状态代码”断言的逆过程。
WS-Addressing 请求 验证最后收到的请求是否包含适当的 WS-Addressing Headers。
WS-Addressing 响应 验证最后收到的响应是否包含适当的 WS-Addressing Headers。
WS-安全状态 验证最后收到的消息是否包含有效的 WS-Security 标头,并且仅适用于 SOAP 请求。
脚本
脚本断言 允许用户执行自定义脚本来执行用户定义的验证。
SLA
响应 SLA 验证最后收到的响应的响应时间是否在定义的限制内。
JMS
JMS 状态 验证测试步骤的 JMS 请求是否已成功执行,并且对于具有 JMS 端点的测试步骤是否有效。
JMS 超时 验证测试步骤的 JMS 响应所用时间是否未超过指定的持续时间。
安全性
敏感信息暴露 验证响应消息是否不暴露有关目标系统的敏感信息。我们可以将此断言用于 REST、SOAP 和 HTTP 测试步骤。

下载包含上述断言的 SOAPUI 项目

常见错误及故障排除

使用正确的命名空间。命名空间应该是 Web 服务所在的 URL。

如果在开发脚本断言时抛出错误,请使用“log.info”打印变量的内容

如果您没有得到所需的输出,请验证请求中是否传递了有效的输入。

例如,在货币转换器中,如果您输入“intA”作为“x”(它不是整数),则输出将抛出错误代码“SOAP-Client”,这意味着问题出在从客户端传递的参数上。

常见错误及故障排除

常见错误及故障排除

确保在使用 XPATH 和 XQuery 断言时使用正确的语法。使用上述断言时,您不应使用点 (.) 代替冒号 (:)。语法是 //namespace:Tagname 而不是 //namespace.tagname。这样做可能会导致您收到一条消息“当前响应中无匹配”,尽管标签名称是正确的。

常见错误及故障排除