本主题解释了如何提示 SOAtest 扫描 web 应用程序。然后可以对访问的页面执行静态分析,如 执行静态分析中所述。
本章节包括:
扫描测试是执行测试用例时抓取指定 web UI 的测试。若要配置 SOAtest 扫描 web UI,则如下添加扫描测试:
如果选择 FTP 或 Local,请填写可用字段,然后才能完成配置。可以跳过以下选项:
在指定 FTP 源时,存在以下选项:
|
如果 URL 的用户名和密码作为‘*’输入,则 SOAtest 将首先尝试使用最近 URL 的相同凭证,最近 URL 与此 URL 前面并属于同一个域的。如果该凭证没有用于此 URL,则 SOAtest 将打开域密码对话框,询问您输入的凭证是否正确?
.urls 文件的格式为:URL 在单独行上指定;如果为 URL 指定凭证,则它必须按照 url 的顺序放在同一行:url、username、password。Url、user-name、password 以逗号分割。如果三个中的任何一项存在逗号,则该项都必须放在一对双引号内。如果任何项包含双引号,则每个双引号必须使用另一个双引号进行转义,并且将所有项放在双引号内。例如, |
http://www.parasoft.com
可能拥有别名 parasoft.com
和 www.parasoft.com
。现在可以在测试套件或单个扫描工具上运行任何可用的测试配置。执行测试时,SOAtest 会快速浏览静态和动态页面,并至少加载它遇到的每个页面的一个实例。
如果选择了推荐的 HTTP 配置选项,并且您的站点包含表格,则 SOAtest 允许您使用表单输入对话框填充表单。如果在 SOAtest 加载您的站点时打开表单输入对话框,则请按照 Populating Forms中所述将其完成。
本章节解释了如何处理以下特殊的加载问题:
可以通过在 Allowed/Restricted URLs 表中添加限制和/或允许来控制 SOAtest 可以加载哪些站点 URL 和忽略哪些站点 URL。
如果 URL 标记为受限制,则 SOAtest 将不会加载在扫描期间遇到的 URL。如果不希望 SOAtest 访问某些目录或文件,您可以将它们标记为受限制 URL。例如,如果您有一个输出页面,则您可能希望将其标记为受限制,以便它不会阻止加载其他页面或导致其他页面无效。SOAtest 在创建路径、使用虚拟用户使用站点等时,避免了受限制的 URL。如果站点有一个 Web 服务器资源,则可以在加载该站点之前指定受限制的 URL(如本章中所述)。
如果 URL 标记为受允许,则 SOAtest 将加载在扫描期间遇到的 URL。对于Start URL 字段中指定的 URL,最深目录 URL 模式自动添加为受允许的 URL;此处使用的 URL 被称为 Allowed Subdirectories URL. http(s)://... ,以便允许或限制指定 URL 的 HTTP 和 HTTPS 版本。有关更多详情,请查阅 URL Restriction Examples。
还可以指定其他受允许的 URL。对于配置 SOAtest 来加载 相关站点,这一点特别有用。相关站点是链接到其中一个项目站点的任何站点,但没有与项目站点相同的主机名。例如,您的主要项目来源是 http://www.parasoft.com
,并且该站点链接到 http://forums.parasoft.com
和 http://www2.parasoft.com
,这两个站点都是当前项目的相关站点。如果希望 SOAtest 在当前项目上下文中遇到相关站点时自动它们,则需要指明它们是受允许的 URL。
限制和允许都是在扫描工具的 Allowed/Restricted URLs 表中指定的。在表中,使用符号 + 来标记允许,使用符号 - 来表示限制。允许/限制都区分大小写。
可以将限制和允许结合起来创建一个复杂的扫描方案。按照顺序对允许/限制进行处理,在表顶部启用条目,在表底部停止条目。
若要将条目添加到 Allowed/Restricted URLs 表中:
*
” 意味着任何字符组合。它适用于构造 Allowed/Restricted URLs 表条目的任何组合方式。有关示例,请查阅 Wildcard Examples 。不匹配受允许 URL 模式的 JavaScript 和 CSS 文件将不会在项目树中显示。然而,如果 SOAtest 需要访问这些文件来正确处理 Web 页面,则它将访问这些文件(即使它们不会被添加到该项目中)。 |
若要更改 Allowed/Restricted URLs 表条目的位置:
若要删除 Allowed/Restricted URLs 表条目:
下面的例子解释了关于 http(s)://... 限制的一些细节:
http(s)://www.google.com/*
http://www.google.com/amazing_page.html
和 https://www.google.com/amazing_page.html
http(s)://
” 在 URL 限制中除了在开头外没有意义。例如,不可能有以下的限制:http(s)://www.google.com/*
,并让其匹配 http://www.google.com/amazing_page.html
http(s)://
” 区分大小写。因此,不可能:HTTP(S)://www.google.com/*
,并让其匹配 http://www.google.com/amazing_page.html
http(s)://
" ,而不是字符串的其他部分。例如,不可能有以下的限制:http://www.para(s)oft.com/*
,并让其匹配 http://www.parasoft.com/*
或 http://www.paraoft.com/*
下表显示了如何使用通配符来实现不同的目标:
若要匹配这个... | 使用类似这样的条目... |
---|---|
任何协议 | *www.parasoft.com/dir1/dir2/index.html |
HTTP 或 HTTPS 协议 | http(s)://www.parasoft.com/dir1/dir2/index.html |
域中任何页面 | http://www.parasoft.com/* |
最深子目录中的任何页面 | http://www.parasoft.com/dir1/dir2/* |
域中任何协议和页面 | *www.parasoft.com/* |
任何 index.html 的页面名称 | *index.html |
任何与‘dir’一词相关的链接 | *dir* |
任何链接 | * |
*.parasoft.com
将匹配 www.parasoft.com
和 articles.parasoft.com
。
*Parasoft*
将匹配 www.parasoft.com
、 www.parasoft.net
、 parasoft.com 等。
direc*ry/*
将匹配 directory/dir2
、 direcHELLOry/dir2/dir3
和 direc12345fry/images
。
项目扫描和更新期间,每个可能的 URL 都与 Allowed/Restricted URLs 表匹配,以确定是否应该访问 URL。确定 URL 是否应该访问的过程如下:
Allowed/Restricted URLs 表(如 Preparing SOAtest to Restrict and/or Allow URLs During Scanning中所述)允许控制站点的哪些部分被扫描。例如,它允许在允许扫描的部分站点内将某些 URL 指定为“禁区(off-limits)”。或者,允许在不应被扫描的站点区域内对特定 URL 进行扫描。
URL http://www.dev.parasoft.com/products/dir/page.html
将匹配来自上表的以下 URL:
+ http(s)://www.dev.parasoft.com/* - http(s)://www.dev.parasoft.com/products/* + http(s)://www.*.com/products/dir/* |
最后一个匹配的 URL 是 http(s)://www.*.com/products/dir/*
。因为该 URL 的符号为正(+,表示允许访问该 URL),将允许URL http://www.dev.parasoft.com/products/dir/page.html
。
URL http://www.dev.parasoft.com/products/soap.html
将匹配来自上表的以下 URL:
+ http(s)://www.dev.parasoft.com/* - http(s)://www.dev.parasoft.com/products/* |
最后一个匹配的 URL 是 http(s)://www.dev.parasoft.com/products/*
。因为该 URL 的符号为负(-,表示该 URL 受到限制),将限制 URL http://www.dev.parasoft.com/products/soap.html
。
站点 http://www.dev.parasoft.com
有关于几千种类型的硬件。希望将站点扫描限制为两种类型的硬件:路由器和磁盘。除了站点的旧部分,还希望处理站点的所有其他部分。
若要对 URL http://www.dev.parasoft.com/index.html
进行扫描,请在 Start URL 字段输入该 URL。
将自动添加受允许的 URL 到 Allowed/Restricted URLs 表中:
+ http(s)://www.dev.parasoft.com/* |
若只扫描 hardware
目录中的两个文件夹 Routers
和 Disks
,则需要将以下条目按照下面的顺序添加到表中:
- http(s)://www.dev.parasoft.com/newdir/hardware/* + http(s)://www.dev.parasoft.com/newdir/hardware/Routers/* + http(s)://www.dev.parasoft.com/newdir/hardware/Disks/* |
若要限制对旧目录的扫描,则需要添加以下条目。
- http(s)://www.dev.parasoft.com/olddir/* |
这就是完成操作后表格的样子。
当选中 Restrict scanning to deepest subdirectory of Start URL Http 扫描选项时,SOAtest 将自动启用 URL,为最深子目录创建一个允许访问的 URL,并将其添加到 Allowed/Restricted URLs 表中第一行。如果清除了该选项,SOAtest 将自动将默认允许的子目录 URL 添加到 Allowed/Restricted URLs 表中第一行。在第一重定向到具有相同完全限定域名的 URL 时,SOAtest 也会这样做。
例如:
开始路径 | 子目录限制 |
---|---|
http://www.parasoft.com/dir1/dir2/ | + http(s)://www.parasoft.com/dir1/dir2/* |
http://www.parasoft.com/dir1/dir2 | + http(s)://www.parasoft.com/dir1/* |
http://www.parasoft.com/dir1/page.html | + http(s)://www.parasoft.com/dir1/* |
http://www.parasoft.com/dir1/page.html?count=1 | + http(s)://www.parasoft.com/dir1/* |
如果特定的Start URL 为重定向,则 SOAtest 将加载其重定向和任何连续的后续重定向。此外,SOAtest 将自动为每个重定向添加一个允许的子目录 URL。重定向的所有添加条目都将被添加到 Allowed/Restricted URLs 表的顶部。
如果希望 SOAtest 遵循未添加为“允许 URL”的重定向,则选择 Follow redirects not specified as restrictions in the table 选项。当选中此选项时,如果 SOAtest 在扫描期间遇到了重定向,并且该重定向未在 Allowed/Restricted URLs 表中指定,则它将被加载。SOAtest 将为重定向到 Allowed/Restricted URLs 表添加一个允许的子目录 URL。
加载包含 JavaScript 的站点之前,请验证是否启用加载 JavaScript 选项。(该选项默认启用)。当启用该选项时,SOAtest 将执行 JavaScript 并加载相关链接、
若要验证该选项是否启用:
如果希望自定义 SOAtest 如何模拟 JavaScript 事件(如打开和关闭其他窗口、运行计时器等),可以通过在选项卡中更改 JavaScript 选项实现这一点。使用以下表来确定选择哪些选项。
为此... | 使用这些设置... |
---|---|
使用默认参数提示 SOAtest 触发每个处理程序一次。 | 在模拟 JavaScript 事件框中选择 single time 。 |
在加载站点(以便发现新链接)时提示 SOAtest 创建多种类型的事件。 | 在模拟 JavaScript 事件框中选择 multiple times 。 |
防止 SOAtest 模拟 JavaScript 事件。 | 在模拟 JavaScript 事件框中选择 never 。 |
每次在 SOAtest 扫描站点时遇到 JavaScript 警告、确认和提示信息时,它都会将消息打印到结果区域(在右侧 GUI 面板),并执行默认操作。SOAtest 默认打印以下消息并执行下面的操作:
JavaScript 消息 | SOAtest 消息 | 默认的 SOAtest 操作 |
---|---|---|
JavaScript 警告 | JavaScript 警告:"message" | 单击 OK 按钮 |
JavaScript 提示 | JavaScript 提示:"message" | 单击 Cancel 按钮 |
JavaScript 确认 | JavaScript 确认:"message" | 单击 Cancel 按钮 |
如果希望 SOAtest 以不同方式处理这些信息,您可以使用脚本定义自定义行为。有关更多详情,请查阅 Customizing Scanning with Scripting Hooks 。
如果选择了 Fill Active Inputs Manually HTTP 配置面板多选框(默认启用),则 SOAtest 会在每次检测要求用户输入的表单打开一个表单输入对话框。如果希望 SOAtest 分析表单提交后返回的页面,则需要告诉 SOAtest 如何填充表单不同的输入元素(文本字段、多选框、单选框等)。可以通过在加载过程中在这些对话框中指定固定输入来实现这一点。
不需要为每个表单添加测试输入。我们推荐您只添加需要访问站点所有主要区域的输入;可以根据需求跳过对话框。而且,如果 SOAtest 可以在不需要提交特定表单输入时访问所有站点区域,则不需要在加载过程中输入任何表单输入。
若要指明您不希望输入任何表单的信息:
若要输入某个或所有表单的输入:
为此... | 执行该操作... |
---|---|
标记输入提交。 | 在 Form Test Name 字段中输入新名称。 |
输入当前表的信息。 |
添加输入后,SOAtest 会重新打开相同的表单对话框,以便可以输入其他的信息。 |
指明不希望输入当前表单的任何其他信息: | 单击 Skip。 |
指明您不希望输入当前表单或任何该表单的其他实例的任何其他信息: | 单击 Skip Form。 |
指明您不希望在该站点中输入表单的任何其他信息: | 单击 Skip All。 |
浏览到与当前表单相关联的页面。 | 单击 View。 |
如果您的站点使用表单,并且您希望 SOAtest 加载并测试这些表单提交后返回的页面,则需要告诉 SOAtest 如何填充表单不同的输入元素(文本字段、多选框、单选框等)。要测试的页面实例越多,则需要填充表单的信息就越多。
填充表单有两种方法:
若要添加或更改 SOAtest 打开的表单输入面板中的固定输入:
pre123post
中提取值 123
,则可以在 左侧的 text 字段中输入 pre,在 右侧的 text 输入 post
。如果 SOAtest 访问了需要身份验证的页面,则将打开一个密码对话框,需要您输入有效用户名和密码。
在合适的字段中输入有效的用户名和密码,请指定是否希望 SOAtest 在该项目文件中保存密保,然后单击 OK。
使用 Allowed/Restricted URLs 表决定了应该扫描网页的哪个部分。在自动 web 项目扫描期间,每个可能的 URL 都与 Allowed/Restricted URLs 表匹配,以确定是否应该访问 URL。确定 URL 是否应该访问的过程如下: 1.在 Allowed/Restricted URLs 表中找到最后一个匹配的 URL。 该机制允许控件决定要扫描网页的哪个部分。例如,它允许在允许扫描的部分站点内将某些 URL 指定为“禁区(off-limits)”。或者,它允许在不应该扫描的部分网站内扫描其他 URL。 注意:Allowed/Restricted URLs 表条目区分大小写。 |
可以,通配符星号(*)可以在 URL 中的任何位置使用,以匹配 0 个或更多字符。星号(*)适用于构造 Allowed/Restricted URLs 表条目的任何组合方式。 使用星号(*)的例子:
|
允许域 URL 告诉 SOAtest 加载域中所有页面。例如,如果您的站点为 将加载扫描期间域中任何链接,如 当输入Start URL 时,允许域 URL 将自动添加到 Allowed/Restricted URLs 表中。 |
您将需要将条目添加到 Allowed/Restricted URLs 表中来控制该内容是否扫描。如果您的 web 站点有几千种类型硬件的信息,则您可能希望限制扫描该站点两种类型的硬件:路由器和硬盘。除了站点的旧部分,还希望处理站点的所有其他部分。 例如:
添加上述 URL 之后, Allowed/Restricted URLs 表应包含以下内容:
有关更多详情,请查阅 准备 SOAtest 在扫描期间限制和/或允许 URL 。 |
若要允许在扫描站点期间加载其他网站,则需要外部不站点添加到 Allowed/Restricted URLs 表中。可以添加一个星号(*)作为允许 URL 以允许要加载的所有站点。 |
当您Start URL 时,SOAtest 将自动将允许域限制(如 使用 如何希望将扫描限制为站点的非加密版本或加密版本,则可以将删除星号,或者使用 ' |
根据 Allowed/Restricted URLs 表检查重定向,以确定是否遵循它们。 |
URL 自动添加到 Allowed/Restricted URLs 表有两种情况:
|
如果特定的Start URL 为重定向,则 SOAtest 将加载其重定向和任何连续的后续重定向。此外,SOAtest 将自动为每个重定向添加一个受允许的 URL。这些受允许的 URL 将添加到 Allowed/Restricted URLs 表中。 有关更多详情,请查阅 准备 SOAtest 在扫描期间限制和/或允许 URL 。 |
如果站点包含注销页面,它可能导致 SOAtest 停止扫描。如果 SOAtest 遇到这种类型的页面,SOAtest 将注销该用户。这将造成其他页面不可访问,因为用户已经不存在。可以通过限制注销页面的加载来防止扫描期间发生这种事。 可以将用于包含注销事件的页面的 URL 限制添加到 Allowed/Restricted URLs 表中。例如,如果注销页面是 |
每次 SOAtest 检测要求用户输入的表单时都会打开一个表单输入对话框。 有关更多详情,请查阅 填充表格 。 |
在扫描期间,SOAtest 会模拟以下技术的执行:
注意,上表主要关注支持扫描的技术。它与支持静态分析的技术有所不同。 |
可以通过在 SOAtest 项目中发生与“挂钩”相关联的事件时执行自定义脚本,进而自定义 SOAtest 的扫描行为。
自定义的 hooks 可用来记录或更改扫描工具执行(例如,警示对话框打开时、提示用户进行响应时、提示用户输入密码时等)过程中特定点上传递的值。
例如,其中一个 SOAtest 的挂钩是“Alert”挂钩。在 SOAtest 的扫描工具遇到 JavaScript 警告的 任何时候都会调用该挂钩。如果希望 SOAtest 记录这个警告信息并在 SOAtest 消息窗口中报告它,则可以通过创建脚本实现这一点。该脚本定义该挂钩,然后说明了在 SOAtest 遇到该挂钩时希望它如何表现。调用此脚本后,在每次 SOAtest 遇到 JavaScript 警告时,它都将访问它,并且执行特定操作(记录和报告警示信息)
挂钩在脚本中使用自定义方法定义和自定义。同一个文件可以定义多个挂钩。如果向一个挂钩添加多个方法,则在调用该挂钩时将执行该挂钩定义的所有方法。
您可以以在 SOAtest中创建、应用和调用其他脚本相同的方式创建、应用和调用脚本:在启动时(只针对 JavaScript 和 Jython 脚本),通过创建和应用扩展工具,通过向特定路径节点添加脚本来定义挂钩。您可以在不同的时间调用挂钩以引出所需的功能。例如,如果想要将脚本的挂钩功能应用于所有项目和网址,则可以将定义并使用该挂钩的 JavaSCript 或 Jython 脚本添加到 <soatest_install_dir>/plugins/com.parasoft.xtest.libs.web_<soatest_version>/root/startup directory
目录;然后,任何调用该挂钩的时候,都将执行相关联的用户指定方法。将会一直执行该方法,直到调用该挂钩上的 clear()。
有关常用挂钩选项的完整说明,请查阅 SOAtest 扩展 API。选择 Parasoft> 帮助,然后查询标题为 "Parasoft SOAtest Extensibility API” 的书。
SOAtest 允许在脚本中定义和操作以下特定挂钩:
当 SOAtest 遇到 JavaScript alert() 方法时,其默认的行为是单击 OK 按钮,然后打印 JavaScript Alert:
"message”
到 SOAtest 控制台视图中。可以通过 Alert 挂钩更改此行为。
在 SOAtest 遇到 JavaSrcipt 警告时,默认调用 Alert 挂钩。通过将方法添加到该挂钩,可以确定在 SOAtest 遇到 JavaScript 警告时会如何表现。调用 Alert 挂钩时,SOAtest 将打印消息 JavaScript Alert:
“message”
到脚本中指定的位置中,或者到 SOAtest 控制台视图中(如果没有指定替换位置)。
该挂钩通常用来将警告信息结果打印到特定的 SOAtest 消息窗口。例如,如果希望 SOAtest 在 SOAtest 消息窗口(名称为 Alert Messages)中打印所有警告消息,则可以创建以下 Jython 脚本并将其添加到 <soatest_install_dir>/plugins/com.parasoft.xtest.libs.web_<soatest_version>/root/startup
目录:
from com.parasoft.api import Application def myAlertHook(msg): # Print the alert message to SOAtest Messages Application.showMessage(" JavaScript Alert: %s" % str(msg)) # Add the contents of the alert message to a Result Window named # "Alert Messages". This ResultWindow can later be used # as part of a test suite in a regression test, to make sure the # contents of the window, which contains the alert message, # are what you expect them to be. Application.report("Alert Messages", str(msg)) # Add your method to the Alert Hook Application.getHook("Alert").set(myAlertHook) |
传递到方法 myAlertHook 的参数将是警告消息。它是一个字符串,是警告包含的消息。
也可以在用户(SOAtest)提交某个无效的表单值时使用 Alert 挂钩对它进行验证,应用程序会打开一个警告框,警告输入的数据无效。若要实现该测试,则首先创建并调用一个脚本(就像上面这个),改脚本将警告消息记录到 SOAtest 消息窗口中。然后,实现测试套件,该套件检查使用以下测试用例检查消息窗口的内容。
#Script to return text of result window named "Alert Messages" from soaptest.api import * def return(): return SOAPUtil.getResultWindowText("Alert Messages") #Script to clear text of result window named "Alert Messages" from soaptest.api import * def clear(): SOAPUtil.clearResultWindow("Alert Messages") |
当 SOAtest 遇到 JavaScript confirm() 方法时,其默认的行为是单击 Cancel 按钮,返回 false
,然后打印 JavaScript Confirm:
"message”
到 SOAtest 控制台视图中。当 SOAtest 遇到 JavaScript prompt() 方法时,其默认的行为是单击 Cancel 按钮,返回 null
,然后打印 JavaScript Prompt:
"message”
到控制台视图中。可以通过使用脚本更改这些行为来定义并自定义 Confirm 挂钩或 Prompt 挂钩(具体使用的挂钩取决于要更改哪个 JavaScript 方法的返回值)。
确认
通过自定义 Confirm 挂钩,可以确定在 SOAtest 遇到 confirm() 方法时会如何表现。
例如,在 SOAtest 遇到 confirm() 方法执行以下步骤的任何时候,提示它返回一个自定义(非默认)响应的一个方法:
首先,创建 Jython 文件(命名为 startup.py),它定义只接受一个参数的方法。该参数的值与 JavaScript 中传递给 confirm() 方法的值相同。根据您所需的逻辑,确定希望 confirm() 返回“true”还是“false”,然后从定义的方法返回该值。若要让 SOAtest 使用您刚刚定义的方法,则通过以下方法将其添加到 Confirm 挂钩,其中传递给 set
的参数是您定义的方法的名称。在这个例子中,定义的方法命名为 myConfirmHook。
from com.parasoft.api import Application # msg will have the same value that gets passed to confirm() def myConfirmHook(msg): if msg == "Yes or no?": return 1 return 0 Application.getHook("Confirm").set(myConfirmHook) |
接着,将该文件添加到 <soatest_install_dir>/plugins/com.parasoft.xtest.libs.web_<soatest_version>/root/startup
目录。下次启动 SOAtest 时,它将在遇到 confirm() 方法时执行上述脚本。
调用 Confirm 挂钩时,SOAtest 将打印以下消息(取决于确认操作)到脚本中指定的位置或控制台视图中(如果没有指定替换的位置):
根据脚本,SOAtest 单击了“OK”按钮。
根据脚本,SOAtest 单击了“CANCEL”按钮。
提示
通过自定义 Prompt 挂钩,可以确定在 SOAtest 遇到 prompt() 方法时会如何表现。
Prompt 挂钩 和 Confirm 挂钩具有非常相似的工作原理。两者间的不同,其中一个是 Prompt 接收两个参数,并将其传递给 prompt() JavaScript 方法。另一个是为 Confirm 定义的方法返回的是一个布尔类型,但是为 Prompt 定义的方法返回的是一个字符串或者“null”(在 Jython 中为“None”)。
可以定义逻辑来确定返回值是否基于传递给 prompt() 方法的参数。调用 prompt() 方法时返回“null”等价于在浏览器打开的提示框中点击 Cancel 按钮。使用与您为 confirm() 添加自定义方法相同的方式将该方法添加到合适的挂钩中,但此时挂钩命名为“Prompt”。下面是一个例子,返回 "http://www.parasoft.com” 的脚本作为 prompt() 的值:
from com.parasoft.api import Application def myPromptHook(msg, defaultMsg): return "http://www.parasoft.com" Application.getHook("Prompt").set(myPromptHook) |
调用 Prompt 挂钩时,SOAtest 将打印其中一条以下消息(取决于提示响应)到脚本中指定的位置或控制台视图中(如果没有指定替换的位置):
根据脚本,SOAtest 输入了 "[message- string that the script returns]"
根据脚本,SOAtest 单击了“CANCEL”按钮。
返回不同情况下的不同值
可以通过将合适的逻辑添加到为 Confirm 或 Prompt 挂钩定义的方法中,以使 SOAtest 返回不同情况下的不同 confirm() 或 prompt() 值。通过使用要添加到 Confirm 或 Prompt 挂钩的方法的第一个参数文本来确定返回的值。例如,您可能希望 SOAtest 返回提示“Enter a URL”的 http://www.parasoft.com
,但返回的却是提示“Enter your name” John
。该功能可以如下实现:
def myPromptHook(msg, defaultMsg): if msg == "Enter a URL": return "http://www.parasoft.com" elif msg == "Enter your name": return "John" else: return None |
当以下所有条件都满足时,调用 Realm Password 挂钩:
如果在满足上述条件之前定义了自定义 Realm Password 挂钩,则 SOAtest 将在提示您手动输入密码之前会执行自定义挂钩。如果该方法添加了密码(到项目中的站点,或者是到负载测试虚拟用户),则 SOAtest 将使用该密码,并不会在提示您提供密码。如果您或其他 SOAtest 用户以前输入过密码,则将不会执行该挂钩。如果要确保 SOAtest 使用您为该挂钩定义的密码,则应该在希望 SOAtest 添加挂钩的新密码之前清除掉站点密码。
在您希望根据特定上下文(如,基于正在使用的特定路径,或者希望在虚拟用户负载测试上下文中使用不同的用户名和密码)更改用户名和密码时,此挂钩特别有用。
下面的示例 Java 文件时 Realm Password 挂钩的一个非常基本的示例实现。无论上下文如何,该脚本都添加相同的密码。
import com.parasoft.api.*; import java.lang.reflect.*; import java.net.*; import soaptest.api.*; public class RealmPasswordHook { static public void returnPassword(String realm, String url, boolean ntlm, Context context) throws MalformedURLException { SOAPUtil.addSitePassword(realm, "user1", "password1", url, ntlm); } public void setHook() throws UserMethodException, NoSuchMethodException { Hook hook = Application.getHook("RealmPassword"); Method userMethod = getClass().getMethod("returnPassword", new Class[] {String.class, String.class, boolean.class, Context.class}); hook.set(userMethod); } } |
以下 Jython 示例文件类似于以前的 Java 文件,不同的是它在访问 Realm Password 挂钩时会清除所有现有密码。
from com.parasoft.api import * from soaptest.api import * def returnPassword(realm, url, ntlm, context): SOAPUtil.addSitePassword(realm, "user1", "password1", url, ntlm) def setHook(): hook = Application.getHook("RealmPassword") hook.set(returnPassword) // Remove all previous passwords to the new one being added above is the one that gets used. SOAPUtil.removeSitePasswords() |
以下示例说的是,在访问该挂钩时,JavaScript 文件删除现有域密码,然后在执行虚拟用户负载测试时,根据当前访问的 URL 提交密码。
// This method uses a different password based on the URL. var Application = Packages.com.parasoft.api.Application function returnPassword(realm, url, ntlm, context) { Packages.soaptest.api.SOAPUtil.removeSitePasswords() // Adds password to a virtual user in load test if (url.indexOf("http://toad.parasoft.com:90" == 0) { Packages.soaptest.api.SOAPUtil.addSessionPassword(realm, "user1", "password1", url, ntlm, context) } else { Packages.soaptest.api.SOAPUtil.addSessionPassword(realm, "user2", "password2", url, ntlm, context) } } function setHook() { var hook = Application.getHook("RealmPassword") hook.set(returnPassword) Packages.soaptest.api.SOAPUtil.removeSitePasswords() } |
|
每次 SOAtest 访问 URL 时,调用 URL Logging 挂钩。它可以用来提示 SOAtest 打印访问的每个 URL。
附加到该挂钩的方法接收 3 个或 4 个参数。第一个参数应该是一个字符串类型,指定访问的 URL。第二个参数应该是使用 URL 提交的任何 POST 数据(它可能是 NULL)。第三个参数是包含其他请求发送的 HTTP 属性的 java.util.Hashtable
(例如, referer
)。第四个参数(可选项),如果添加到方法签名中,则它是 com.parasoft.api.Context
。
此外,需要阿金 SiteUtil.enableLogging
设置为 true,并将 UrlLogging
传递给 Application.getHook()
例如,如果希望 SOAtest 将每个访问的 URL 打印到控制台视图中,则可以创建以下 Jython 脚本并将其添加到 <soatest_install_dir>/plugins/com.parasoft.xtest.libs.web_<soatest_version>/root/startup
目录:
from com.parasoft.api import * from webtool.site import SiteUtil count = 1 def setHook(): SiteUtil.enableLogging = 1 hook = Application.getHook("UrlLogging") hook.set(loggingHook) def loggingHook(url, post, props): global count if post: Application.showMessage(str(count) + ". " + url + " [POST=" + post + "]") else: Application.showMessage(str(count) + ". " + url) count = count + 1 setHook() |