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