Squish for Java AWT/Swing:基于模型的测试
教程:基于模型的测试
本教程向您展示如何利用模型测试您的应用程序。这种方法称为基于模型的测试(MBT)。您将学习如何使用Squish创建、运行和修改MBT模型和测试。您将使用地址簿应用程序。教程结束时,您将能够为测试您自己的应用程序创建模型。
基于模型测试简介
基于模型测试是一种使用模型进行测试的测试方法。基本思路是设计描述测试对象(AUT)的MBT模型,然后使用这些模型作为测试设计规范。
这些模型应提供正式和详细的信息,足以通过遍历模型来手动和自动创建测试用例。
这种测试方法,类似于行为驱动开发(BDD),旨在与AUT的开发过程和生命周期紧密集成。它可以促进干系人之间的联系,统一沟通语言,并简化测试自动化的流程。
Squish概念
- 模型 - 测试基础的抽象表示。它可以用来模拟不同的方面,例如测试本身、工作流程、AUT的行为或测试数据。
- 步骤 - 抽象地描述在测试过程中应发生的活动。例如,启动AUT、向地址簿添加新联系人或编辑地址簿中的现有地址。步骤通过带有描述性名称的圆形矩形来视觉表示。
- 连接 - 源步骤和目标步骤之间的有向关系。它通过两步之间的箭头来视觉表示,指示方向。
- Squish步骤图 - 表示MBT模型或其一部分的图。该图旨在关注应用程序的工作流程,而不是数据。它由步骤和它们之间的连接组成。每个连接都显示步骤可以执行的可能的顺序。在Squish MBT功能的初始版本中,每个模型只支持一个图。
- 路径 - 路径是通过给定模型的具体方式。它描述了基于模型测试中要采取的确切连续步骤。模型不应包含无效路径 - 在路径中连续执行步骤不应导致失败,如果AUT运行正确的话。
实现
以下说明将指导您通过设计全面MBT模型和根据它创建测试用例的迭代过程。
获取示例测试套件
SQUISHDIR/examples/java/addressbook目录包含示例测试套件(suite_mbt_01_*和suite_mbt_02_*),显示了本教程的不同阶段。我们鼓励您在需要交叉检查解决方案时检查它们。
选择文件 > 打开测试套件...,找到测试套件。点击下一步和完成按钮打开它。
创建测试套件
首先,我们需要创建一个测试套件,它是所有测试用例的容器。启动squishide
,然后选择文件 > 新建测试套件。请按照新建测试套件向导,提供测试套件名称,选择您首选的Java工具包和脚本语言,最后,注册AddressBookSwing.jar应用程序作为AUT。请参考创建测试套件了解更多有关创建新测试套件的信息。
创建MBT模型
测试套件准备就绪后,即需创建模型文件。为此,选择文件 > 新建 > MBT模型文件。这将打开新建MBT模型对话框
在对话框中,提供MBT模型文件名 "管理联系人
",并选择您的测试套件。选择在测试套件中创建共享文件,以便模型可供多个测试用例使用。
点击完成按钮后,将打开用于新建Squish步骤图的MBT模型编辑器。
此时,您可以开始创建您的第一个MBT模型。您看到的是带有单个黑色点的Squish步骤图,这个点代表初始步骤。
注意:初始步骤 - 一个专门用作Squish步骤图的入口点的步骤。它在视觉上表示为一个实心的黑色圆圈,没有对应的步骤实现。
迭代1
在此次迭代中,我们将创建一个简单的模型,以便我们测试向地址簿添加单个条目的工作流程。
添加步骤
要添加新步骤,请确保编辑模式:添加步骤处于活动状态,例如,通过单击模型编辑器中的按钮。然后,单击新步骤应添加的位置。输入步骤名称,通过按Enter键或点击矩形外部来确认。
将以下步骤添加到图中
- 创建新的地址簿
- 打开添加视图
- 填写联系人信息
- 确认
- 验证新的条目是否已被添加
注意:在Squish步骤图中,我们建议命名为动词开头的步骤,即使对于验证步骤也是如此。
使用验证按钮已禁用而不是按钮应该已禁用。
这有助于保持步骤风格的统一。
添加所有条目后,您的图可能看起来与以下类似
连接步骤
一旦所有步骤都已添加到图上,就需要通过一种演示可以在应用程序中执行的工作流程来连接它们。为此,通过单击图标激活编辑模式:连接步骤。现在,使用鼠标光标连接图中的步骤
在这个时候,您可能需要使用编辑模式:编辑步骤()来移动步骤,使模型更清晰、更易于理解。
创建测试用例
一旦所有步骤都已添加和连接,就到了创建第一个MBT测试用例的时候了。
您可以通过以下方式创建New MBT Test Case:
- 选择文件 > 新建测试用例来打开新建Squish测试用例向导
- 展开位于测试套件视图中的测试用例标签右边的新建脚本测试用例()工具栏按钮。从列表中选择MBT测试用例。这将打开新建Squish测试用例向导,
向导打开后,确保选择了MBT测试用例,并选择模型文件。最后,单击完成按钮。
还可以在打开的模型中创建一个新的测试用例。要这样做,请点击模型编辑器的“新建MBT测试用例”()工具栏按钮。这将创建一个具有默认名称的新测试用例,您可以轻松地更改名称。
创建新测试用例后,将打开MBT测试用例编辑器。
编辑器显示用于创建它的模型。现在,请在图上选择步骤序列。路径从最初选择的初始步骤开始。与所选步骤相连的每个步骤都会显示一个绿色加号按钮。
单击它将突出显示步骤矩形,在其上显示步骤编号,并将其添加到路径列表。根据上一教程步骤中添加的连接 - 从“创建新的地址簿”开始,以“验证新条目已添加”结束。这样,您可以创建代表测试用例工作流程的路径
步骤实现
现在是时候实现步骤背后的逻辑了。步骤脚本可以是录制的小片段或由测试开发者编写。
通过录制小片段记录步骤
注意:要了解更多关于录制小片段的信息,请访问如何编辑和调试测试脚本
首先,为所有添加的步骤创建缺少的步骤实现。回到模型编辑器,激活编辑模式:编辑步骤模式(),并选择任何步骤。点击此字段旁边的()按钮,并选择创建缺少的步骤实现选项。这将打开用于Manage contacts.py
文件的脚本编辑器,其中有五个新的步骤函数。到目前为止,它们都调用test.warning()函数来报告缺少步骤实现。
在带有test.warning()调用的每一行设置断点。单击该行,然后从主菜单中选择运行 > 切换断点。你应该在脚本中有五个断点。
要在测试执行期间录制小片段,Squish需要连接到AUT。在使用注册的应用程序名称之前,在代表第一步的函数中的警告之前调用startApplication(autName)函数。
@mbt.step("Create new address book") def step(): startApplication("AddressBookSwing.jar") test.warning("TODO implement Create new address book")
mbt.step("Create new address book", function() { startApplication("AddressBookSwing.jar"); test.warning("TODO implement Create new address book"); });
mbt::step("Create new address book", sub { startApplication("AddressBookSwing.jar"); test::warning("TODO implement Create new address book"); });
Mbt::step("Create new address book") do startApplication("AddressBookSwing.jar"); Test.warning "TODO implement Create new address book" end
mbt step "Create new address book" {} { startApplication "AddressBookSwing.jar" test warning "TODO implement Create new address book" }
这将在触发测试执行时启动AUT。您可以通过以下方式完成此操作:
- 点击路径列表下方的运行MBT测试用例 按钮
- 点击测试用例名称旁边的运行测试 按钮
- 从Squish IDE菜单选择运行 > 运行测试用例
等待Squish到达create_new_addressbook步骤中的第一个断点。您将看到IDE的调试视角。开始录制小片段并执行创建新地址簿所需的所有操作,例如 点击AUT中的新建按钮。接下来,使用Squish 控制栏 和 停止录制。一旦您回到Squish IDE,通过单击主工具栏上的继续按钮来恢复执行。
为所有创建的断点重复该过程。每次录制小片段时,仅执行您当前步骤描述的所有动作。
- 打开添加视图 - 点击绿色加号
- 填写联系信息 - 输入名、姓氏、电子邮件和电话
- 确认 - 点击“确定”按钮
- 验证新条目是否已添加 - 在通讯录表格中添加一个 rowCount 属性验证点
使用提供的示例
示例 suite_mbt_01_* 测试套件已包含至今为止您创建的所有步骤的实现。如果您在某个环节迷失了方向,我们鼓励您查看这个测试套件并在需要时修复您的代码。
执行测试用例
通过选择 运行 > 移除所有断点 来移除您添加的所有断点。当执行完成后,您可以在 测试结果 视图中检查执行结果。双击表示一个步骤的结果条目将当前焦点切换到该步骤在模型中的对应步骤。要跳到一个步骤实现,展开步骤消息并双击任何内部测试结果条目。
迭代2
在这个迭代中,您将扩展图表并创建新的MBT测试用例。
添加步骤
将以下步骤添加到图中
- 中止
- 验证未添加新的条目
添加所有条目后,您的图表可能看起来与此类似
连接步骤
激活 编辑模式:连接步骤 ( ) 并将新步骤连接起来,以展示两种可能的工作流程。
创建更多测试用例
这些新步骤和连接允许我们创建两个额外的路径,即两个额外的测试用例。像之前一样,从现有模型创建一个新的测试用例,并通过对步骤进行选择来创建以下路径
创建新的通讯录 > 打开添加对话框 > 中止 > 验证未添加新条目
之后,创建另一个测试用例,涵盖最后一个可能路径
创建新的通讯录 > 打开添加对话框 > 插入联系信息 > 中止 > 验证未添加新条目
步骤实现
就像在第一次迭代期间一样,您可以在新函数中创建缺失的步骤实现并添加断点。然后,执行新创建的测试用例并记录缺失的代码片段。
中止 步骤应点击 取消 按钮。《验证未添加新条目》应验证通讯录条目数量等于 0。
您还可以使用下面的代码片段
@mbt.step("abort") def step(): clickButton(waitForObject({"type":"javax.swing.JButton", "text":"Cancel"})) @mbt.step("vp_no_new_entry") def step(): test.compare( waitForObjectExists({"type": "javax.swing.JTable"}).rowCount, 0, "There should be 0 entries in the address book" )
mbt.step("abort", function() { clickButton(waitForObject({"type":"javax.swing.JButton", "text":"Cancel"})); }); mbt.step("vp_no_new_entry", function() { test.compare(waitForObjectExists({"type": "javax.swing.JTable"}).rowCount, 0, "There should be 0 entries in the address book"); });
mbt::step("abort", sub { clickButton(waitForObject({"type" => "javax.swing.JButton", "text" => "Cancel"})); }); mbt::step("vp_no_new_entry", sub { test::compare( waitForObjectExists({"type" => "javax.swing.JTable"})->rowCount, 0, "There should be 0 entries in the address book" ) });
Mbt::step("abort") do clickButton(waitForObject({:type =>"javax.swing.JButton", :text => "Cancel"})) end Mbt::step("vp_no_new_entry") do Test.compare( waitForObjectExists({:type => "javax.swing.JTable"}).rowcount, 0, "There should be 0 entries in the address book" ) end
mbt step "abort" {} { invoke clickButton [waitForObject [::Squish::ObjectName text Cancel type javax.swing.JButton]] } mbt step "vp_no_new_entry" {} { test compare [property get [waitForObjectExists [::Squish::ObjectName type javax.swing.JTable]] rowCount] 0 "There should be 0 entries in the address book" }
在这种情况下,请记住填写新步骤的 实现: 字段,以确保它与步骤定义的 步骤实现标识符 匹配。
执行测试套件
这次,通过点击 运行测试套件()按钮来执行整个测试套件。所有三个MBT测试用例执行的结果将在测试结果视图中可用。
使用提供的示例
示例 suite_mbt_02_* 测试套件实现了本教程的所有步骤。您可以免费使用它作为全面的参考或与您的实现进行比较。
常见问题
测试用例与模型不匹配
由于对模型所做的更改,一些之前创建的路径可能不再有效,例如,两个步骤之间的连接已被删除。
这将会在测试用例中报告错误指示,并在执行期间导致错误。模型可能会随时间演变,请记得相应地审查和更新您的测试用例和路径。
缺少步骤实现
如果步骤的实现没有引用有效的步骤实现,在测试执行通过该步骤时,Squish将抛出“缺少步骤实现”错误。
©2024 Qt公司有限公司。本文件中的文档贡献是各自所有者的版权。
本文件提供的文档根据自由软件基金会发布的GNU自由文档许可协议版本1.3的条款进行许可。
Qt及其相关标志是Qt公司有限责任公司在芬兰以及/或其他国家/地区的商标。所有其他商标均属于其各自所有者。