本文翻译自:Model-Based Testing in Practice with the Squish IDE
原文作者:Qt Group质量保证高级解决方案工程师Katarina Behrens
审校:Jinjing Li
在我们之前对基于模型的测试(MBT)的介绍的基础上,本文深入探讨了MBT的原理和最佳实践,并展示了其在Squish GUI Tester 8.0版本中的实际应用。
基于模型的测试是一种系统化的测试设计和执行方法,它利用模型作为被测系统(SUT)的抽象表示。与传统测试不同,基于模型的测试无需经常仔细检查系统的细节,而是采用了一种更概括性的方法,通过抽象的部分模型来反映SUT的预期行为并指导整个测试过程。
SUT的模型可以是一个利用方框和箭头表示状态和状态转换的状态图(其他可用于呈现系统抽象的图表包括:活动图、业务流程建模标注(BPNM)图、统一建模语言(UML)图等)。基于模型的测试方法的核心思想是,利用这种系统抽象来创建或生成测试用例。
选择合适的抽象层次
用于软件开发和测试的模型涉及不同层次的抽象。选择合适的抽象层次至关重要,因为它允许我们仅选择有意义的、覆盖所需内容的测试用例,并帮助我们专注于测试工作。
在最高抽象层次上,用例图或行为模型提供了系统行为的概述。当需要捕捉系统的更多具体层面时,用于描述状态和状态转换的状态图或反映交互情况的序列图是一个不错的选择。在最低抽象层次上,有高度具体的模型,其中各个状态或交互将分解成更多细节;也有复杂的多层次模型,其中个别组件可以是至少两个基本子组件的组合。
Squish IDE中的基于模型的测试编辑器
Squish GUI Tester 8.0版本为Squish IDE中基于模型的测试首次引入了全套工具集,并推出了易于使用的图形化MBT模型编辑器和MBT测试用例(路径)编辑器。
MBT模型和MBT测试用例完全集成到了现有测试项目中:可与其他资源和脚本或行为驱动(BDD)的测试用例共存,同时MBT的步骤实现可以利用共享的测试脚本。此外,还提供了步骤骨架生成、代码补全和面向支持的所有脚本语言的脚本API。
在我们基于模型的测试的具体演示中,SUT模型是一个简化的活动图,定义了可按何种顺序在系统上执行的操作/步骤(方框)。各个步骤之间的连接(箭头)反映了哪些步骤必须在某一步骤之前执行,哪些步骤可在某一步骤之后执行。通过该图的任何路径均被视为一个可能的测试场景。
第一个基于模型的测试用例
我们的待测应用(AUT)通常在咖啡机界面上运行,用户可选择一种含咖啡 因的饮品,调整糖和奶的添加量,最后完成冲泡过程。AUT的欢迎界面及其行为模型可能如下所示:
我们从两个简单的测试用例开始演示,每个测试用例以活动图表的一个路径表示。在第一个测试用例中,我们简单地冲泡了一杯不添加任何配料的浓缩咖啡。
在第二个测试用例中,咖啡机冲泡了一杯拿铁咖啡,同时我们调整了奶和糖的添加量。
执行测试用例时,Squish GUI Tester会启动AUT,并按照活动图表的路径中指定的顺序回放即定的步骤。每个步骤都与所谓的实现建立了关联:在测试用例执行到该特定步骤时,会执行对应的一个用脚本语言(在本示例中为Python)编写的函数,。该函数可以实现用户与AUT交互的自动化,或者验证应用对象的属性。以下代码片段展示了我们的示例模型中几个步骤的实现:
@mbt.step("Click on Macchiato")
def step():
mouseClick(waitForObject(names.macchiato_button))
test.vp("VP_macchiato")
# -------- Setting milk and sugar --------
@mbt.step("Set milk")
def step():
mousePress(waitForObject(names.milk_slider_handle))
slider = waitForObject(names.coffee_sugarSlider_Slider)
x = builtins.int(slider.width * random.random())
y = builtins.int(slider.height * 0.5)
mouseMove(slider, x, y)
mouseRelease()
snooze(0.5)
在MBT测试用例中添加步骤
然而,我们的模型和上述两个简单测试用例中还缺少一个功能:从“给我冲一杯咖啡”界面返回,选择其他饮品。为了能够测试这一场景,我们使用Squish IDE中的MBT模型编辑器扩展了我们的模型,具体如下:
1. 在添加步骤模式下,我们添加了一个表示“返回”操作的步骤
2. 在连接步骤模式中,我们将其连接到图表中的其余步骤
3. 借助生成缺失步骤实现功能,我们为新步骤生成了一个空模板实现
4. 最后,我们利用点击或触碰“返回”按钮的实际功能来替换空实现:
@mbt.step("Go back")
def step():
mouseClick(waitForObject(names.back_button))
现在我们来创建一个新的基于模型的测试用例,以执行返回更改选择界面并冲泡其他饮品的功能。工作流程以活动图中的路径(即我们的 SUT 模型)表示,其中包含我们刚添加到模型中的步骤:
我们在 Squish IDE 中执行了我们的 MBT 测试用例,这与脚本或行为驱动的任何其他测试用例的执行方式一致。至于MBT 测试用例编辑器右侧边栏中的步骤列表以及测试结果视图,将以醒目的颜色和/或图标显示是否成功执行了即定的步骤。
基于模型的测试提供了一种策略性方法来实现自动化测试。它有助于早期缺陷检测,并增进开发团队内部的沟通。对于希望实现井然有序的系统化测试方法的测试工程师来说,Squish GUI Tester 8.0提供了一套全新的强大工具,可将基于模型的测试纳入到软件开发生命周期中。