基于模型的测试综述2016年1月I摘要面向对象软件开发应用越来越广泛,自动化测试也随之被程序员认可和接受,随之而来的就是基于UML的软件开发技术的大范围普及和基于模型的软件测试技术的普遍应用。基于模型的测试是软件编码阶段的主要测试方法之一,具有测试效率高、排除逻辑复杂故障测试效果好等特点。本文描述了基于模型的测试的模型以及建模标准,并介绍基于模型的测试的基本过程以及支持工具,同时通过七个维度对基于模型的测试方法进行描述。最后分析基于模型的测试的优缺点并列举了应用案例。关键词:软件测试,基于模型的测试,软件模型,测试工具1目录摘要................................................I1引言.........................................................................................................22基于模型的测试、模型以及建模标准................................................22.1基于模型的测试...............................................................................................22.2基于模型的测试的模型...................................................................................32.3建模标准...........................................................................................................43基于模型的测试的基本过程及支持工具............................................53.1基于模型的测试的基本过程...........................................................................53.2支持工具...........................................................................................................64分类.........................................................................................................74.1模型主体..........................................................................................................74.2模型冗余程度..................................................................................................74.3模型特征..........................................................................................................74.4模型表示法......................................................................................................74.5测试用例选择标准..........................................................................................84.6测试用例生成技术..........................................................................................84.7联机、脱机测试用例生成..............................................................................95基于模型的测试的工具SpecExplorer...............................................95.1SpecExplorer....................................................................................................95.2连接测试用例和待测系统..............................................................................95.3静态模型和实例模型....................................................................................116基于模型的测试的优缺点..................................................................11参考文献..................................................................................................1321引言在软件开发的生命周期中,测试是一个非常重要的阶段。软件测试[1]通过为特定测试目的而设计的测试用例的执行情况,与预期的软件行为进行一致性对比,从而判定软件错误所在,以此确保软件的可靠性和正确性。由于软件产品的固有的复杂性质,软件测试的难度也就不言而喻。传统的测试方法被认为是繁琐的、强工作量且容易出错。应运而生的基于模型的测试开始受到日渐广泛的关注。基于模型的测试(Model-BasedTesting)[2]是一种系统化的测试方法,可被应用于软件生命周期早期阶段的产品的测试,并且它使完全自动化测试成为可能,其特点是:在产生测试例和进行测试结果评价时,都是根据被测试应用程序的模型及其派生模型(一般称作测试模型)进行的。基于模型的测试深受工业界的青睐,原因如下:一是工业界通常需要验证软件产品的系统行为。在产品设计的早期,基于模型的测试的使用有利于帮助找出不清晰的、易存在二义性的软件系统规格说明(“即编码前的分析设计模型/文档”)。二是基于模型的测试方法使得大量不重复的、有意义的测试用例产生变得可能。三是使用基于模型的测试一旦系统规格说明发生改变,只需要对测试模型进行修改就可以轻松地达到更新测试用例的目的。本文组织如下,首先介绍了基于模型的测试及其特点,分析了主要的测试模型及如何选择合适的测试模型,重点是有限状态机模型、UML模型和马尔可夫链模型,并且提出了建模的标准;接着介绍基于模型的测试的基本过程以及支持工具,再通过七个维度对基于模型的测试方法进行描述,并对每一个维度探讨了可能取值,然后与其他软件测试技术相比,分析基于模型的测试的优缺点,最后列举了一些基于模型的测试的应用案例。2基于模型的测试、模型以及建模标准2.1基于模型的测试首先应该要明确软件模型的概念,是指用抽象化的方式对软件行为和软件结构进行阐述,软件行为可以通过一系列的输入输出逻辑和数据流分析来表示,软件结构则是通过部署图、流程图等图形方式直观表述,基于模型的测试就是通过上述两种抽象化方式产生测试用例。相比于针对程序代码本身的测试,而基于模型的测试方法不仅可以有效地提高测试效率,提高测试例生成的自动化程度,进行测试失效辨识,也有利于评价测试结果。基于模型的测试是对被测系统的模型化,然后根据模型特性,完全或者部分3地自动生成测试用例的一种软件测试技术。基于模型的测试是一个轻量级的,形式化的验证软件系统的方法。首先,基于模型的测试对待测软件系统(通常被称为SystemUnderTest,简称SUT)进行形式化的建模,设计出机器可读的模型;其次,和其他形式化方法比,基于模型的测试并不致力于让待测软件系统与规格说明在所有可能情况下都保持一致,而是系统化的从模型生成一组测试用例,使用这组测试用例测试待测软件系统,得到充分的证据说明待测系统的行为与模型期望是一致的。2.2基于模型的测试的模型理想的模型需要容易被测试人员理解,能够把大的复杂的问题描述成小的简单的系统,最好还是以一种测试用例生成工具方便识别的形式。想要同时满足以上所有的特性是很困难的,但是可以把几种不同的模型整合成一个,扬长避短地得到理想模型。在基于模型的测试中使用过的模型可能有几十甚至上百种,我们不可能也没有必要去逐一了解,MarkUtting和BrunoLegeard把它们大致分为以下几种[3]:表2.1MBT模型分类类型示例基于Pre/PostB、OCL、JML、Spec#、Z基于转换FSM、状态图、UML状态机统计式马尔可夫链基于历史消息队列图、UML顺序图函数式HOL系统操作式Petri网数据流式Lustre、块状图基于模型的测试中使用的典型模型有:有限状态机(FSM,FiniteStateMachine)、UML模型和马尔可夫链等模型。1.有限状态机该类模型是用状态转移图来表示,并通过状态的覆盖来生成测试用例。这种模型可以将测试用的数据结合图的遍历算法自动生成输入的序列进行相应测试。该种测试模型可以充分结合形式语言与自动机理论来进行分析和设计,适用范围主要是反应式的软件,但由于模型构造的工作规模比较大,自动构造就成为了这一模型的一个关键点。2.UML模型又称为统一建模语言,是软件工程中面向对象设计与分析中常用到的规范化建模语言。该模型主要是利用状态图进行行为建模,状态图可以看作是有限状态机的扩展,强调了对复杂实时系统进行建模,提供了层次状态机的框架,即一个单独状态可以扩展为更低级别的状态机,并提供了并发机制的描述[4],因此UML使用状态图作对单个类的行为建模。43.马尔可夫链是一种以统计理论为基础的统计模型,可以描述软件的使用在软件统计测试中得到了广泛应用。马尔可夫链实际上是一种迁移具有概率特征的有限状态机,不仅可以根据状态间迁移概率自动产生测试例,还可以分析测试结果对软件性能指标和可靠性指标等进行度量[5,6]。另外,马尔可夫链模型适用于对多种软件进行统计测试,并可以通过仿真得到状态和迁移覆盖的平均期望时间,有利于在开发早期对大规模软件系统进行测试时间和费用的规划。马尔可夫链是统计测试的基本模型,在净室软件工程中得到了深入研究,在微软、Raytheon及美国联邦航空署(FAA)都得到了成功应用[7]。马尔可夫链可以用随机迁移矩阵或者带迁移概率的状态迁移图表示。基于马尔可夫链的测试充分性准则一般要求测试过程中对马尔可夫链迁移的覆盖与实际使用相同[6]。4.文法模型可以描述程序的语法。由于不同的文法等价于不同的状态机因此也可以视为状态机模型的变体。有关基于文法的测试可见文[8],这方面研究工作相对较少。2.3建模标准随着系统的增长,建模是捕获和再利用有关系统知识的一个非常经济的手段。对于一个测试团队来说,这些信息是非常宝贵的:一个测试工程师了解被测系统的行为需要占据的工作量,一旦这个信息被理解,该如何保存给下一个工程师、下一个版本或者更改要求呢?如果你处于测试的设计阶段,那么你是幸运的。但是更常见的是,这些信息被埋藏在一个测试脚本中,一旦改变或者丢失就只能等待重新发现。测试团队通过给系统构建一