简介
基于模型的测试(简称MBT),是属于软件测试领域的一种测试方法。
与常规的设计测试用例,然后运行测试用例,验证运行结果与用例期望值是否一致的测试方法不同。MBT首先对被测软件系统进行建模,制定行为和行为之间的关系以及行为和系统的关系(有限状态机)。
其次,使用建模模型根据被测系统的状态、之前设置的限制条件和策略来生成很多用例,测试结果受一系列操作的影响。MBT可以产生更多不确定性的用例,更能发现一些意料之外的软件缺陷。
MBT主要包括:分析被测系统、选择测试模型、构建测试模型、生成和执行测试用例、收集和分析测试结果几个步骤。
其中最重要也是最难的几点就是选择测试模型、构建测试模型,以及生成和执行测试用例。
下面简要介绍以下常用的测试模型和市面开源的MBT工具。
常用的测试模型
MBT建模通常有两种类型:一是以针对测试数据进行建模,二是针对用户行为进行建模。
针对测试数据建模
这是测试人员在测试过程中经常使用的。比如:边界值法、等价类方法等等,在此不再赘述。
针对用户行为进行建模
如:判定表、因果图、有限状态机FSM建模法、统一建模语言UML建模法等等。
对于判定表和因果图方法,测试人员已经非常熟悉,在此也不做阐述。下面简要介绍下FSM和UML建模法。
有限状态机FSM建模法
有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。
有限状态机的关键在于“有限”,即使用它建模的系统状态切换时有限、可以枚举的。
状态机的4要素为:现态、条件、动作、次态。使用有限状态机可以有效地表达软件系统和相关过程中基于状态的行为。
以“光线暗开灯,光线亮关灯”为例,有限状态机的状态表可以如下表1所示:
表1 “开关灯”有限状态机状态表
统一建模语言UML建模法
UML又叫统一建模语言。使用UML建模可以从9个图入手:
·用例视图角度下的用例图建模;
·设计视图角度下的类图和对象图建模;
·进程视图角度下的序列图、协作图、状态图和活动图建模;
·实现试图角度下的构件图建模;
·以及拓扑视图角度下的部署图建模。
与有限状态机类似, UML 状态机加入了更复杂的特征,可以提供需求分析人员、开发人员和测试人员等多种角色对软件进行模型分析。
常用的建模工具
目前MBT工具有很多,例如:spec expoler、graphwalker、certifyit、Conformiq Designer等等,简要信息和区别如下表所示。
表2 MBT工具简要信息
建模举例
由于GraphWalker兼容java和python开发平台,已经能够良好的嵌入CI流水线特点,本文使用GraphWalker建模工具进行模型测试举例。
GraphWalker的安装和使用文档可以参考graphwalker.github.io。
样例1
需求分析
以表1中的“开关灯”有限状态机状态表为例,设计MBT模型。光线暗时,按下开灯键灯亮;光线亮时,按下关灯键灯灭。
模型图设计
使用YED工具(下载地址:https://www.yworks.com/products/yed)画出来的FSM模型图大致如下图1所示。
图中每一个圆角矩形框表示一个状态,如:登录成功状态、注册成功状态等。
每一个单向箭头表示为了达到下一个状态需要做的任何动作,如:“。”,它可以选择一些菜单选项,单击按钮等测试动作,GraphWalker只接受单向有向边(箭头)。
图1 样例1 FSM模型图
测试用例生成
运行graphwalker编译好的jar包生成测试用例,使用命令为:
java -jar .\target\graphwalker-cli-4.3.2-SNAPSHOT.jar offline --model .\sample\light.graphml "random(edge_coverage(100))"
其中offline表示离线模式,此外graphwalker还有online在线模式,在线模式graphwalker可以作为服务器提供restful和websocket服务。
--model表示模型参数,后跟.graphml文件。
random(edge_coverage(100))为停止运行的条件,在此例中表示随机路径覆盖率100%时,停止用例生成。
graphwalker用例生成结果如下图2所示。
图2 样例1用例生成结果
样例2
需求分析
拟设计一个网站的登录页面,若用户未注册,则需进行注册;若用户已经注册,则可以直接使用用户名、密码进行登录。
模型图设计
使用YED绘制的样例模型图如下图3所示。
图3 样例2模型图
测试用例生成
java -jar .\target\graphwalker-cli-4.3.2-SNAPSHOT.jar offline --start-element v_开始 --model .\sample\demo.graphml "quick_random(edge_coverage(100))"
使用命令生成用例,部分用例如下图4所示。
在该命令中,--start-element定义模型的入口,不使用该参数时,默认入口为start,如图1所示。
本例中,停止用例生成的条件是quick_random(edge_coverage(100)),表示使用最短路径遍历所有边,覆盖率100%是退出用例生成。
图4 样例2用例生成结果
MBT的意义
经过上述短暂的介绍,你可能对MBT有了初步的认识。
但是你可能会问:使用这样那样的工具进行MBT建模到底有什么作用?
可以这样告诉你:在我们工作中经常涉及的功能测试、界面测试、性能测试等测试工作中,我们几乎都是对已经成熟定型的需求或代码进行测试。
而这些常用测试方法的弊端在于,无法将测试前移到需求设计阶段进行。
其实,在本例2中,笔者在运行用例生成的过程中就发现一个潜在的问题,模型设计不够合理,导致用例生成量剧增。由此可见,使用工具进行模型测试时,一方面能够帮助测试人员熟悉需求和软件行为,另一方面还能帮助测试人员挖掘需求中的不合理之处。
因此,使用MBT方法,可以在需求设计阶段引入测试,对需求进行建模和模型测试,挖掘需求设计中潜在的问题和缺陷。
作者:刘晓佳Rachel