消息桩能够模拟服务,是对 SOAP 客户端的补充。本工具用于对返回单个消息的服务进行打桩。 

章节目录: 

关于消息桩

消息桩工具可以作为端对端测试场景的一部分来调用。当特定消息桩测试步骤作为测试序列的一部分来调用时,SOAtest 的本地服务器将监听其消息。它将使用该消息,然后以消息桩工具的配置中所定义的方式做出反应。完成此操作后,将执行测试场景中的下一个测试。

可以将消息桩工具整合到端到端的测试场景中,以便在测试套件执行流程中的所需位置进行调用,并可以触发其他测试操作。

例如,如果要验证执行包含多个步骤的业务流程工作流的贷款审批服务(包括调用经理批准服务和另一个外部信用评级服务),您可以构建具有以下测试的场景:

可以使用数据源中的数据来参数化这些桩。 

当您想要应用程序与桩而不是实际资源进行交互时,请配置您的应用程序以访问桩,该桩将部署在 http://<localhost>:9080/servlet/MessageHandler。注意,以这种形式创建和部署的每个桩都具有相同的 URL。这是可能的,因为根据测试套件的逻辑,一次只能调用一个消息桩工具

您可以通过附加到消息桩工具上的通讯报文查看器工具来查看消息桩工具的行为。

服务定义选项

定义选项卡中指定选项允许 SOAtest 使用让您更易指定响应消息的项填充响应选项卡。您可以指定与服务定义或 schema 相关的以下设置,定义预期的请求和传出响应:

响应选项

响应选项卡允许您配置希望模拟资产在接收特定请求时要传送的响应值。 

该选项是否可用取决于输入模式菜单中选择的是什么选项。

字面量 XML、表单 XML、脚本化 XML 和表单输入。

字面量 XML表单 XML脚本化 XML表单输入的可用选项 SOAP 客户端工具可用的选项相似。 

注意,如果在表单输入或表单 JSON 视图中启用资源选择器,则可以使用它来选择响应的资源。当选择一个资源时,表单输入视图和表单 JSON 视图用合适的值和 UI 控件(例如,布尔值的单选按钮、数字和整数的不同控件等)进行填充。 

多响应视图

响应视图允许您指定用于特定请求的响应。 

条件选项卡中,您可以指定必须满足的请求条件,以便发送相关响应。可以使用 XPath 函数和/或 URL 参数为 RESTful 服务指定条件(内置支持可用于 GET 和 POST)。消息选项卡指定如果满足条件,将发送什么响应。

 如果出现以下情况,请启用始终匹配选项:

  • 想要指定无论传入消息的内容是什么,桩应该始终返回的单个响应,或者
  • 您有多个响应并且想要指定桩应该返回的最终响应。在这种情况下,如果先前条件都不匹配,它将作为兜底的最终响应。例如,您可以指定返回 SOAP 错误的“始终匹配”最终响应,表示服务处理请求失败,然后根据传入值返回相应内容。

如果不止一个 XPath 或 URL 参数匹配响应,则 SOAtest 将返回列表中第一个匹配的响应(使用按钮指定所需序列或响应)。如果为每个响应提供的 Xpath 或 URL 参数导致唯一匹配,则响应的顺序无关紧要。 

脚本化 XML 视图

脚本化 XML 视图允许指定复杂逻辑。详情请参阅Using Scripted Logic

传输消息头选项

传输消息头选项允许指定 HTTP、JMS 或 MQ 消息头属性。

测试关联性选项

测试关联性选项允许指定消息桩工具接收并处理哪些消息。将发送到桩 URL 的不同消息路由到基于此处设置的特定的消息桩工具(每一个都处理不同的操作)。例如,其中一个消息桩工具可能响应到客户注册消息,另一个可能响应到支付消息,而还有一个可能作为默认的“catch all”函数,当其他选项都不匹配时使用该函数。

可以通过在测试关联性选项卡区域指定消息桩接收的消息:

您可以配置关联性的其中一个类型、多类型,或者配置为没有关联性。如果配置为没有关联性,则将处理消息中的所有内容。 

 自定义测试关联性基于自定义方法的返回值。要求:

  • 方法必须携带 0 或 1 个参数。
  • 可选参数的类型是 com.parasoft.api.ScriptingContext
  • 方法可以使用 ScriptingContext 对象访问传输头文件、URL 参数和传入消息的消息内容。

CorrelationScriptingHookConstants 的更多信息可在 Javadocs 中找到(请选择 Parasoft> 帮助,然后查找名为“Parasoft SOAtest Extensibility API”的手册)。

例如,如果想测试基于正则表达式的纯文本消息,可以使用:

 from com.parasoft.api import CorrelationScriptingHookConstants  
 from java.lang import *
 def match(context):
   strMessage = context.get(CorrelationScriptingHookConstants.MESSAGE_STR)   
   return String(strMessage).matches("myRegularExpression")

如果想测试 XML 消息中的元素,可以使用:

from com.parasoft.api import CorrelationScriptingHookConstants from org.w3c.dom import *
from javax.xml.parsers import *
from javax.xml.xpath import *
from java.io import *
from java.lang import *
def match(context):
  xmlDocument = context.get(CorrelationScriptingHookConstants.MESSAGE_DOM)   
  if xmlDocument != None:
    xPathFactory = XPathFactory.newInstance();
    xpath = xPathFactory.newXPath()
    expression = xpath.compile("//*[local-name(.)='someElement' and namespace-uri(.)='someNamespace'][1]/text()")
    elementValue = expression.evaluate(xmlDocument)
    return String(elementValue).matches("myRegularExpression")
  return 0

传输关联性

配置传输关联性:

  1. 请选择启用关联性复选框。
  2. 点击添加按钮。将显示一个新的条目行。
  3. 输入要指定的消息关联的名称

请求体关联性

若要配置请求体消息关联性:

  1. 请选择启用关联性复选框。
  2. 点击编辑按钮。将显示一个编辑 Xpath 函数对话框。
  3. 元素树选择元素,从函数下拉菜单选择函数,然后点击 OK

URL 参数关联

若要配置 URL 参数关联性:

  1. 请选择启用关联性复选框。
  2. 点击添加按钮。将显示一个新的条目行。
  3. 输入要指定的关联的参数名

数据源关联性选项

数据源关联性选项卡允许指定要在桩响应中使用的数据源行值。

优点

配置具有多响应模式的桩的一个方法是手动配置消息桩工具的模式,根据传入消息的性质发送不同的响应消息。 

配置桩以动态响应所需消息的另一种方法是使用数据源。您可以轻松地填充数据源表(Excel 等),其中每行包含想要桩响应的传入消息(通常只需叶节点值)中的值,然后,另一列指定当满足指定条件时,您希望桩如何响应(详情请参阅使用现有数据源或快速创建响应的数据源)。在那之后,您可以配置请求响应消息值之间的映射以及数据源中的列。  

这样就可以在一个易于编辑的表(数据源)中轻松配置请求/响应用例,并在此对它们进行管理,以便随着消息数量的增加而进一步扩展,而且还能为响应消息提供更大的灵活性(因为表单输入允许您将某些值固定化,将其他值参数化,将某些值自动或甚至脚本化)。

这个数据源关联非常灵活。您可以配置桩,以超出精确的匹配/关联的规则和逻辑响应传入的请求值。例如,可以配置桩对信用卡号的最后 4 位数、小于或大于给定值的数值或其他模式和表达式进行计算。 

值匹配支持通配符 * 和 ?。例如,如果想要命名为“title keyword”的传入值来匹配只要包含单词 Linux 的某一行,则可以使用数据源值 "*Linux*"。* 匹配 0 或多个字符;? 匹配单个字符。

配置

若要参数化来自数据源的桩响应:

  1. 请确保在 SOAtest 中配置了数据源,并可用于消息桩。
  2. 数据源关联性选项卡中相应位置点击添加按钮,提供 Xpath 和/或 URL 参数,然后选择合适的列名。在执行部署的桩时,SOAtest 将从请求中提取特定值,然后在指定列中搜索与提取值对应的匹配项。如果找到匹配项,将使用相应数据源行中的数据填充响应
  3. 通过引用同一数据源中的其他数据源列(例如,表单输入、表单 XML 等),对消息桩的响应区域进行参数化。您可以向列名映射中添加多个 XPath 或 URL 参数。

处理详情

消息桩在测试套件中或者作为托管桩执行时,传入消息将通过这些 Xpath 表达式/URL 参数进行评估。然后根据相应的数据源值匹配这些值(每个都有其各自的列)来找到匹配该值的行。 

一系列匹配尝试将每个值匹配到相应的数据源行。如果在匹配尝试结束时未找到匹配项,则引擎将移至数据源中的下一行。如果在任何行中均未找到匹配项,则返回错误。  

匹配尝试按以下顺序进行:

  1. 精确/字面量字符串匹配
  2. 与通配符 * 匹配,* 表示零个或多个字符。例如,Linux* 匹配 "Linux"、"Linux Administration" 或 "Linux Administration Handbook"。
  3. 通过将数据源值字符串作为正则表达式进行处理来进行匹配。例如,这允许 abc-\d{3}-123 与任何如 abc-576-123, abc-000- 123 等的输入值匹配(中间部分是任何三位数字)。
  4. 通过将数据源值和正在评估的传入值作为数值进行处理来进行匹配。例如,这允许 10 与 10.0 匹配。
  5. 通过将传入值和数据源单元格值作为带有比较符的数值进行处理来进行匹配。允许的运算符有:<, >, <=, >=, != or <>.例如,如果提供的数据源值为 <= 14.99,则小于或等于 14.99 的传入值将与该特定值匹配。

如果消息桩的数据源关联列表中指定的所有值都匹配在该行中,则数据源行被视为是匹配的。

如果找到匹配的行,则该行将用于消息桩响应消息中的任何参数化值。通过这种方式,桩可以根据传入消息中的值响应所需的消息值。 

附件选项

附件选项卡允许您在不使用脚本的情况下发送二进制或 XML 附件。若要发送附件,请执行附件选项卡中的以下操作:

  1. 点击添加按钮。将在附件表中显示一个 XML 附件条目。
  2. 双击 XML 附件条目。将显示一个编辑附件对话框。
  3. 在编辑附件对话框中,从模式下拉菜单中选择 XML二进制

XML 模式有以下选项:

二进制模式有以下选项:

服务选项

服务选项选项卡允许配置处理消息的方式。可选择以下选项:

添加自定义头部

若要添加自定义头部:

  1. 请点击服务选项选项卡中的添加按钮。将打开一个对话框。
  2. 输入要指定的消息关联的名称
  3. 点击 OK

使用现有数据源或快速创建响应的数据源

在数据源中指定响应值是添加大量请求/响应对非常有效的一种方式。

使用现有数据源

如果已经拥有为请求参数和需要的相应参数指定值的数据源,则可以按如下方式使用这些值:

  1. 将数据源添加到 SOAtest。
  2. 使用合适的请求列配置消息桩的数据源映射(如Data Source Correlation Options中所述)。

快速创建数据源

如果没有这样的数据源,但又想要一个快速方法来指定多个请求/响应集。

  1. 根据生成用于填充消息元素的数据源模板中所描述的步骤,从消息桩工具的表单输入视图创建 CSV 文件。数据源将会生成并添加到响应器套件中。这个生成的数据源将包含响应的列。消息桩工具的表单输入视图将自动参数化。
  2. 为每个应该用于确定响应的请求参数添加新的数据源列(如,使用 Excel、OpenOffice 或相似的工作表应用程序)。可使用通配符。
  3. 使用添加的新请求列配置消息桩的数据源映射。详情请参阅Data Source Correlation Options
  4. 向数据源中(如,使用 Excel、OpenOffice 或相似的工作表应用程序)添加新的行,以便为请求参数和需要的相应的响应参数指定值。

使用脚本化逻辑

可以根据传入请求编写响应值的脚本。这允许对桩使用更复杂的逻辑。此外,消息桩允许通过脚本访问数据源值。访问这些值类似于通过扩展工具对它们进行访问。

对于如何使用在消息桩工具中使用脚本化逻辑,这里有个示例:

  1. 在消息桩工具的定义选项卡中输入服务定义。
  2. 右键点击消息桩节点,然后选择添加输出。将显示添加输出向导。
  3. 在添加输出向导中,从左窗格选择传入请求,右窗格选择 XML 数据库,然后点击完成
  4. 双击消息桩节点下的传入请求> XML 数据库节点。XML 数据库配置面板将显示在右侧 GUI 面板中。
  5. 在右侧 GUI 面板中,添加想要在脚本中访问的值的 XPath。



  6. 双击消息桩节点。消息桩配置面板将显示在右侧 GUI 面板中。
  7. 消息选项卡中,请选择脚本化视图。
  8. 启用使用数据源选项。



  9. 指定逻辑。以下是访问数据源和数据库值的基本模板:

    def customLogic(context):
        # Retrieve the data source value. "Data Source Name" should be replaced
        # with the name of your data source and "Column Name" should be the column
        # that your value is coming from. You can access many columns from the same
        # data source within this script. For Data Bank values, the table is always
        # named "Generated Data Source" so you only need to replace "Data Bank Column Name"     
        dataSourceValue = context.getValue("Data Source Name", "Column Name")     
        dataBankValue = context.getValue("Generated Data Source", "Data Bank Column Name")     
        # add custom logic that uses value from data source




  10. 方法组合框中选择合适的方法。您选择的方法应该是您的入口点。在上述示例中,方法是 customLogic()

向消息桩添加附件处理程序

将附件处理程序添加到消息桩中以在发送消息附件时测试附件处理可能会很有用。若要向消息桩添加附件处理程序:

  1. 请选择消息桩节点并点击添加测试或输出按钮。将显示添加输出向导。
  2. 在添加输出向导中,从左窗格选择传入附件,右窗格选择附件处理程序,然后点击完成
  3. 双击附件处理程序节点,然后在工具配置面板中对工具进行配置。
  4. (可选项)选择消息桩节点下的附件处理程序节点,然后点击添加测试/添加输出按钮。将显示添加输出向导,您可以从中添加一个写入文件工具,将附件作为二进制文件输出。