常规测试一般是由人来设计几个特定的测试场景,然后断言测试结果。
测试用例固定。缺少不确定性。基于模型的测试(Model-based Testing)是需要实现一个模型,然后制定行为和行为之间的关系以及行为和系统的关系(有限状态机),然后测试系统根据被测系统的状态、之前设置的限制条件和策略来生成很多
用例(每执行一次生成的用例会不同),测试结果受一系列操作的影响,可以产生不确定性,更有可能发现一些想不到的很深路径下的
BUG。
基于模型的测试主要包括以下部分:
1、模型程序(Model Program ):在这里定义被测系统的可以被执行的一些操作(action),比如创建一个虚机、删除一个虚机等。还有这些操作能被执行的条件(xxx_enabled)和系统在各个操作下的状态(state)。
2、Test Harness/Steper/adapter:访问被测系统,具体实现模型中定义的操作(action)。
3、策略(Strategies):在测试运行过程中,完成一个操作(action)后,下一个应该执行哪个操作,是由这个策略决定的,最简单的策略可以用随机选择的方式,还可以自己实现一些更复杂的选择策略算法,比如Zstack的公平调度算法和基于历史测试路径的调度算法。
4、测试执行器(Test Runer):执行测试、检查
基于模型的测试的一般步骤:
1、分析理解被测试软件
基于模型的
软件测试要求充分理解被测试软件。构造可以用于测试的模型的工作主要是根据测试目的确定测试对象和测试特征,针对被测试软件的相关属性建立相应模型。这个阶段的具体工作包括,
充分了解软件
需求规范和设计文档、用户手册和
开发队伍充分交流。
1)识别软件系统的用户,枚举每个用户的输入序列,研究每项输入的可能取值范围,包括, 合法值、边界值、非法值,以及预期输出。这项工作往往需要工具支持。
2)记录输入发生条件和响应发生条件。软件系统的响应是指用户能够得到的输出或可见的软件内部状态的改变。其目的是设计可以引发特定响应的测试例和评价测试结果。
3)研究输入序列,如,输入发生时刻,软件系统接收特定输入的条件,输入处理顺序。
4)理解软件内部数据交换和计算过程,产生可能发现
缺陷的测试数据。
2、选择合适的测试模型
不同的模型适用于不同类型软件的测试 因此需要根据软件特点选择模型。
1)了解可用的模型:不同的应用领域要使用不同的测试模型。例如,电话交换系统多使用状态模型;并发软件系统中不同组件并发运行用状态图建模;马尔可夫链可以对软件进行失效统计分析。模型的选择还依赖于软件系统的工作特点,例如,测试长期运行软件系统可以使用状态机模型。
2)根据模型特征进行选择:只有充分理解模型和软件系统,才能选择合适的模型对软件进行测试。以状态机为例,自动机理论可以对状态机进行分类,说明不同的状态机可以表达什么语言,从而可以根据应用程序的功能和特点,选择不同的状态机模型。由于根据有限状态机产生测试数据相当于遍历有向图,因此图论算法可以指导产生测试例。
3)人员、组织和工具的影响:基于模型的软件测试对
测试人员的知识结构和技术水平提出了一定要求。如果一个开发组织使用模型(如UML)完成需求分析和系统设计,开展基于模型的软件测试就比较容易,因为根据系统分析和设计的模型进行测试,往往可以直接应用基于模型的软件测试技术,还可以根据测试的进展不断调整模型或模型的细节并有利于在开发过程早期进行测试规划。另外还要根据开发组织使用的
测试工具选择特定的模型。
3、构造测试模型
以基于状态机模型的测试为例说明如何构造测试模型。首先要抽象出软件系统状态,状态抽象一般要根据输入及输出条件进行,一般包括以下过程:
1)生成一个输入序列并说明每个输入的适用条件,称作输入约束。例如电话未摘机时,才允许有摘机动作发生。
2)对每个输入要说明产生不同响应的上下文环境,称作响应约束。例如,电话摘机时,如果当前状态为振铃,则进行通话,否则为拨号音。
3)根据输入序列、输入约束和响应约束构造相应状态机模型,如下图示例。
4、生成和执行测试例
测试例的自动生成依赖于测试所使用的模型。以有限状态机模型为例,被遍历路径中弧的标记构成的序列就是测试例。在构造满足测试准则的路径时,必须考虑约束条件,如路径长度限制,统计测试还要考虑迁移概率。生成了满足特定的测试充分性准则的测试例集合后就可以执行测试例。以状态机模型为例~ 首先要写出仿真该软件系统的每个不同外界激励的脚本,称为仿真脚本( simulation script) ,每个仿真脚本对应模型中一个不同的迁移;然后把测试例集合翻译为测试脚本( test script)。也可以用测试生成器通过遍历状态机的迁移直接产生测试脚本。测试例的执行就是测试脚本的执行过程。脚本是可以重复利用的资源,维护测试脚本也是测试工作的一部分。
5、收集测试结果进行分析
基于模型的软件测试方法并没有解决测试失效辨识(Test
Oracle) 问题,仍然要人工检查输出是否正确。但是通过状态验证可以部分解决测试失效辨识问题,状态是内部数据的抽象,比较容易验证。另外,与传统测试相比,基于模型的软件测试的优势之一就是可以根据测试结果分析软件的其它质量因素,如可靠性。
基于模型的软件测试的评价
1、基于模型的软件测试的优势
基于模型的软件测试大大提高了测试
自动化水平,部分解决了测试失效辨识问题,可以进行测试结果分析,有利于测试制品的重用,并可以应用成熟的理论和技术获得比较完善的分析结果。现代软件工程强调增量和迭代的开发过程,采用面向对象开发技术,提高软件开发质量和加快软件开发速度。由于面向对象软件系统的规范多数使用模型表达,这些模型中包含了大量可以用于软件测试的信息,因此基于模型的软件测试可以把软件测试工作提前到开发过程早期,如进行测试工作的早期规划。
2、基于模型的软件测试的缺点
基于模型的软件测试存在以下缺点:
1)测试人员需要具备一定的理论基础,如状态机理论和随机过程的知识。还要掌握相关工具使用方法。
2)需要一定的前期投入,如模型的选择,软件功能划分,模型构造等。
3)有时无法克服模型的固有缺陷,如状态爆炸,这对检验,评审和维护模型都提出了要求,也直接影响了测试自动化。状态爆炸问题一般通过抽象和排除方法( abstraction Sexclusion) 减小测试规模,降低测试难度来解决。