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

一旦打开向导,请确保选择 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.的商标。所有其他商标均为其各自所有者的财产。