Squish for Qt:基于模型的测试
教程:基于模型的测试
本教程向您展示如何利用模型来测试您的应用程序。这种方法称为基于模型的测试(MBT)。您将了解如何使用Squish创建、运行和修改MBT模型和测试。您将使用地址簿应用程序。到教程结束时,您将能够为测试您自己的应用程序创建模型。
基于模型测试简介
基于模型测试是一种使用模型进行测试的测试方法。基本思想是设计描述被测应用程序(AUT)的MBT模型,然后使用这些模型作为测试设计规范。
模型应提供正式且详细的信息,足以手动和自动创建测试用例,通过遵循模型中的路径。
这种与测试工作的方法,类似于行为驱动开发(BDD),旨在与AUT的开发过程和生命周期紧密集成。它可以缩短利益相关者之间的距离,统一沟通语言,并简化测试自动化流程。
Squish概念
- 模型 - 测试依据的抽象表示。它可以用于模拟不同的方面,例如测试本身、工作流程、AUT的行为或测试数据。
- 步骤 - 抽象描述了在测试过程中应该发生的行为。例如,启动AUT、向地址簿添加新联系人或编辑地址簿中的现有地址。步骤通过带描述性名称的圆形矩形进行可视化表示。
- 连接 - 源步骤和目标步骤之间的有向关系。它以两个步骤之间箭头的方式可视化表示,指明了方向。
- Squish步骤图 - 表示MBT模型或其部分的图。该图旨在专注于应用程序的工作流程,而不是数据。它由步骤及其之间的连接组成。每个连接显示了步骤可以执行的可能序列。Squish MBT功能的初始版本中仅支持每个模型一个图。
- 路径 - 路径是通过给定模型的特定方式。它描述了在基于模型的测试中要执行的确切连续步骤。模型不应包含无效路径 - 在路径中连续执行步骤不应导致失败,如果AUT工作正常。
实现
以下说明将引导您通过设计全面MBT模型并基于它创建测试用例的迭代过程。
获取示例测试套件
SQUISHDIR/examples/qt/addressbook
目录包含示例测试套件(suite_mbt_01_* 和 suite_mbt_02_*),展示了本教程的不同阶段。我们鼓励您在需要对照检查解决方案时查看它们。
选择 文件 > 打开测试套件... 并定位测试套件。点击下一步和完成按钮打开测试套件。
创建测试套件
首先,我们需要创建一个测试套件,它所有测试用例的容器。启动squishide
,然后选择文件 > 新建测试套件。请按照新建测试套件向导操作,提供测试套件名称,选择您的Qt工具包和所选择的脚本语言,最后,将addressbook.exe应用程序注册为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("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":"QPushButton", "text":"Cancel"})) @mbt.step("vp_no_new_entry") def step(): test.compare( waitForObjectExists({"type": "QTableWidget"}).rowCount, 0, "There should be 0 entries in the address book" )
mbt.step("abort", function() { clickButton(waitForObject({"type":"QPushButton", "text":"Cancel"})); }); mbt.step("vp_no_new_entry", function() { test.compare(waitForObjectExists({"type": "QTableWidget"}).rowCount, 0, "There should be 0 entries in the address book"); });
mbt::step("abort", sub { clickButton(waitForObject({"type" => "QPushButton", "text" => "Cancel"})); }); mbt::step("vp_no_new_entry", sub { test::compare( waitForObjectExists({"type" => "QTableWidget"})->rowCount, 0, "There should be 0 entries in the address book" ) });
Mbt::step("abort") do clickButton(waitForObject({:type =>"QPushButton", :text => "Cancel"})) end Mbt::step("vp_no_new_entry") do Test.compare( waitForObjectExists({:type => "QTableWidget"}).rowCount, 0, "There should be 0 entries in the address book" ) end
mbt step "abort" {} { invoke clickButton [waitForObject [::Squish::ObjectName text Cancel type QPushButton]] } mbt step "vp_no_new_entry" {} { test compare [property get [waitForObjectExists [::Squish::ObjectName type QTableWidget]] rowCount] 0 "There should be 0 entries in the address book" }
在这种情况下,请记得填写新步骤的 实现: 字段,使其与步骤定义的 步骤实现标识符 相匹配。
执行测试套装
这次,通过单击 运行测试套件( ) 按钮来执行整个测试套件。所有三个MBT测试用例的执行结果将在测试结果视图中可用。
使用提供的示例
示例测试套件 suite_mbt_02_* 实现了这个教程中的所有步骤。您可以随时使用它作为全面参考或比较您的实现。
常见问题
测试用例与模型不匹配
由于对模型所做的更改,一些之前创建的路径可能不再有效,例如,删除了两个步骤之间的连接。
这将导致测试用例中出现错误指示器,并在执行期间导致错误。模型可能会随时间而演变,请记住相应地审查和更新您的测试用例和路径。
缺失步骤实现
如果步骤的实施没有引用有效的步骤实现,当测试执行经过该步骤时,Squish将抛出一个“缺少步骤实现”错误。
©2024 The Qt Company Ltd. 本文档中的文档贡献是各个所有者的版权。
本提供的文档根据自由软件基金会发布的《GNU自由文档许可证》第1.3版条款许可。
Qt及其相应标志是芬兰和/或世界其他国家的The Qt Company Ltd.的商标。所有其他商标均为其各自所有者的财产。