本课程将介绍一些高级策略,这些策略将帮助您开发更健壮、可重用的测试套件。
本章包含:
创建可重用的(模块化的)测试套件
在许多情况下,您可能希望创建一个可由其他测试套件重用的测试套件。一个常见的示例是登录网站的测试套件。一旦创建了这样的测试套件,其他测试套件就可以在需要登录的各种情况下使用它。
两个 SOAtest 特性对于创建和使用可重用测试套件特别有用:
- 引用的测试套件:一旦创建了可重用模块或测试套件,它就可以被另一个测试套件引用。
- 变量:可以使用变量对测试进行参数化,这些变量可以从中心位置设置为特定值、从测试中提取(例如,通过数据库工具)或从数据源设置。
本课演示如何使用这两个功能来创建和使用可重用的测试套件。为简单起见,我们将使用存储 web 服务;但是,下面的原理和步骤随后可以应用于您创建的任何方案。
若要创建可重用的测试套件:
- 请如下创建名为
ReusableModule.tst
的测试套件(.tst)文件:- 右键单击测试用例资源管理器中的 Examples 项目节点,然后选择 Add New> Test (.tst) file。
- 在 File name下,输入
ReusableModule
。 - 单击 Next。
- 选择 Empty,然后单击 Finish。
- 如下创建一个 SOAP 客户端。
- 展开 ReusableModule.tst 测试用例资源管理器节点。
- 右键单击 Test Suite: Test Suite 节点,然后选择 Add New> Test。
- 在打开的对话框中,选择 SOAP Client,然后单击 Finish。
- 如下配置 SOAP 客户端:
- 在测试配置面板的 WSDL 选项卡中,输入 WSDL URL
http://localhost:8080/parabank/services/store-01?wsdl
。 - 在 Request 选项卡中,将 Operation 设置为 getItemByTitle。
- 将变更保存到 SOAP 客户端工具。
- 在测试配置面板的 WSDL 选项卡中,输入 WSDL URL
- 如下定义变量:
- 双击 Test Suite: Test Suite 节点,打开配置面板的测试套件。
- 在 Variables 选项卡中,单击 Add 按钮。
- 在对话框的 Name 字段,输入
title variable
。 - 将 Type 更改为 String。
- 保持 Use value from parent test suite (if defined)选项。这将允许变量使用在引用此测试套件的测试套件中设置的值。如果选择更改为 Use local value,则变量的值将始终为 Value 字段中指定的值。
- 输入
PowerBuilder
作为 Value。如果 SOQtest 没有找到名为store
且列为title
的数据源,将使用该默认值。 - 然后单击 OK。
- 保存测试套件配置更改。
- 如果可用,将配置 SOAP 客户端测试以使用指定的数据源值,如下所示:
- 在 SOAP 客户端测试配置面板中,跳转至 Request 选项卡,检查 titleKeyword框,然后将 Fixed 更改为 Parameterized。
- 在复合框中选择 title variable 。
- 将变更保存到 SOAP 客户端工具。
- 通过选择 ReusableModule.tst,然后单击 Test 工具栏按钮运行测试套件。
- 双击 SOAP 客户端测试的 Traffic Viewer 节点,查看通讯报文。注意,使用的 titleKeyword 为 PowerBuilder。SOAtest 使用默认的变量值,因为它没有找到指定的数据源(由于我们还未创建)。
- 请如下创建一个名为
TestStoreTitles.tst
的空的测试套件(.tst)文件:- 右键单击测试用例资源管理器中的 Examples 项目节点,然后选择 Add New> Test (.tst) file。
- 在 File name下,输入
ReusableModule
。 - 单击 Next。
- 选择 Empty,然后单击 Finish。
- 如下定义变量:
- 双击 TestStoreTitles.tst> Test Suite: Test Suite 节点,打开配置面板的测试套件。
- 在 Variables 选项卡中,单击 Add 按钮。
- 在对话框的 Name 字段,输入
title variable
。 - 将 Type 更改为 Data Source。
- 输入
store
作为 Data SourceName ,然后输入title
作为 Column Name。
注意,该测试变量将重写引用 .tst 文件中定义的字符串测试变量。
- 然后单击 OK。
- 添加数据源到测试套件中,如下所示:
- 右键单击 TestStoreTitles.tst> Test Suite: Test Suite 节点,然后选择 Add New> Data Source。
- 选择 Table,然后单击 Finish。
- 在数据源配置面板中,将数据源名称更改为
store
。 - 选择 First row specifies column names。
- 添加名为
title
的列。 - 想该列添加两个值:
Linux
和C++
。 - 保存数据源变更。
- 配置该测试套件引用我们在该练习中创建的第一个测试套件,如下所示:
- 右键单击 TestStoreTitles.tst> Test Suite: Test Suite 节点,然后选择 Add New> Test Suite。
- 选择 Reference Test (.tst) File。
- 单击 Next。
- 从 SOAtest 工作空间中选择 ReusableModule.tst 文件。
- 单击 Finish。
- 通过选择 TestStoreTitles.tst,然后单击 Test 工具栏按钮运行当前测试套件。
- 双击 Traffic Viewer 节点,以查看通讯报文。
- 验证是否使用 Linux,然后将 C++ 用作 titleKeyword。
循环直到测试成功或失 - 使用测试流程逻辑
在大多数情况下,您可能希望 SOAtest 在某个条件满足之前反复执行某个操作。测试套件流逻辑允许对此进行配置。
SOAtest 允许您在两种主要的测试流程类型之间进行选择:
- While variable: 在满足变量条件之前,反复执行某个操作。
- While pass/fail: 反复执行某个操作,直到测试套件中的一个测试(或每个测试)通过或失败(取决于“loop util”设置中选择的内容)。注意,如果选择该选项(例如,该选项设置为其中成功之前一直循环),并且满足了整个循环条件(例如,测试成功),则出现故障的测试将标记为成功。 如果没有满足整个循环条件(如,测试没有成功),则失败的单个测试将标记为失败。 无论循环条件是否满足,控制台都将显示哪些测试通过了,哪些测试失败了。
要查看 pass/fail 逻辑如何允许您进行测试套件循环,直到达到指定的价格值。
- 请如下创建一个名为
TestFlowLogic.tst
的空的测试套件(.tst)文件:- 右键单击测试用例资源管理器中的 Examples 项目节点,然后选择 Add New> Test (.tst) file。
- 在 File name下,输入
TestFlowLogic
。 - 单击 Next。
- 选择 Empty,然后单击 Finish。
- 通过展开测试套件,打开测试套件配置面板,然后双击 Test Suite: Test Suite 节点。
- 打开 Execution Options> Test Flow Logic 选项卡。
- 将 Flow type 设置为 While pass/fail。
- 将 Maximum number of loops 设置为
20
。 - 将 Loop until 设置更改为 One test 和 Succeeds。
- 保存测试套件配置设置。
- 如下创建一个 SOAP 客户端。
- 右键单击 TestFlowLogic.tst> Test Suite: Test Suite 节点,然后选择 Add New> Test。
- 在打开的对话框中,选择 SOAP Client,然后单击 Finish。
- 如下配置 SOAP 客户端:
- 在测试配置面板的 WSDL 选项卡中,输入 WSDL URL
http://localhost:8080/parabank/services/store-01?wsdl
。 - 在 Request 选项卡中,将 Operation 设置为 getItemByTitle。
- 针对 titleKeyword,请选择框,然后输入
PowerBuilder
作为值。 - 将变更保存到 SOAP 客户端测试。
- 在测试配置面板的 WSDL 选项卡中,输入 WSDL URL
- 为该测试创建回归控制,如下所示:
- 邮件单击 SOAP Client 测试节点,然后选择 Create/Update Regression Control。
- 选择 Create Regression Control。
- 单击 Finish。
- 在回归控制中修改预期价格,如下所示:
- 双击新建的 Diff control 节点,打开 Diff 工具编辑器。
- 在 price 元素中修改值。在多次调用 getItemByTitle 之后,商店服务会将这本书的价格提高了 1.00 美元,因此,根据您在本教程中运行测试的次数,当前价格可能会与显示的价格有所不同。
- 双击新建的 Diff control 节点,打开 Diff 工具编辑器。
通过选择测试套件节点,然后选择 Test 工具栏按钮运行当前测试套件。即使特定测试失败,测试套件也会成功,因为在循环 20 次之前将达到预期响应中输入的价格。可以在 Console 选项卡中看到:
Higher prices than expected?
您调用 getItemByTitle 的次数越多,价格上涨的幅度就越大。要降低价格,请重新启动 Parabank 服务器,然后重新运行调用 getItemByTitle 的 SOAP 客户端。- 双击以前创建的 Diff Control 节点,打开 Diff 工具编辑器。
- 修改价格,以使测试在达到价格之前将循环播放完整的 20 次。
- 再次运行测试套件。测试套件将失败,因为在循环 20 次之后,价格永远无法达到。
使用脚本扩展 SOAtest
如果您有一个测试要求,要求您向测试用例中添加自定义功能或逻辑,则 SOAtest 允许您轻松地将自定义脚本集成到测试环境中。
使用 SOAtest 的 XML 断言器,您可以将编写的自定义脚本集成到 SOAtest 中。这意味着即使 SOAtest 当前的工具集不直接支持这种情况,几乎任何测试情况都可以轻松处理。
此示例中,您将使用前面示例中使用的书店服务创建场景测试。在此方案中,您将按书名搜索一本书,然后确认该书的价格是偶数整数。
当您完成本教程这个部分时,您的测试套件应类似 SOAtestTutorial.tst
文件中标题为“Custom Scripting”的测试套件。
- 请选择上次练习的 Test Suite: Functional Tests 节点(在 为单元测试创建测试套件中所创建),然后单击 Add Test Suite 工具栏按钮。
- 在添加测试套件向导中,单击 Empty,然后单击 Finish。
- 双击新建的 Test Suite: 将Test Suite 节点添加到测试套树,然后输入
Custom Scripting
到测试配置面板中的 Name 字段,然后单击 Save。 - 请选择上次练习的 Test Suite: Custom Scripting 节点,然后单击 Add test or output 按钮。
- 在添加测试向导右侧选择 SOAP Client ,然后单击 Finish。将 SOAP 客户端工具添加到测试套件。
- 双击 测试1:SOAP Client 节点,该节点位于 Test Suite: Custom Scripting 节点下,然后输入
Validate Price Value
到右侧 GUI 面板中的 Name 字段。 - 在测试配置面板的 WSDL 选项卡中,输入
http://localhost:8080/parabank/services/store-01?wsdl
到 WSDL URL 字段中。 - 打开 Request 选项卡,然后从 Operation 下拉框中选择 getItemByTitle 。
- 在 SOAP body 选项卡中,单击 getItemByTitle ,然后启用 titleKeyword 选项。
- 从下拉菜单中选择 Fixed ,然后输入
Linux
作为值。 - 单击 Save 工具栏按钮。
- 右键单击 Test 1: Validate Price Value 节点,然后选择 Add Output。
- 在 Add Output 向导左侧选择 Response> SOAP Envelope ,右侧选择 XML Assertor ,然后单击 Finish。这告诉 SOAtest 将 XML 断言器链接到 SOAP 客户端的 XML 响应输出。
- 单开 XML 断言器测试配置面板中的 Configuration 选项卡,然后单击 Add 按钮。
- 在 Select Assertion 对话框中,展开 Value Assertion 节点,选择 Custom Assertion,然后单击 Next 按钮。
随后,Custom Assertion 对话框将显示 XML 消息的树状视图,您可以从中选择一个要执行的值。 - 在 XML 树状视图中选择 price 元素,然后单击 Finish 按钮。
现在将使用自定义断言填充测试配置选项卡。 - 在 Language 下拉菜单中选择 Jython 。
在测试配置选项卡的 Text 字段中输入以下脚本,以确保价格值是均匀的:
def checkPrice(input, context): price = float(input) if price % 2 == 0: return 1 else: return 0
- 在 Method 下拉菜单中选择 checkPrice() 。
- 单击 Save 工具栏按钮。
- 选择 Test 1 节点,然后单击 Test 按钮。请注意,测试失败。如果双击测试的 Traffic Viewer 节点,您将看到 Linux 书的价格是一个奇数,从而导致测试失败。
进一步扩展 SOAtest
您可以在脚本中使用 SOAtest 的内置可扩展性框架,从而可以在 SOAtest 中定义和使用自定义传输协议和消息实现。有关更多信息,请跳转至 Parasoft> Help> Parasoft SOAtest Extensibility API。