欢迎访问世界大学城!
当前位置: 首页 > 资料大全

路径测试论文范文

更新:    发布:    点击数:

路径测试论文范文(精选6篇)

路径测试论文 第1篇

白盒测试[1]是基于程序的测试, 它根据程序的控制结构设计测试用例, 主要用于软件或程序验证, 测试产品的内部结构是否合理以及内部操作是否按规定执行。白盒测试要求对被测程序的结构特性达到一定程度测试覆盖[2], 并以软件中某类成分 (如语句、判定、条件、判定/条件、条件组合、路径) 是否都已得到测试来判断软件测试的充分性。基本路径测试[3]是白盒测试技术中测试覆盖率较强的一种测试方法。

2 基本路径测试方法的相关概念 (The concept of the basic path testing method)

在实践中, 一个不太复杂的程序, 其路径都是一个庞大的数字, 要在测试中覆盖所有的路径是不现实的。为了解决这一难题, 只得把覆盖的路径数压缩到一定限度内, 例如, 程序中的循环体只执行一次。基本路径测试就是这样一种测试方法, 在控制流图的基础上, 通过分析控制结构的环形复杂度, 导出执行路径的基本集, 再从该基本集设计测试用例。设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。

3 基本路径测试方法的测试步骤 (The step of the basic path testing method)

3.1画出程序的控制流图

程序流程图 (简称框图) 是一种程序控制结构的图形表示。控制流图 (简称流图) 是对程序流程图进行简化后得到的, 它可以更加突出的表示程序控制流的结构。控制流图中包括两种图形符号:结点和控制流线。结点由带标号的圆圈“○”表示, 可代表一个或多个无分支的语句、一个处理框序列和一个条件判定框 (不包含复合条件) 。控制流线由带箭头的弧或线表示, 可称为边, 它代表程序中的控制流。一条边必须终止于一个结点, 即使该结点并不代表任何语句。由边和结点限定的范围称为区域。

如果判断中的条件表达式是由一个或多个逻辑运算符 (OR、AND、NAND、NOR) 连接的复合条件表达式, 则需要改为一系列只有单个条件的嵌套的判断, 如图1所示。

3.2计算程序的环形复杂度

环形复杂度也称为圈复杂度, 它是一种为程序逻辑复杂度提供定量尺度的软件度量。用来衡量一个模块逻辑结构的复杂程度, 在数量上表现为独立路径条数, 是需要测试的基本路径数目的上限。有以下三种方法计算环形复杂度V (G) 。

方法1:V (G) =控制流图中区域的数量。边和结点圈定的区域叫做区域, 当对区域计数时, 图形外的区域也应记为一个区域。

方法2:V (G) =E (控制流图中边的数量) -N (控制流图中结点的数量) +2。

方法3:V (G) =P (流图中判定结点的数量) +1。

3.3确定基本路径集合

导出基本路径集, 列出程序的独立路径。一条独立路径是指和其他的独立路径相比, 至少引入一个新处理语句或一个新判断的程序通路。V (G) 值正好等于该程序的独立路径条数。

3.4设计测试用例

为了确保基本路径集中的每一条路径的执行, 根据判断结点给出的条件, 选择适当的数据以保证某一条路径可以被测试到, 设计测试用例的输入数据和预期输出, 确保基本路径集中的每一条路径的执行。

4 基本路径测试方法的应用 (The application of the basic path testing method)

三角形问题:输入三个整数a、b和c分别作为三角形的三条边, 通过程序判断有这三条边构成的三角形类型是:等边三角形、等腰三角形、一般三角形或非三角形。利用基本路径测试法对三角形问题进行测试用例设计。主要代码如下所示 (注:数字1-16是语句编号, 方便绘制控制流图, 编程时不用写入) 。

第一步:绘制控制流图, 如图2所示。 (注意:复合条件语句, 需改复合条件的判断为一系列单个条件的嵌套)

第二步:计算程序的环形复杂度V (G) , 分析如下:

1.控制流图中有9个区域。

2.V (G) =20条边-13结点+2=9。

3.V (G) =8个判定结点+1=9。

所以, 程序的环形复杂度V (G) =9。

第三步:确定基本路径集合。根据环形复杂性V (G) 的计算, 导出基本路径集, 列出程序的独立路径 (用题中给出的语句编号表示) 。设计时注意要点:从较短路径顺序增加, 每个分支尽可能走一次。可得出基本路径集中独立路径如下:

第四步:设计测试用例。根据基本路径集中9条独立的路径, 设计满足上面基本路径集的测试用例, 详见表1。

5结论 (Conclusion)

白盒测试又称为结构测试, 逻辑驱动测试。测试人员可以访问程序员的代码, 并通过检查代码来测试, 可以看到盒子里面程序的内部结构。基本路径测试是白盒测试技术中测试覆盖率较强的一种测试方法。本文重点介绍了基本路径测试方法的相关概念, 分析了使用基本路径测试方法设计测试用例的过程, 最后结合实例说明使用基本路径测试方法设计测试用例的应用。

摘要:本文分析了白盒测试中基本路径测试方法的相关概念, 阐述了利用基本路径测试方法设计测试用例的过程, 最后通过实例说明基本路径测试方法的使用。

关键词:软件测试,白盒测试,基本路径测试

参考文献

[1]陈卫卫.软件测试[M].西安:西安电子科技大学出版社, 2011.

[2]魏琴, 梅佳.软件测试技术 (基于工作过程) [M].北京:电子工业出版社, 2012.

路径覆盖测试数据进化生成系统 第2篇

关键词:软件测试,遗传算法,路径覆盖,测试数据生成,原型系统

0 引言

软件测试是软件开发中不可缺少的环节, 是软件工程的重要组成部分, 测试的效果直接关系到软件产品的质量。已有统计结果表明, 软件测试占整个软件开发周期总成本的50%以上, 包括:说明测试需求、准备测试数据、执行测试, 以及评价与分析测试结果等耗时、枯燥也是非常困难并容易出错的环节。在软件测试工作中, 最重要的环节就是测试数据的生成, 这也是非常耗时的一个环节, 测试数据的合理、准确与否常常关系到整个测试的成败。因此, 如果将该环节自动化, 无疑将会缩短软件的开发周期, 提高软件质量。

目前, 国际和国内的一些研究机构针对不同语言编写的程序, 开发出路径覆盖测试数据生成系统, 其中, Scott开发的系统是针对Fortran语言的, 但只考虑了有限的Fortran语句, 如if语句, 和一些简单的算术分支谓词和变量类型;Ferguson和Korel开发了一个名为TESTGEN的测试数据生成系统, 该系统支持Pasca1语言编写的程序模块的测试数据生成。这个系统具有以下限制:只支持整型数据的生成、简单的算术和布尔分支谓词, 以及Pascal语言的一个子集;此外, 一些很重要的元素却不能应用, 如过程等[1]。刘义等开发了一个C程序路径覆盖及测试数据自动生成系统, 该系统只针对分支覆盖准则;陈继锋等[2]设计了一种面向路径的测试数据自动生成工具, 但是, 使用的测试数据生成方法是基于改进后的松弛迭代法, 需要用户实现的初始操作多, 从而对非专业的软件测试人员难以使用;周晓宇等[3]设计了两两组合覆盖测试数据自动生成工具, 但该工具生成的测试数据都只是最优值的近似解;李宝林等[4]提出的面向路径的测试数据自动生成工具采用的是遗传模拟退火算法, 在路径选择和测试数据生成方法方面均有待改进。

上述系统大多未使用遗传算法或仅使用传统的遗传算法, 遗传算法的个体编码方式、适应值计算、选择方式、交叉方式, 以及变异方式等均只有一种方法, 测试数据生成的效率有待提高。鉴于此, 使用VC++6.0开发一套基于遗传算法的路径覆盖测试数据自动生成系统, 该系统不仅能够根据用户选择的测试路径, 使用遗传算法自动生成穿越目标路径的测试数据, 而且在生成测试数据的过程中, 分别提供了多种遗传算法个体编码、适应值计算、选择、交叉, 以及变异方式等, 可根据不同类型的被测程序选择不同的测试数据生成方法, 以用于C或C++语言编写的被测软件测试数据自动生成。

1 路径覆盖测试数据自动生成系统的结构

路径覆盖测试数据自动生成系统的工作原理:对于给定的被测程序, 首先生成程序的控制流程图 (CFG) ;然后根据CFG由用户选择待测目标路径P, 系统内采用赫夫曼编码方式对目标路径P编码;最后使用遗传算法自动生成穿越目标路径P的测试数据。该系统分为三个模块:被测程序分析模块、测试系统界面管理模块, 以及测试数据生成模块。系统流程如图1所示。

1.1 被测程序分析模块

被测程序分析模块功能包括:被测程序分析、控制流程图生成, 以及目标路径生成等。在对被测程序测试之前, 首先要对被测程序的输入变量及程序的结构等进行人工分析, 得到与待测路径和测试数据生成相关的信息;然后根据被测程序的结构特征, 生成程序的控制流程图;最后通过控制流程图提供的路径信息, 在被测程序所有可能的路径中选择一条或多条路径作为目标路径, 并采用赫夫曼编码将目标路径表示成二进制串。目标路径是测试数据生成的输入参数之一, 根据目标路径编码设计适应度函数, 能够有效提高测试数据生成的效率。

1.2 系统界面管理模块

系统界面管理模块通过一个交互界面负责与用户交互, 包括接收用户的输入及输出相应的信息, 主要功能有被测程序插装、测试系统输入输出处理、系统外部变量处理, 以及客户测试参数设置等。

在执行被测程序过程中, 为了反映测试数据在程序执行中穿越的路径, 需要在被测程序中插入一些变量, 用变量的不同值代表执行分支语句的不同走向, 并用数组存放变量的取值。由于该系统采用赫夫曼编码方式表示路径, 被测程序插装时只需考虑分支语句, 大大简化了插装的工作量。

测试数据生成系统的运行方式主要由测试参数决定的, 不仅涉及到问题的描述及测试路径的选择, 而且涉及到模块之间的通信。例如, 除了遗传算法的选择、交叉和变异算子, 以及染色体编码方式和适应度函数等策略外, 被测程序分析模块得到的输入变量和目标路径也需设置后, 才能使系统按照用户的需求正常运行。生成的程序控制流程图将在系统交互界面的图形窗口中以图像的方式显示, 以指导测试路径的选择, 生成的测试数据则以表格的形式给出, 包含每条目标路径对应的测试数据、生成该数据所需的运行代数, 以及运行时间等信息。

1.3 测试数据生成模块

测试数据生成模块是系统的核心, 主要功能是根据上述用户设定的策略和参数, 调用系统相应的函数, 生成被测程序的测试数据, 以及与界面管理模块交互。

在使用遗传算法生成被测程序的测试数据之前, 需要首先接收系统界面管理模块传递的策略和参数, 包括选择、交叉和变异算子, 交叉和变异概率, 种群规模, 进化终止代数, 染色体编码方式, 适应度函数, 被测程序的输入变量, 测试路径, 实验次数, 以及种群的初始化方法等;然后调用算法相应的函数, 在后台完成测试数据生成的功能, 并将生成的测试数据传递给系统界面管理模块, 在系统界面中显示出来。

2 遗传算法的路径覆盖测试数据自动生成方法

使用遗传算法生成被测程序的测试数据时, 首先随机生成算法的初始种群, 然后重复做以下操作:解码进化个体、运行被测程序, 以及检查是否有个体穿越目标路径。若有, 则记录该个体, 删除找到的目标路径。如果没有满足终止条件, 计算个体适应值并执行选择、交叉和变异操作, 以生成新的种群, 直到覆盖全部目标路径的测试数据找到, 或者达到最大进化代数为止。此时, 终止算法并解码最优个体, 以得到期望的测试数据。

2.1 目标路径描述

目标路径采用赫夫曼编码方式表示, 赫夫曼编码是以分支节点的执行情况表示路径, 若分支语句的真分支采用1表示, 假分支采用0表示, 那么, 该程序的一条路径就可以用二叉树[5]的叶结点的赫夫曼编码表示, 这样, 路径编码能保证任何一个目标路径的编码都不是其他编码的前缀。根据目标路径编码, 设计3种目前国内外研究比较成熟的适应度函数, 有效改进了测试数据的生成效率。

2.2 适应度函数

适应度函数是遗传算法与被测程序的接口, 对遗传算法的收敛速度和生成的测试数据影响很大, 因此, 将测试数据生成问题转化为函数优化问题的关键是适应度函数。依据前期的理论和实践, 在测试数据自动生成系统中, 使用的适应度函数有以下3种:层接近度、分支距离, 以及层接近度和分支距离的综合。

2.3 个体编码方式

个体的编码方式直接影响进化种群的遗传操作以及测试数据生成的效率。根据软件测试的实际需求, 系统提供了遗传算法常用的3种编码方式:二进制编码、格雷码编码, 以及实数编码, 供用户在生成测试数据时根据需求选择。

2.4 遗传算子

在测试数据生成系统中, 遗传算法在控制参数下的运行过程如图2所示。首先系统接收用户设置的控制参数;然后调用遗传算法相应的函数对种群进行选择、交叉和变异操作, 从而产生新种群;最后解码新种群中的最优个体, 获得期望的测试数据。如此循环, 直到找到全部期望的测试数据为止。在测试数据生成过程中, 选择、交叉和变异操作均通过控制参数的设置进行调用。

选择算子根据个体的适应值, 按照一定的规则, 从当前种群中选择优良个体遗传到下一代种群[6]。系统采用了3种常用的选择方法, 分别是:轮盘赌、随机联赛和随机竞争。

交叉算子体现了信息的交换思想, 将当前种群内的各个体随机搭配成对, 对每一对个体, 以某概率 (称为交叉概率Pc) 交换它们之间的部分染色体。交叉概率可在系统的交互界面中设定, 其大小直接影响交叉算子的性能。系统提供了3种交叉方法可供用户选择:单点交叉、多点交叉和均匀交叉。

变异算子对个体编码串的某些基因位上的基因值作变动, 变异概率Pm的大小可在系统的交互界面中设定, Pm的大小也直接影响算法的性能[6]。不同的编码方式的变异算子也不尽相同。根据上述3种个体编码方式, 系统提供了4种变异算子:基本位、实值、均匀和非均匀变异。

基于遗传算法的测试数据自动生成步骤:

(1) 插桩被测程序, 对被测试程序的路径编码, 并对算法所需的控制参数赋值。

(2) 初始化种群。

(3) 解码进化个体, 作为输入运行被测试程序。

(4) 判断个体是否有穿越目标路径的, 若有, 保存与该进化个体对应的测试数据, 从目标路径中删除该路径。

(5) 判断是否满足算法终止条件, 若是, 转步骤 (7) 。

(6) 根据适应度函数计算进化个体适应值;实施选择、交叉和变异操作, 生成子代进化种群, 转步骤 (3) 。

(7) 终止种群进化, 解码进化个体, 输出测试数据。

2.5 对比算法—基于随机法的测试数据生成

在测试数据生成系统中, 随机法作为遗传算法的对比算法。与遗传算法不同, 随机法不采用进化操作, 每一代种群都是随机生成的, 且运行被测程序, 检查是否有穿越目标路径的测试数据, 如果有, 则记录该数据并删除找到的目标路径。如果生成了全部目标路径的测试数据, 或达到最大运行代数, 则终止算法。在系统界面管理模块中, 如果用户选择随机法生成测试数据, 可对算法的种群规模、最大运行代数, 以及实验次数等控制参数进行设置。随机法与遗传算法生成测试数据的具体步骤类似。

3 应用实例

3.1 系统用户界面

系统基于VC++6.0开发, 采用基于对话框的程序结构, 用户界面主要由菜单栏、参数设置区和文档区组成, 其中, 文档区由程序区、程序控制流程图显示区, 以及结果输出区组成。用户界面窗口显示分为4部分:左边为控制参数设置区, 中上方为程序区, 中下方为结果输出区, 右边是程序控制流程图显示区。

3.2 系统运行顺序

基于遗传算法的路径覆盖测试数据生成系统运行顺序:首先启动系统, 导入被测程序, 并根据被测程序的控制流程图选择测试路径;然后在系统界面中对算法的控制参数赋值, 对被测试程序的路径编码, 插桩被测程序;最后执行遗传算法, 生成测试数据, 并将结果呈现给用户。

3.3 在三角形分类程序中的应用

系统的实验环境:CPU P4、2.8GHz主频和1GB内存。采用三角形分类程序验证系统的有效性, 并将遗传算法和随机法生成的测试数据进行比较。插装后的三角形分类程序的C语言代码如图3 (a) 所示, 其流程如图3 (b) 所示, 图3 (b) 给出了路径的编码, 4条路径分别是:不能构成三角形的测试数据穿越的路径, 编码为1;构成非等边三角形的测试数据穿越的路径, 编码为01;构成等边三角形的测试数据穿越的路径, 编码为001;以及构成等腰三角形的测试数据穿越的路径, 编码为000。这样, 所有的路径可以编码为1 01 001000。

根据目标路径1 01 001 000, 在控制参数设置区分别给相应的参数赋值, 然后采用遗传算法和随机法各运行10次, 两种方法均使用随机产生的初始种群, 执行插装后的程序。实验过程中, 记录每次找到各路径的测试数据需要的进化代数, 并求其10次运行的平均值, 运行结果分别如图4和图5所示。运行系统, 找到全部4条目标路径的测试数据, 遗传算法需要的平均进化代数是21.20, 而随机法需要的平均进化代数是900.30, 前者仅是后者的2.35%。在进化时间上, 遗传算法需要的进化时间为0.016s, 而随机法需要0.641s, 前者仅是后者的2.50%。

4 结语

开发一种基于遗传算法的路径覆盖测试数据自动生成系统, 该系统能够根据用户选择的目标路径, 自动生成穿越该路径的测试数据, 提高了软件测试的效率, 节约了软件开发资源。该系统还存在不足之处, 如仅考虑了C或C++代码编写的被测程序, 被测程序的插装还不能够自动实现, 测试充分性准则还比较单一等, 需要进一步研究。

参考文献

[1]刘义, 万琳.C程序路径覆盖及测试数据自动生成系统[J].中国科教博览, 2005, 7 (1) :44-46

[2]陈继锋, 刘树锟, 王志海.面向路径的测试数据自动生成工具的设计[J].计算机工程与应用, 2010, 46 (15) :53-56

[3]周晓宇, 聂长海, 徐宝文, 等.两两组合覆盖测试数据自动生成集成工具的设计与实现[J].计算机科学, 2005, 32 (1) :118-119

[4]李宝林, 李志蜀, 陈良银, 等.面向路径的测试数据自动生成工具[J].计算机工程, 2007, 33 (15) :7-9

[5]严蔚敏.数据结构:C语言版[M].北京:清华大学出版社, 2002

路径测试论文 第3篇

嵌入式软件在嵌入式系统中越来越重要,嵌入式软件的可靠性成为软件开发中的重要因素。路径覆盖作为软件可靠性测试的重要指标,在嵌入式软件测试中应用越来越广泛。然而,由于工程中的代码逻辑复杂分支繁多,完全的路径覆盖测试用例个数会随着程序中分支的增加呈指数级增长[1],造成测试成本过高。为了兼顾软件可靠性和测试成本,从众多路径中选出关键路径进行测试成为近年来嵌入式软件测试研究的重要课题。

传统的关键路径求解算法往往是分别求出所有路径的最早发生时间和最迟发生时间,以及每项路径的最早开始时间和最迟开始时间,然后判断哪些路径是关键路径,算法过程复杂。对此,一些研究人员对传统的算法进行了改进,文献[2]在广度优先搜索的基础上,给出了一种求解关键路径的算法。该算法采用图的十字链表结构形式,不需要拓扑排序来求解关键路径。然而,此算法需要对图进行3次广度优先搜索才能输出所有关键活动,而且不能将所有的关键路径输 出。文献[3]在深度优 先搜索的 基础上,求出从源点到汇点的所有路径,经过分析比较求取关键路径。由于在求解过程中需要进行多次递归回溯,算法的执行效率较低。同时,传统的路径覆盖测试用例设计,是通过人工分析各个判定中的条件来确定用例中各个变量的取值,对于程序较为复杂的判定,这种方法往往效率较低,而且容易出错。

针对上述问题,本文提出了一种全新的关键路径覆盖测试方法。首先利用程序的AOE网的邻接矩阵生成矩阵APM算法,求解出待 测程序的 关键路径,然后,基于LCSAJ的概念设计相应的测试用例。这种方法不但可以输出所有关键路径,而且提高了关键路径的生成效率。同时,由于存在大量的测试工具可以进行LCSAJ分析,因此可以快速准确地完成测试用例的设计。总之,这种方法在保证软件的可靠性前提下,不仅合理地分配了测试资源,而且大大提高了测试的自动化程度。

1基本概念

1.1关键路径

控制关系是一个程序正常运行的关键因素,通常用控制流程图来表征。控制流图中有两个要素,如图1所示,结点以标有编号的圆圈表示,代表一个或多个无分支的语句;控制流以箭头表示,表征控制的顺序[4]。为了评估程序的控制结构,控制流图中的连接加入连接权值a~e,通常把这种带权值的控制流图称为AOE网。AOE网中入度为零的点称 为源点,出度为零 的点称为 汇点。通常AOE网中从源点出发到汇点结束的有序结点序列称为该AOE网的路径。路径中连接权值的和称为路径长度。通常,一个AOE网中最长的路径就叫关键路径。

AOE网也可以表示成矩阵的形式,称为AOE网的邻接矩阵。一个邻接矩阵是一个方阵,其行列数目为AOE网中的结点数,行列依次对应被标识的结点,矩阵元素对应到相应结点间的连接。元素a~e的值代表连接权值。图1对应的邻接矩阵如图2所示。

1.2线性代码与跳转

LCSAJ(linearcodedsequenceandjump)是指可执行代码的线性序列,这个序列的开始可以是程序的开始或控制流中可能跳转的一个起点,它的终点可以是一个明确的控制流跳转点或程序的结束[5]。这个线性代码序列可以由一个或多个连续的基本模块组成。因此,为了控制流执行线性代码序列和跳 转,必须有相 应的代码 满足相关 条件。一个LCSAJ由3个要素———开始行、结束行、跳转目的行组成。程序的一条路径可能由几个首尾相连LCSAJ组成,其中第一 个LCSAJ起点为程 序起点,最后一个LCSAJ的终点为程序终点。

路径的执行关键就是代码中每一个谓词条件的选取。基于LCSAJ概念,将源代码分割成若干子代码段,通过组合即可实现相应的路径覆盖。现在有许多测试工具可供LCSAJ分析,故可借助这些工具得到相关路径对 应的谓词取值组合,进而准确迅速地完成指定路径的覆盖测试。

2求解关键路径

2.1权值确定算法

2.1.1权值影响因子

(1)分支执行概率。嵌入式软件往往有实际的应用背景,因此当程序运行到判决结点时,不同的分支选择通常对应着不同的物理意义,当程序运行到判决结点时,相应分支执行的概率将影响这些分支权值的确定。事实上,此概率值通常要根据软件用户的使用情况确定。

(2)函数接口参数。被测函数的接口参数包括传值参数、引用参数、指针参数3种类型。传值参数调用单元函数时传给函数的实参并不因函数调用而改变,而引用参数会因函数的调用而存在随时被修改的危险。指针参数虽然不会因为函数的调用改变传入实参的地址,但会因此存在指针指向的变量值被修改和指针指向内存单元改变的可能[6]。综上所述,指针参数在函数调用时情况最复杂,因此设定权值为2。引用参数次之,设定权值为1.5。权值参数最低,设定权值为1。式(1)表示函数的接口参数对任一分支连接的权值加权值Hc的算法,其中Nd为该连接的传值参数个数,Na为引用参数的个数,Np为指针参数的个数。

(3)全局变量。全局变量的作用域从定义开始,到程序结束终止,其影响范围相对较大,全局变量使得程序各模块之间的耦合度增加,函数依赖这些全局变量。当一个全局变量值被误操作时,会对其它模块造成影响。由于全局变量对源程序影响很大,测试时要特别小心,因此设定权值为3。式(2)表示函数的全局变量对任一分支连接的权值加权值Hg的算法,其中Ng为该连接的传值参数个数。

(4)局部变量。局部变量的作用域是从变量定义开始到该单元函数结束终止。局部变量的影响区域表示了该函数对该局部变量的敏感性。当局域变量值改变时,仅影响函数内部作用域的语句,相对全局变量来说,其影响范围较小,因此其权值设为1。式(3)表示函数的局部变量对任一分支连接的权值加权值Hc的算法,其中Nd为该连接的权值参数个数,Na为引用参数的个数,Np为指针参数的个数。

2.1.2权值的数学模型

通常,控制流图矩阵中的连接权值初始值设为1。根据以上权值影响因子对分支连接权值的影响,可以得到该连接的附加权值,最终将两 部分相加 便可得到 最终的权值,如公式(4)所示。其中Wij表示i结点到j结点之间的连接权值,Pij表示该连接的执行概率。

2.2关键路径求解算法

关键路径求解算 法实际上 是利用被 测程序的AOE网络邻接矩阵G[i][j]来生成全路径矩阵APM的过程。APM顾名思义,其每行分别代表程序可能的执行路径及其路径的累加权值。矩阵的最后一列为每条路径的权值和,其余每个元素分别代表了该路径中的各个结点号。

具体算法描述如下:1初始化矩阵APMG,存储每条路径的权值累加值向量a[n];2在邻接矩阵G的第一行中逐一查找所有的非零元素,并在APMG中记录相应的列号和此行的直接后序结点数k,最后累加APMG中前k行相邻元素间的权值,并存在a[n]中;3设i=2,m为G的行数;4若i>m,则转至8,否则查找G的第i行,依次找出非零元素的列号,共计cout个;5查找APMG中元素最大值等于i-1的行。若查找到,则执行步骤6;若查找不到,则转至步骤7;6将找到的APMG行复制count-1个,然后依次将步骤4找到的结点列号添加到APMG中,上述找到的APMG行和复制生成的行相应列进行更新,最后累加 更新后的APMG权累加值;7继续查找APMG中满足步骤5条件的行。若找 到,则转至步 骤5继续执行;若查找不到,则转至步骤8;8i=i+1,返回步骤4;9结合APMG和a[n]生成输出的APM矩阵,每行即为一个程序执行路径;瑏瑠APM中最后一列的最大元素所在行即为关键路径,结束。

3实例分析

为了验证上述关键路径覆盖测试方法,以下面的程序为例加以分析说明,程序代码如下:

3.1静态分析

对上面代码进行静 态分析,可以得到 相应的控 制流图,如图3所示。

同时,通过静态分析还可得到源代码中变量的类型以及定义使用情况,进而根据式(4)的权值数学模型计算得到图3中相应的连接权值,结果如表1所示。将图3的连接赋以表1中求得的权值,即得到源代码的AOE网。

3.2求解关键路径

根据图3生成的AOE网生成邻接矩阵G,具体如公式(5)所示。

根据求解关键路径算法,MATLAB仿真可以得到矩阵APM,如公式(6)所示。从式(6)可以看到,矩阵的每一行即代表一条程序路径,分别为(0,1,2,3,5,6,7,9,10)、(0,1,4,5,6,7,9,10)、(0,1,2,3,5,6,8,9,10)、(0,1,4,5,6,8,9,10),对应的路径权值分别为19.3、14.7、20.6、16,故得出路径(0,1,2,3,5,6,8,9,10)的权值最大,此即为所求的关键路径。

3.3基于 LCSAJ关键路径覆盖测试

利用自动化测试工具Testbed对被测源代码进行分析。首先,得到源代码的LCSAJ表,如表2所示,LCSAJ由3个要素即3个行号(A,B,C)来确定标识,其中A是开始行,B是结束行,C是跳转目的行。表中的每个LCSAJ的3个行号均对应待测源代码中的标识行号。

其次,Testbed还提供了各个LCSAJ的组合关 系表(LCSAJPreconditionTable),结合步骤2得到的关键路径(0,1,2,3,5,6,8,9,10),经过简单分析可以得出,关键路径对应的LCSAJ组合对应表2中的LCSAJ编号序列(3,10,14)。

最后依照Testbed分析给出 的LCSAJ内部条件 表(LCSAJInternalConditionTable),可以迅速得出此条关键路径对应的判定条件组合为((x>3)&&(z<10)),x≠4和*y≤5,即最终的关键路径覆盖测试用例只需满足:Ψ={(x,y,z)|(x>3)&&(x≠4)&&(*y≤5)&&(z<10)}。经验证,上述测试用例在程序实际运行中可以完整地执行,实现了该代码关键路径的最终覆盖。

采用本文关键路径覆盖测试,在保证关键路径覆盖的同时,语句覆盖达到71%,分支覆盖达到50%。在此基础上只需再补充1个用例即可实现相关软件测试需求中的语句和分支的100%覆盖。相比传统的随机生成用例的路径覆盖测试方法,本方法可以有针对性地调整测试用例的优先级,达到在测试资源有限的情况下,优化测试资源分配、提升测试效率的目的。

4结语

本文针对传统的路径覆盖方法存在工作量大不易实施的问题,提出了一种易于操作的路径覆盖测试方法。首先利用AOE网生成矩阵APM算法求出待测程序的关键路径,然后利用自动化测试工具对程序进行LCSAJ分析,最终在其辅助下完成关键路径覆盖的测试。实践证明,该方法不仅提高了关键路径的求解效率,而且简化了路径覆盖测试用例的设计过程,因而在实际工程中节省了测试资源,提升了测试效率。

摘要:嵌入式软件的复杂度越来越高。作为软件可靠性测试的一种重要方法,完全路径覆盖在实际项目测试中越来越不现实。针对这种现状,提出了一种易于操作的关键路径覆盖测试方法。该方法利用AOE网生成全路径矩阵(APM)算法求出待测程序的关键路径,然后利用自动化测试工具对程序进行线性代码与跳转(LCSAJ)分析,最后在其辅助下完成关键路径覆盖测试。实验结果表明:在保障软件可靠性的前提下,该方法节约了测试成本,显著提升了测试效率,具有一定的工程应用价值。

路径测试论文 第4篇

在软件测试过程中,一个不太复杂的程序,其路径数都有可能是一个庞大的数字,使得完整的路径覆盖很难实现,因此测试时需要对路径进行选择,以减少测试路径的数量,使得覆盖这些有限的路径成为可能。

本文提出一种基于路径重要程度选择测试路径的测试用例设计方法,其主要思想是将被测软件流程图中的节点按其重要程度进行加权,然后按照不同执行路径的权值由高到低的顺序依次选择测试路径。

基于路径重要程度的选择方法分为三个主要步骤:确定函数权值、确定软件的加权图和按权值进行路径选择。

2 确定函数权值

函数权值的确定主要依据函数输入、输出和函数可能对软件或系统产生的影响三个因素,通过对三者综合评价,给出函数的权值。

2.1 函数输入的分析

函数调用时,实参对形参变量的数据传递是将实参值拷贝到形参变量中,根据被传递数据的性质,函数调用可分为传值调用、引用调用和传址调用。

2.1.1 传值调用

用普通数据充当函数参数,函数调用开始后,系统为形参开辟一临时存储区,将各实参值拷贝给形参,形参即得到实参值。由于实参、形参占用不同的存储单元,形参的变化不会影响实参。传值调用中,实参值不会因被调用函数的误操作而丢失、破坏。

2.1.2 传址调用

传址调用传递的数据是地址值,即变量的地址、数组名和函数名等,在这种情况下,把实参变量的地址或数组名传递给形参变量,在函数内部用这些地址进行操作。

2.1.3 引用调用

引用调用方式,实参用变量名,形参用引用,通过对引用的操作,相当于对被它引用的变量进行操作,对引用的改变,实质上就是改变实参的变量值,它的作用与传址一样的,但是比传址更方便、更直接。

上述三种调用方式中,经过传值调用,实参值不会因被调用函数的误操作而丢失、破坏,而传址调用和引用调用会使所传递的参数处于随时被修改的危险中;另外,由于传址调用和引用调用会改变函数的自变量,若没有注意到这些函数调用后自变量会发生变化,而当作原来的自变量使用时也会出错。因此传址调用和引用调用应比传值调用赋予更大的权值。

2.2 函数输出的分析

类似于函数的输入参数,函数的返回值除了能返回普通数据外,也可以返回指针和引用。类似地,返回指针和引用较之返回数值,避免了栈空间中临时变量的产生,使程序的执行效率和空间利用率都得到了提高,给函数调用带来了极大的灵活性和很高的效率,但同时也可能给程序引入更多的错误。因此,返回指针和返回引用的函数比返回数值的函数应被赋予更大的权值。

2.3 函数失效的影响

每一个函数都有一个适用范围,如果函数的约束条件不能满足,则调用函数就不能产生正确响应;或者函数本身的设计实现上就存在错误,也会导致失效。函数失效可能产生的影响不尽相同,可以分为以下几类。

2.3.1 不影响其它函数

函数的失效仅限于自身,不会将错误扩散到其它函数或影响系统的使用,例如,输出函数执行信息时出现拼写错误。一般来说,不影响其它函数的情况比较少。

2.3.2 影响其它函数

函数的返回值是另一个函数的输入值,或者函数修改了全局变量等情况下,函数的缺陷造成的影响不仅限于自身,还会传递到其它函数,这种传递的影响可以用影响区域进行度量。

2.3.3 影响系统

函数的失效会导致软件异常退出或系统死机等严重后果。例如在有动态内存分配的程序中,往往存在多种与动态内存管理有关的错误,如内存泄漏、内存的重复释放、空指针引用等,这些错误会导致系统失效甚至崩溃;在进行科学计算的程序中往往会存在非法计算类故障,非法计算是指计算机不允许的计算,有些非法计算类故障产生后,会导致系统强行退出;在使用缓冲区或数组等结构时,由于未进行严格的边界检查,可能导致溢出错误,这些错误在某些情况下也会导致系统失效甚至崩溃。这些函数应被赋予最高等级的权值。

2.4 函数复杂度的分析

对于用户自编的函数,在确定其权值时,除了考虑上述因素外,还需考虑函数的复杂度,因为程序的复杂度越高,说明其控制逻辑越复杂,则出错的可能性也相应地增大。复杂性度量可以使用Mc Cabe圈复杂度。实践表明,对于V(g)≥10的控制流图所对应的程序,一般就比较复杂了。复杂度高的函数,在路径选择时,较之复杂度低的函数,应被赋予高权值。

2.5 函数功能的分析

上面的讨论因素多侧重于函数的结构,在确定权值时,函数的功能也应作为一个重要的参考因素。不同的函数,实现的功能是不同的,这些功能对系统的影响也是不同的。例如,实现系统基本功能的函数,可能会被其他功能模块多次调用,这些函数的可靠性对于系统的可靠性有很大的影响,应被赋予高权值;对于实现系统核心功能的函数,反映的是用户最为关注的功能,相对于其他的辅助功能特性而言,应被赋予高权值使其得到充分测试,以确保软件核心功能的高可靠性。

2.6 函数权值的计算

以上讨论的确定权值的参考因素中,有些可以通过分析得到确切的值,例如函数的圈复杂度V(g)或者函数的影响区域等;而有些因素对权值的影响不易量化,例如函数功能对权值的影响,这种影响不易量化为一个确切的值,这种情况下,可以做如下的处理:首先确定下各函数能够量化的因素,由前面的内容可以看出,这些因素主要是结构方面的,求出下节所述加权图的最大长度路径的权值,设为max;然后主要从函数功能的角度,可以综合考虑其他不易量化的因素,将需要重点测试的函数进行排序;最后综合前两项确定各个函数的权值。用数学语言描述如下:

设软件共有n个函数,k条路径。其中有m个函数的功能实现正确与否是我们所关注的,应作为测试的重点,经过这m个函数的路径共有km条,每条路径覆盖这m个函数中的一个或多个。采用如下的步骤为每个函数确定权值:

1)从函数的结构角度为每个函数加权,主要考虑函数的复杂度及其影响区域,这些因素都可以直接量化为权值;

2)求出这时最大长度路径的权值,设为max;

3)主要从函数功能的角度,将需要重点测试的函数进行排序,不妨设排序后的函数顺序为f1,f2,⋯,fm,则这m个函数权值依次定为max+(m2-1)d,⋯,max+m(m-1)d+2d,max+m(m-1)d+d,max+m(m-1)d,d>0为排序后这m个函数中相邻两个函数权值的差值,其余函数的权值不变。

通过采用上述方式加权,可以得到如下的测试效果:对于由n个函数构成的,共k条路径的软件,其中有m个函数需重点测试,通过采用按路径权值由高到低的顺序选择出的w条路径进行测试,可以最优地测试到这m个函数。

3 确定软件的加权图

3.1 控制流图简化

在生成软件的加权图时,首先要消除控制流图中的环路,因为路径选择是按权值由高到低的顺序进行的,而环路所代表的循环,其循环次数在加权图的邻接矩阵中无从体现,不消除环路,则在选择路径时会因不断计算循环体内函数的权值而陷入死循环。在生成路径时,控制流图中的某些节点处于程序中的同一个分支上,这种节点在路径选择时并无特殊用处,因此可以将流图进一步简化,将与路径选择无关并且与其它节点合并后不影响对程序流图分析理解的节点合并简化掉。例如图1所示的控制流图中,节点3、6、8不影响路径选择,将其合并及消除图中环路后得到的结果如图2所示,节点2虽然在通过节点1、2、9的路径上对路径选择没有影响,但该节点是分支节点1的一个分支,不能被合并。做了上述处理后,在简化后的控制流图上选择的路径等价于在原流程图中选择的路径。

3.2 弧权值确定

通过第一步的分析,可以得到流程图中每个节点的权值,在简化流程图的过程中,被合并的节点的权值应被加入到合并后节点的权值上。在后续的加权路径选择算法中,是对图的弧进行加权的,因此这里还要将节点的权值转化为弧的权值。因为出口节点是每条路径都要选择的节点,其权值对于路径选择没有影响,因此,这里选择将每个节点的权值移到其流出弧上。若节点代表的是分支,则不应有节点被合并到该节点上;该节点流出弧权值的确定分为两种情况:若分支条件中不存在函数调用,只是数值比较,则该节点权值为0,这时,若该节点后的各分支都是正常处理流程,则所有流出弧上权值都为0,测试时各分支的优先级由分支中函数的权值决定,若存在异常处理流程,则代表异常处理分支的弧上应被赋予一个正数,使得异常处理分支在测试时优先得到测试;若分支条件中存在函数调用,则该节点的权值为调用的函数的权值(若调用了多个函数,权值为这些函数权值的和);类似于前面,这种情况下,同一个分支节点的流出弧上的权值也可能是不同的,代表函数调用失败的弧的权值要比代表调用成功的弧的权值高。对于消除循环而引入的分支,特别是将固定次数的循环展开成顺序执行序列的情况,分支内每个函数的权值只计一次。

4 按权值进行路径选择

4.1 最长路径计算

为了求得最长路径,本文采用一种类似于迪克斯特拉(Dijkstra)算法的方法,按路径长度的递增次序,逐步产生最长路径。首先求出从顶点v到其邻接节点长度最大的一条路径,然后参照它求出长度更长的路径,直到从顶点v到其它各顶点的最长路径全部求出为止。该方法实际上是求从单个顶点v到图中其它顶点的最长路径。

为了叙述方便,首先引入以下记号并作相应的约定。

1)向量D的每个分量D[i]表示当前所找到的从源点v0到节点vi的路径的最大长度;

2)向量S的每个分量S[i]表示从源点v0到节点vi的最长距离是否已求出,若已求出则S[i]=1,否则S[i]=0。

3)Edge为加权有向图G的邻接矩阵;

4)P为按照下述方法对Edge进行修正后得到的矩阵,它包含了所有关于最长路径的信息。由它可以求出入口节点到出口节点的所有最长路径;

5)Pre(u)表示u的前驱节点组成的集合。

对图3利用上述方法得到从源点到v5的最长路径为:v1v3v5,路径长度为90。

4.2 路径权值的计算与排序

通过以上计算,得到的路径是从入口节点到出口节点的最长路径,即权值最大的路径,但仅仅求得最长路径是不够的,路径选择算法需要解决按照权值由高到低的顺序依次选择执行路径的问题,即选择算法还应提供选择路径权值次于最长路径的方法。

因为P[w][u]=l代表从入口节点经过节点w到达节点u的最长路径为l,解决上述问题的一个办法是:依次选择矩阵P中值小于最长路径权值的项,设为P[w][u],以节点u为源点,重复执行路径选择算法,就可求得节点u到出口节点的最长路径,再加上v0到该点的最长路径,就是从v0经过节点u到达出口节点的最长路径(w,u=0,1,⋯n-1);选择其中最大的路径为第二条测试路径,长度次之的为第三条路径,以此类推。为了简化运算过程,这里选择另外一种计算节点u到出口节点的最长路径的方法:通过一次运算过程求出所有节点间的最长路径,这样做可以避免重复执行迪克斯特拉算法。

一次运算求出所有节点间最长路径算法的思想如下:初始时,以任意两个节点之间的直接有向边的权值作为路径长度,对于任意两个节点vi和vj,若它们之间存在有向边,则以此边上的权值作为它们之间的最长路径长度;若它们之间不存在有向边,则以-1作为它们之间的最长路径。以后逐步尝试在原路径中加入其它节点作为中间节点。如果增加中间节点后,得到的路径比原来的路径长度增加了,则以此新路径代替原路径,修改矩阵元素,代入新的更长的路径长度。以此类推,在任意一对节点vi和vj间尝试加入n个节点,最终得到的路径即为vi和vj间的最长路径。

为了描述算法的方便,引入以下记号:

1)n阶方阵序列A(-1),A(0),A(1),⋯,A(n-1),其中:

A(0)[i][j]是从节点vi到vj,中间节点是v0的最长路径的长度;A(k)[i][j]是从节点vi到vj,中间节点序号不大于k的最长路径的长度;A(n-1)[i][j]是节点vi到vj的最长路径长度。

2)pa th[i][j]=p表示节点vi到vj的路径上,vj的前驱节点为vp。

将该方法用于图3所示的例子中,得到如下的结果(A[4][4]由于路径选择的需要,被函数findmax赋值为0):

结合矩阵P和矩阵A可以得到取值仅次于D[4]的是P[0][4]+A[4][4]和P[3][4]+A[4][4],可得到路径v1v5,v1v2v4v5,路径长度为70。此过程继续,得到的结果是P[2][3]+A[3][4],对应的路径是v1v3v4v5,路径长度为60。至此,按照权值由高到低的顺序依次得到了图3的全部4条路径。

5 结束语

按权值进行路径选择后,以此为基础为每条路径选取测试数据,构造测试用例。一条路径可以对应多个测试用例。在选取测试数据时,可以充分利用边界值选取等方法和基于路径的测试数据自动生成方法。得到了输入和预期输出等测试数据后,就完成了测试用例的设计。

基于路径重要程度的测试用例设计方法同其它测试用例设计方法一样,也存在优点和局限性。优点在于能够设计出针对软件中更容易出现错误之处的测试用例,或软件中更容易隐藏错误之处的测试用例,这样可以更有针对性地开展测试工作,合理分配测试资源,安排测试进度,提高测试效率,从而达到提高软件质量的目的。而路径生成时,不可达路径的可能产生,则是需要进一步考虑研习优化的地方。

摘要:测试用例的设计是软件测试的关键,它决定着软件测试的质量。提出了一种有较好针对性和指导性的基于路径分析的测试用例设计方法:基于路径重要程度的软件测试设计,并详细介绍了该方法的步骤,以及面向路径的测试数据生成技术和预期结果的生成技术。通过以上技术,合理分配各模块测试计划时间,有助于提高软件测试效率,保证软件质量。

关键词:路径测试,测试设计,软件测试

参考文献

[1]殷人昆,陶永雷,谢若阳,等.数据结构(用面向对象方法与C++描述)[M].北京:清华大学出版社,2006:283-289.

[2]徐凤生.一种求关键路径的新算法[J].计算机工程与应用,2005(24):82-84.

[3]Chow T S.Testing Software Design Modeled by Finite State Machines[J].IEEE Transactions on Software Engineering,1978,4(3):178-187.

[4]Fujiwara S,Bochmann G V.Test Selection Based on Finite State Models[J].IEEE Transactions on Software Engineering,1991,17(6):591-603.

路径测试论文 第5篇

关键词:场景测试法,蕴含关系,路径优化,场景蕴含图,状态蕴含

0 引言

场景测试法[1](Scenario Test)也称为用例测试法(Use Case Test),是一种软件黑盒测试方法,广泛用于复杂交互式软件测试,尤其适用于嵌入式软件的分布式测试。分布式测试中人员、设备和测试对象都具有特定的地理分布要求,导致测试场景的构建和撤销代价较大。如何通过减少场景数量、避免重建场景、优化场景切换路径来减少代价,提高测试效率,已成为一个重要且亟待解决的问题。场景测试法依据测试需求形成多个不同测试场景。测试实施中先建立场景、执行测试用例、撤销场景,再建下一个场景,如此循环直到完成所有场景。对于多场景执行次序目前缺乏科学有效的定义和方法指导。多场景执行次序如果选择不当,将导致重复建设和浪费。当测试失败时往往需要重建多个场景后重测,代价更大。

Jacobson在文献[2,3]中提出用例驱动的软件工程思想,在此基础上IBM Rational公司在RUP2000中提出场景测试法。该方法未说明多场景执行的次序。文献[4采用用例行为矩阵度量场景的优先级,通过该优先级对多个场景进行排序和路径合并,从而减少测试代价。文献[5]先依据用例事件流建立事件有向树,然后对该树进行路径搜索,最后合并子路径,提高场景重用率。文献[6]依据业务流选择部分场景优先测试,减少测试代价的同时保证功能可用性。以上研究大多侧重于测试场景的行为特征,而忽视场景结构特性。本文通过研究测试场景结构、复合状态分析、逻辑蕴含概念,通过状态蕴含和场景蕴含关系,探索一种新思路来减少多场景切换代价。

1 测试场景的构成与场景蕴含

首先分析场景简单切换的问题,给出状态蕴含和场景蕴含的关系。

1.1 测试场景的简单切换

在一般场景测试法中,测试一个场景s1前构建该场景,测试完成后需撤销该场景。场景切换就是撤销前一个场景并构建下一个场景的过程,如图1所示。

图1中假设场景s1的构建代价为b1,撤销代价为d1,场景s2的构建代价为b2,撤销代价为d2,那么在由s1切换到s2时,切换代价可量化为d1+b2,由s2切换到s1时,代价为d2+b1。这种切换称为简单切换。这种切换可能导致重复构建/撤销。以s1切换到s2为例,如果s1中的部分对象在s2中也要使用,那么切换时就额外增加了撤销和重建的代价。

简单切换的好处是可在任意两个场景之间进行切换,缺点是代价高。

将场景作为结点,简单切换作为有向边,切换代价作为边权值,就可形成一个赋权有向图,而且该图是有向完全图。基于该图选择任何路径都无法得到优化,原因是简单切换边不能表示场景之间内在的蕴含关系。

1.2 场景和状态蕴含关系

定义1:测试场景。一个测试场景s是针对一个或几个用例的测试需求,由一组语境对象组成的执行环境,这些对象具有特定的类型、个体及其状态的要求。场景s的语境对象的集合记为c(s)。

图2表示测试场景中的语境对象的性质。

图2中一个测试场景包含一个或多个语境对象,而且每个语境对象都具有类型、个体及其状态的限定。语境对象按类别可划分为:测试人员、测试设备、测试对象。其中,测试对象可能是一套受测软件,或者一组构件,或者一组对象,或者单个对象(最简单场景)。

由定义1可知,两个测试场景之间的差别就是其语境对象之间的差别,即对象类型、对象个体及其状态的差别。下面分析对象状态之间关系及其对测试用例(test case,下称测例)执行的作用机制。

UML状态机定义了一个对象的2个状态s1s2之间可能具有子状态的复合关系。假设s1是s2的一个子状态,若处于s1态则必处于s2态,反之不然[7]。

定义2:状态蕴含。设一个语境对象有状态s1和s2,若s1是s2的一个子状态,则s1s2有状态蕴含关系,记作s1→s2。

直观理解,若s1→s2,则s2态表示较简单场景,s1态较复杂且具有更多属性限制要求,即针对s1态测试的判定断言比针对s2更多。

推论1:一个测例tc对s1s2态分别测试,有s1→s2,若s2测试失败,则s1也失败,记为fail(tc,s2)→fail(tc,s1)。

直观理解,若较简单场景测试失败,则较复杂场景也失败。

证明,因s1→s2,s1验证需要比s2更多判定断言,且增加的断言(记为s1.newAssert)都以合取式出现。假设s2的断言为s2.assert,那么s1的断言式为s2.assert∧s1.newAssert。若s2测试失败,则s2.assert为假,此时s1的断言式也为假,故s1测试也失败,证毕。

该推论的逆否形式也成立,若s1测试成功,则s2也成功,记为success(tc,s1)→succss(tc,s2)。

推论2:一个测例tc在s1s2两个状态分别测试,且有s1→s2,则应先创建s2场景测试,再切换到s1场景测试。

这是推论1的一个简单延伸。先测试简单场景s2,后测试较复杂场景s1。若s2测试成功,再测试s1。若s2测试失败,由推论1知,s1也推定失败而无需再切换到更复杂场景,从而减少代价。该推论为多场景测试提供了优化依据:从较简单到复杂场景逐步测试,若测试成功则进入子状态来测试更复杂场景,而未撤销任何语境对象,直接减少代价;若测试失败则可立即断定从成功场景到失败场景的新加断言失败,范围小易分析原因,也减少测试代价。

推论3:设有两个不同测例tc1,tc2,若tc1需测试状态s1,tc2需测试状态s2,且有s1→s2,则只需状态s1就能满足tc1和tc2的测试要求。

实际上,tc2测试s1与测试s2具有相同的判定断言的结果。

证明:因tc2针对s2态测试,故tc2仅持有s2的判定断言s2.assert。而tc1持有断言为s2.assert∧s1.newAssert。由推理1,success(tc2,s1)→succss(tc2,s2),即tc2测试s1若成功,则测试s2也成功。若tc2测试s1失败,则其断言s2.assert判定为假,故此测试s2也失败。两者断言判定结果相同,证毕。

由推论3可能将两个测试场景合并为一个,能同时满足多个测例需求,减少测试场景数量,也就减少测试代价。

1.3 场景蕴含关系

定义3:场景差。设s1,s2是2个测试场景,场景差是从场景s1切换到s2的语境对象的差别,记为c(s2)-c(s1)。

定义4:场景蕴含。设s1,s2是两个测试场景,c(s2)-c(s1)=M,若M=∅,或M非空,且M仅包含新建对象;或至少一个语境对象从场景s1到s2转换为其一个子状态,即有状态蕴涵;前两种情形兼有,则称场景s2蕴含s1,记为s2→s1。

若c(s1)-c(s2)=∅,表示2个场景具有相同的对象类别、数量和状态,此时2个场景s1s2互相蕴含,语义上表示从测试等价类角度看,这2个场景属于同一类。

直观理解,两个场景之间的蕴含关系有4种情形:

(1)相互蕴含;

(2)后场s2加入新对象;

(3)后场s2中一个或多个语境对象转入其子状态,往往添加属性值或关联;

(4)情形(2)、(3)并存。

推论4:场景蕴涵关系是一种偏序关系。

证明:

(1)自反。对于任一个场景s1,s1蕴含s1,即s1→s1成立,证明略。

(2)反对称。对于任意2个不同场景s1和s2,若s1→s2,则s2→s1不成立。

证明:反证法,假设s1→s2成立时,s2→s1也成立,则由定义4可得c(s2)-c(s1)=M,c(s1)-c(s2)=M,则c(s1)=c(s2),s1与s2是相同场景,与前提矛盾,证毕。

(3)传递性。对于任意3个不同场景s1、s2和s3,若s1→s2,s2→s3,则s1→s3。

证明:由定义4,可得c(s1)-c(s2)=M1,c(s2)-c(s3)=M2,两式相加,得c(s1)-c(s3)=M1+M2,M1+M2满足定义4中M的条件(子状态的复合关系有传递性),故s1→s3成立。

2 路径优化方法

定义5:场景蕴含图SIG(Scenario Implication Graph)。一个场景蕴含图G={V,E}是一个有向图,其中V是场景集合,E是有向边集合,若e=<s1,s2>∈E,当且仅当s2→s1且s1≠s2成立。

场景蕴含图中有向边表示两个场景之间的逆蕴含关系,直观理解为从较简单场景指向较复杂场景,但图中取消了自反所导致的自回路。

推论5:场景蕴含图不存在回路。

证明:由推论4,场景蕴含关系是一种偏序关系,在取消自回路的前提下,场景蕴含图是哈斯图,哈斯图无回路[8]。

推论6:一个场景蕴含图作为有向无环图,若存在一条哈密尔顿路径[8](Hamilton Path,简称H路径),则该路径就是优化的场景切换路径。

证明:

(1)由H路径定义可知,覆盖所有场景一次且仅一次;

(2)H路径从简单场景到复杂场景,由推论2可知,沿该路径测试无论成功或失败,场景切换代价都可控制到最低。

一个场景蕴含图不一定存在H路径。若不连通则不存在H路径。即便连通也不一定存在H路径。对于一个有向无环图,难以简单求解H路径。文献[9]给出一种复杂的求解方法。

因此本文主张,对有向无环图先求其最长路径,尝试覆盖尽可能多的场景结点。若能覆盖所有结点则得到一条H路径;若不能覆盖,所得到的最长路径也可作为次优解。

推论7:场景蕴含图中存在入度为0的场景结点。证明略。

选择入度为0的一个或多个场景作为起始结点,寻求最长路径,再判断处理。

如果图中只有一个入度为0的结点,则作为单源最长路径求解;如果有多个入度为0的结点,则分别作为源结点求最长路径,然后在多条路径中选择最长路径。

下面算法是对无环有向图求单源最长路径,采用广度优先搜索。然后找出最长路径。算法如下:

3 讨论与比较

对一个场景蕴含图G的系统化处理方法如下:

情形1,不连通。有2种方案可选:

方案1:子图分割,形成多个连通子图,再分别对各连通子图按情形2处理。

方案2:在图中添加第2.1节讨论的简单切换边,每条边添加边权值,边权值表示切换代价,蕴含边的权值是新建对象和转入子状态操作的代价,形成一个赋权有向图,再求解货郎担问题,即遍历所有场景一次且仅一次,而且路径边权之和最小。

情形2,连通。求最长路径P,然后在图G中去掉P中结点和边,剩下子图若连通则继续求最长路径,若不连通则按情形1的子图分割处理。

与其他相关方法进行比较见表1。

4 实例验证

将该方法应用于一个软件测试实例,被测功能是开发人员持续上传新版本移动应用程序,使移动用户能持续更新版本。

功能需求:对于一个移动应用程序,服务器仅保留最新版本,包括一个apk文件,一个xml文件记录当前版本号以及版本说明。apk的版本号应与xml中版本号一致。开发人员上传新版本时,应在页面上输入新版本号及版本说明,然后上传apk文件。页面输入信息将记录到xml文件中。

根据以上功能需求可识别该测试的基本流与备选流,描述如表2所示。

将基本流和备选流组合形成9个测试场景,如表3所示。分析场景间蕴含关系,形成场景蕴含图,如图3所示。为展示清楚,省略一些间接蕴含关系。对图3计算最长路径:场景6→场景5→场景7→场景1→场景4→场景8→场景9。该路径未覆盖场景3和2。根据第3节讨论应构建赋权有向图。

先确定权值量化规则如下:

(1)添加或修改一个页面属性权值为1;

(2)打包apk权值为5;

(3)设置网络权值为3。

然后构建赋权有向图,如图4所示。

对图4再计算路径:场景6→场景5→场景7→场景1→场景4→场景8→场景3→场景2→场景9,此路径边权和为37。若9个场景简单随机选择,经计算其平均边权和为106。此实例的优化率为(106-37)106=65%。采用文献[5]的优化率为44%。

5 结语

本文从测试场景的结构特征的角度,定义了场景蕴含关系,基于蕴含关系提出一种多场景测试路径优化方法,并给出针对场景蕴含图SIG的系统化解决方法。该方法适用于多场景测试,尤其是场景切换代价较大的嵌入式分布式系统测试。

参考文献

[1]杜庆峰.高级软件测试技术[M].北京:清华大学出版社,2011.

[2]JACOBSON I.Object oriented software engineering:a use casedriven approach[M].USA:ACM Press,1992.

[3]JACOBSON I.Basic use-case modeling[J].The Road to theUnified Software Development Process,2000,18:167-172.

[4]KIM Y,CARLSON C R.Scenario based integration testing forobject-oriented software development[C]//Proceedings of 1999Eighth Asian Test Symposium.[S.l.]:IEEE,1999:283-288.

[5]潘建勇,陈邦兴.基于场景的测试用例设计方法研究[J].通信技术,2012,44(12):77-80.

[6]刘春玲,雷海红.基于场景的信息系统黑盒测试方法[J].信息与电子工程,2012,10(4):509-512.

[7]刘佳,尹治本.基于对象状态的面向对象软件测试方法研究[J].电脑知识与技术,2008,4(35):2169-2170.

[8]方世昌.离散数学[M].北京:高等教育出版社,2000.

路径测试论文 第6篇

模拟试验(步骤)一:模拟铲装作业测试工况

试验方法:作业方式采用半回转(图2)。作业方式由熟练驾驶员确定,样机连续循环装车0.5~1.0h,作业物料选用标准砝码。作业时以最短的运距(一般选取大于整机长度1.5倍左右的运距),尽量发挥装载机最大作业能力。作业量可通过作业循环次数及标准砝码的质量来确定。

铲装、装载1个循环模拟动作的轨迹按图3规定,装载机的状态分别为:(a)~(b),铲装动作,铲斗保持在行走状态,全速前进行驶到指定位置,全制动停止;(b),全油门,变矩器为失速状态,在此期间进行铲斗倾斜回收溢流的操作,铲斗后翻(溢流阀溢流)所用时间3±0.2s;(b)~(c),装载机处于运输状态,切换到后退挡,回到初始起动位置;(c)~(d),切换到前进挡,同时举升提升臂,向着自卸车的想定方向行驶到指定位置,待铲斗越过栏杆(障碍物),全制动停止;(d),自卸车不要动作,使装载机提升大臂起升至规定位置,保持2s;(d)~(a),装载机切换到后退挡,处于行走状态,同时将动臂降落到运输位置,回到初始起动位置。

测试记录总作业时间、总作业量、总燃油消耗量、单位时间作业量、单位时间燃油消耗量以及单位载重量的燃油消耗量等参数。

模拟试验(步骤)二:运输作业测试工况

试验方法:设备带额定载荷(标准重块),由驾驶员按照规定的前进挡位,直接使用全油门,启动行驶,发动机在进入测试区段内应始终保持在最高转速,小型设备测定区间为50m,中型设备测定区间为100m。尽可能保证直线行驶(根据实际测试路况可以加长测试距离)。

1.装载机位置2.模拟作业的物料堆放区域3自卸车隨

往返行驶都在起始地点,从启动发动机开始油耗测量,直到行驶到测定区间末端停止测量。测试记录行驶时间、行驶里程、行驶挡位、单位时间燃油消耗量和单位载重量的燃油消耗量等参数。

模拟试验(步骤)三:怠速模式测试工况

试验方法:设备不加任何负载,启动后在怠速情况下运行600s (根据实际测试工况可以增加测试时间)。记录单位时间燃油消耗量等参数。

上述综合模拟作业工况试验的3种模式测试结果,根据轮式装载机现场平均作业比例,以挖掘/装载作业75%、运输作业15%、怠速100%进行推定,利用JMASH022:2007的加权公式,确定轮式装载机的燃油消耗量评价值(单位作业量的燃油消耗量)。

评测对比

以上2种测试方法均是由熟练驾驶员发挥装载机的最大作业能力,但由于试验方法不同,对其经济技术参数的评价结果也有所不同。

传统测试方法优势在于,由于是在真实的作业现场,作业场地更接近实际工况的作业场地,铲装的作业对象均是实际物料(比如散沙、松散黏土、碎石等物料),对装载机在作业循环过程中所有的工作状态和工作装置的操作行为都进行了有效考核。因此说这种测试方法更真实和有效。

但是,传统测试方法也有不足,因为在这种技术经济参数测试中的客观影响因素太多。首先,受试验场地的约束,各企业在实际铲装作业时场地各不一致,路面情况不一样,有的是水泥路面,有的是土路面,有的是碎石路面等;其次,测试运距基本上都保持在20m左右,不论机型大小,部分约束了其实际的作业和适应能力,可见有失科学性;再其次,借助现有试验条件,装载机铲沙、铲土、铲装碎石等各种现象均有发生,铲装物料无法做到一致;最后,驾驶员水平不一致,有的驾驶能力比较强,但实际铲装作业水平一般,有的两方面能力都比较强,但操作习惯不好,铲斗铲装不满,油耗较高。

总体而言,传统测试方法受客观因素影响比较大,主要测试数据为每小时作业量和油耗量,数据不够全面,设备节油效果可比性不强。测试完成后,各企业各执一词,缺乏有说服力的数据。

相比而言,综合模拟作业试验方法则优势明显。模拟铲装作业测试方法,流程简单,驾驶员易于操作,不易出现其他操作的影响因素。作业场地一般选用平整硬实路面,测试运距选取整机长度的1.5倍左右,铲装物料每一次作业循环均保持一致。装载机基本不受客观、人为因素的影响,因此,测试过程及测试结果具有一定的公平性和可比性。但也因为是模拟作业,其操作环节不可避免缺少几道作业程序。如由于铲斗中始终是标准砝码,不能完成实际的铲装、卸载作业动作,因此,缺少了实际铲装物料的程序和卸载物料的作业程序。为此,试验过程中,通过在实际铲装位置铲斗收斗,使液压系统溢流3s,在卸料位置时收斗溢流2s,来代替实际的铲装和卸载作业,而这几秒时间基本都是通过操作人员的感觉来把握,不易实现定量化,因此采用这种方式进行试验,之前必须进行有效的模拟演练。

综合来看,较传统作业测试方法而言,综合模拟作业测试方法更具可操作性,受场地、人员等因素的影响明显较少,针对性较强,操作动作易于规范化,测试结果具有一定的可比性和说服力,因此很容易在企业操作,实现技术经济参数的测试,有一定的推广价值。鉴于此,本文仅列出综合模拟作业测试后5款装载机的相关测试数据,仅供参考。

摘要:随着国内土方机械的飞速发展以及国家节能减排政策的出台,作为我国最量大面广的轮式装载机,其燃油经济性指标越来越被用户和制造企业所重视。一般而言,产品的节能性需要通过相关技术经济指标来判定,包括单位时间作业率、单位时间油耗以及单位作业量的油耗等。要了解和掌握这些参数,就需要进行专业测试,进行科学合理的评价。如何科学准确、规范严谨地进行轮式装载机技术经济参数测试,并正确合理地评价这些测量值,不论是对装载机用户,还是制造企业,都是一个非常重要的问题。

路径测试论文范文

点击下载文档

格式为doc格式

相关推荐