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

什么是断言?

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

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

断言类型

有多种断言响应的方式;但是,我们将重点关注在验证响应时常用的 SoapUI 断言类型。以下是 SoapUI 开源版本中可用的断言类型。

  1. 属性内容
  2. 合规状态标准
  3. 脚本
  4. SLA
  5. JMS
  6. 安全性
Types of Assertions in SoapUI
SoapUI 中的断言类型

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

包含断言

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

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

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

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

Contains Assertion

步骤 2: 现在,

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

Contains Assertion

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

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

Contains Assertion

步骤 4: 添加后,断言会立即执行并显示是“有效”还是“无效”。

Contains Assertion

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

Contains Assertion

步骤 6: 断言被执行,结果显示给用户。由于响应中没有字符串“47”,断言失败。

Contains Assertion

不包含断言

搜索指定字符串的不存在。它还支持正则表达式。

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

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

Not Contains Assertion

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

Not Contains Assertion

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

Not Contains Assertion

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

Not Contains Assertion

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

Not Contains Assertion

XPath 匹配断言

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

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

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

XPath Match Assertion

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

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

要声明 XML 命名空间,我们只需单击“声明”按钮即可完成此操作,否则我们也可以手动声明命名空间。

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

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

XPath Match Assertion

declare namespace soap='http://schemas.xmlsoap.org/soap/envelope/';

declare namespace ns1='http://tempuri.org/';

XPath Match Assertion

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

//ns1:AddResult 给出 之间包含的节点的值,ns1 对应于指向 'http://tempuri.org/' 的已声明命名空间

输入 XML 后,我们需要单击“从当前选择”,以便从当前响应中获取值进行后续比较。

XPath Match Assertion

步骤 4: 到目前为止,

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

XPath Match Assertion

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

XPath Match Assertion

脚本断言

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

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

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

它允许用户打开/关闭项目,以初始化或清理项目相关设置,并处理环境变量,这在脚本编写过程中非常有用。

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

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

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

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

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

Scripting Assertions

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

Scripting Assertions

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

  1. 在本例中是脚本。
  2. 选择 SoapUI 脚本断言,它没有关联的子类型。
  3. 单击“添加”。

Scripting Assertions

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

Scripting Assertions

步骤 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. 显示信息“脚本断言通过”。单击“确定”。

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

Scripting Assertions

点击确定

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

Scripting Assertions

步骤 6: 现在

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

Scripting Assertions

Xquery 匹配断言

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

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

Xquery Match Assertion

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

Xquery Match Assertion

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

Xquery Match Assertion

步骤 4: 现在让我们在为 测试 货币转换器而创建的同一测试套件中添加一个 测试用例

Xquery Match Assertion

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

Xquery Match Assertion

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

Xquery Match Assertion

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

Xquery Match Assertion

步骤 8: 输入测试步骤的名称。我们称之为 – Supplier_by_City,这样会更有意义,然后点击“确定”。

Xquery Match Assertion

步骤 9: 选择我们要验证的操作。在本例中是“MedicareSupplierSoap -> GetSupplierByCity”。单击“确定”。

Xquery Match Assertion

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

Xquery Match Assertion

步骤 11: 请求 XML 概要将显示如下。

 Xquery Match Assertion

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

为此,请在您的代码中添加以下行。

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

<City>New York</City>

</GetSupplierByCity>

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

Xquery Match Assertion

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

Xquery Match Assertion

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

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

Xquery Match Assertion

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

  1. 选择“断言类别”——在本例中为“属性内容”。
  2. 选择断言类型为“XQuery 断言”
  3. 单击“添加”。

Xquery Match Assertion

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

  1. 点击“声明”按钮以自动允许 SOAP UI 声明命名空间。点击声明按钮后,会向用户显示一个带有消息“instead declare namespace from schema”的“弹出”窗口。点击“是”以继续,如下所示。

    注意:点击“声明”按钮后,您可能会得到不同的 URL 作为命名空间声明,但是,实际的 Web 服务位置命名空间将被视为编码。

    Xquery Match Assertion

  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 Match Assertion

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

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

Xquery Match Assertion

何时使用内置断言?

  • 当响应很短,可以使用内置断言进行验证时。
  • 如果 Web 服务器发送的响应总是静态的,我们也可以使用内置断言。如果它是动态的,我们将无法使用内置断言进行断言。
  • 当内置断言(如超时断言和安全断言)的使用变得不可避免时。
  • 内置断言非常适用于一次性使用,无需重复测试。

断言选项

创建的断言可以通过下面突出显示的控制面板进行最佳控制。

Assertions Options

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

选项 描述

Assertions Options

选定的断言向上移动。

Assertions Options

选定的断言向下移动。

Assertions Options

删除选定的断言

Assertions Options

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

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

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

断言机制

描述

属性内容
包含 搜索指定字符串是否存在。它还支持正则表达式。
不包含 搜索指定字符串的不存在。它还支持正则表达式。
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 标头。
WS-Addressing 响应 验证最后收到的响应是否包含适当的 WS-Addressing 标头。
WS-Security 状态 验证最后收到的消息是否包含有效的 WS-Security 标头,并且仅适用于 SOAP 请求。
脚本
脚本断言 允许用户执行自定义脚本以执行用户定义的验证。
SLA
响应 SLA 验证最后收到的响应的响应时间是否在定义的限制内。
JMS
JMS 状态 验证测试步骤的 JMS 请求是否成功执行,并适用于具有 JMS 端点的测试步骤。
JMS 超时 验证测试步骤的 JMS 响应未超过指定持续时间。
安全性
敏感信息暴露 验证响应消息是否未暴露有关目标系统的敏感信息。我们可以将此断言用于 REST、SOAP 和 HTTP 测试步骤。

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

常见错误和故障排除

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

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

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

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

Common Errors And Trouble Shooting

Common Errors And Trouble Shooting

确保在使用 XPATH 和 XQuery 断言时使用正确的语法。在使用上述断言时,您不应该使用点号(.)代替冒号(:)。语法是 //namespace:Tagname,而不是 //namespace.tagname。这样做,即使标签名称正确,您最终也可能会收到“当前响应中没有匹配项”的消息。

Common Errors And Trouble Shooting