CN101986281B - 一种多参量软件测试方法 - Google Patents
一种多参量软件测试方法 Download PDFInfo
- Publication number
- CN101986281B CN101986281B CN2010105269938A CN201010526993A CN101986281B CN 101986281 B CN101986281 B CN 101986281B CN 2010105269938 A CN2010105269938 A CN 2010105269938A CN 201010526993 A CN201010526993 A CN 201010526993A CN 101986281 B CN101986281 B CN 101986281B
- Authority
- CN
- China
- Prior art keywords
- test
- parameter
- sensitive element
- value
- test data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明涉及了一种多参量软件测试方法,其步骤包括:1)生成强度为t的组合测试数据;2)识别所述组合测试数据的非敏感元素,所述非敏感元素指该元素取值的改变不影响所述组合测试数据的强度t;3)实例化上述非敏感元素,使得实例化后的组合测试数据中t+m元组的取值组合覆盖率尽可能高,其中m为自然数,可为0至k-t中任意自然数,建议取1;4)将上述提高t+m元组取值组合覆盖率的组合测试数据作为优化后的组合测试数据;5)使用上述优化后的组合测试数据对该待测软件进行测试。该方法在确保不减小原有的测试强度和不增加任何测试成本的前提下,提高测试数据对高维度元组的覆盖率,从而能以同样的测试成本,达到更高的检错率。
Description
技术领域
本发明涉及软件工程领域中的组合测试技术,尤其涉及对使用的组合测试数据进行优化的软件测试方法。
背景技术
随着信息技术的飞速发展,软件在工业、服务业、金融、国防等各行各业,以及人们的日常生活中得到了广泛应用。为了确保软件的可靠性,在软件发布前,通过软件测试技术尽可能多地发掘系统中潜在的错误,具有十分重要的意义。
多参量软件中隐藏的错误很可能是由两个以上参量相互作用所触发的。因此,如果只是单独对各个参量的可能取值进行测试,就很可能遗漏掉那些由多个参量相互作用引起的软件错误。理想状态下的测试方案是对系统中全部参量的取值组合进行穷举测试,检查系统能否正确运行。但是,执行穷举测试所需要的测试用例将随着系统中的参量个数呈指数增长。例如,对一个具有17个布尔参量的铁路安全控制系统进行穷举测试,共需要217个测试用例,测试成本太高。可见,穷举测试是不切实际的。
软件工程的经验表明,实际应用中的大多数软件隐藏的错误,往往是由少数几个参量互相作用触发的。例如,美国国家标准和技术协会(NIST)的Kuhn等人曾采用四个软件系统进行了详细研究,其结果表明,超过80%的错误是由不超过三个参量互相作用触发的。这意味着,在对系统进行测试时,如果测试数据覆盖了全部参量中的任意几个(例如任意三个)参量的取值组合,便能检查出大多数程序错误,保障测试的检错率和有效性。与此同时,和穷举测试相比,所需的测试用例数目将大幅消减,测试成本大大降低。例如,对于上述铁路安全控制系统,只需要11个测试用例,就能保证17个参量中任意两个参量的取值被覆盖到,只需要24个测试用例,就能保证任意三个参量的取值组合被覆盖到。
以上便是组合测试的动机和意义。所谓强度为t的组合测试,是指任意数目不超过t个的参量之间所有可能的取值组合都至少在测试用例中出现一次。强度为2的组合测试,又称为成对测试(Pairwise Testing),并被广泛采用。穷举测试是强度等于全部参量个数的一种特殊的组合测试。
组合测试数据的生成问题是通过构造满足一定强度的混合覆盖数组(Mixed CoveringArray)来解决的。下面是混合覆盖数组的定义:
定义1混合覆盖数组MCA(N;t,k,v1v2…vk)是一个由v个符号组成的N×k矩阵,其中v=v1+v2+…+vk,并具有以下性质:
1、第i列的所有符号是一个大小为vi的集合Vi中的元素。
2、任意的N×t子矩阵包含了对应的t列的所有可能取值组合。
在这里,t即上文提到的强度(strength)。例如,表1给出了一个强度为2的混合覆盖数组MCA(6;2,3,223),代表了一组对一个含有三个参量p0、p1和p2的系统进行强度为2的组合测试的测试数据。其中p0和p1各有两个不同的取值0、1,p2有三个不同的取值0、1、2。
表1、MCA(6;2,3,223)
p0 | p1 | p2 |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
0 | 0 | 2 |
1 | 1 | 2 |
在混合覆盖数组中,每一列对应着系统的一个参量,每一行代表一个测试用例,数组中的元素代表相应的参量在其所在测试用例中的取值情况。例如,表1中的第一组数据<0,0,0>表示一个测试用例,其中参量p0=0,参量p1=0,参量p2=0。在下文中,如无特殊说明,组合测试数据和混合覆盖数组具有相同含义,后者是前者的数学抽象。
下面,我们介绍MCA中的非敏感元素集和非敏感元素的定义:
定义2强度为t的MCA的一个非敏感元素集(Don’t Care Entry Set,简称DCES)是指该MCA中的一组元素的集合,且满足:无论该集合中的元素取什么值,都不影响该MCA的强度t。
定义3非敏感元素集中的每一个元素称为MCA的一个非敏感元素(Don’t Care Entry,简称DCE)。
发明内容
本发明提出一种软件测试方法,该方法包括了对给定的组合测试数据TS,在不增加测试用例个数和不降低测试强度的前提下,查找TS中的一个非敏感元素集,并实例化查找到的非敏感元素集中的非敏感元素,提高测试数据中高维度取值组合的覆盖率,从而实现查找到待测系统中更多交互错误的目的,提高软件测试的有效性。
本发明的出发点和依据如下:
根据现有的研究工作,软件测试过程中构造的组合测试数据,只是关注了如何使得构造的测试数据强度t达到一定要求,也即仅仅关注了如何使得测试数据100%地覆盖到维度不高于t的那些元组。例如,在构造强度为3的组合测试数据TS时,当所有可能出现的三元组、二元组都被TS全部覆盖到了,组合测试数据的构造工作就完成了。实际上,如果能在TS的基础上,在不增加测试数据的测试用例数目和不降低测试强度的前提下,对TS进行进一步处理,并得到一组优化数据TS’,使得TS’能够覆盖到更多的四元组,那么TS’在测试过程中将以更大的可能性,查找到待测系统中更多的交互错误,提高测试的有效性。
下面简单介绍下文中将用到的主要术语和符号:
假定待测系统有k个输入参数,第i个参数用pi表示,其取值范围为Vi。
测试数据TS由混合覆盖数组表示,由N个测试用例T0-TN-1组成,其中每一个测试用例是一个k元组(p0,p1,…,pk-1),其中pi∈Vi,对于测试用例Tj来说,j称为其下标。
测试用例间的汉明距离是指两个测试用例中取值不同的参量的个数。例如,测试用例<1,2,0,1>和<1,0,0,2>的汉明距离等于2。
为了实现本发明的目的采用的技术方案概述如下:
一种多参量软件测试方法,其步骤包括:
1)生成强度为t的组合测试数据,所述组合测试数据由N个测试用例组成,按照先后次序,其对应下标分别为0至N-1,其中每一测试用例为一个k元组(p0,p1,…,pk-1),t为自然数;k为自然数,表示待测软件的参量个数;pi代表各参量,分别取值于Vi;强度为t指该组合测试数据覆盖任意不超过t个参量的所有可能的取值组合;
2)识别所述组合测试数据的非敏感元素,所述非敏感元素指该元素取值的改变不影响所述组合测试数据的强度t;
3)实例化上述非敏感元素,选取实例化后的组合测试数据中t+m元组覆盖率提高的参量取值,其中m为自然数,可为0至k-t中任意自然数,优选取1;
4)将上述提高t+m元组取值组合覆盖率的组合测试数据作为优化后的组合测试数据;
5)使用上述优化后的组合测试数据对该待测软件进行测试。
所述步骤2)中识别出所述组合测试数据的所有非敏感元素,采用的方法如下:
将N个测试用例进行排序,并依次遍历全部测试用例,遍历过程中,如果当前测试用例中,某一参量的取值可以覆盖所有t元组,则所有后续测试用例中遇到该参量取同样的值,就标记为非敏感元素。
所述步骤2)包括以下步骤:
2-1)对组合测试数据中的每一个参量pi,分别计算所有包含该参量的t元组,并保存在相应的记录集合Ri中;
2-2)为TS中的N个测试用例,生成一组候选的排序方案S;
2-3)根据S中的每种排序方案Sk对全部测试用例进行排序,得到TSk,按照先后顺序,遍历TSk中的全部测试用例,查找非敏感元素;
2-4)把TS替换为上述查找到非敏感元素最多的TSk;
进一步,重复进行步骤2-2)至2-4),直到找不到新的非敏感元素。
所述步骤2-2)排序方案S具体采用以下步骤生成(其中b和c是参数,为自然数):
2-2-1)计算组合测试数据TS中任意两个测试用例之间的汉明距离,存入表M中;
2-2-2)随机选择某个测试用例,将其下标作为一个只含一个下标的序列,放入下标序列集S;
2-2-3)如果循环2-2-3)至2-2-5)已执行c次,转2-2-6);
2-2-4)遍历S中的每一个序列listi,设listi的最后一个下标为x,查找表M,找到下标值不包含在listi中,且和下标为x的测试用例汉明距离最大的b个测试用例的下标,分别作为listi的末端,放入S’;
2-2-5)将S替换为S’,并转2-2-3);
2-2-6)如果S中的各序列包含的下标个数等于N,转2-2-8);
2-2-7)遍历S中的每一个序列listi,设listi的最后一个下标为x,查找表M,找到下标值不包含在listi中,且和下标为x的测试用例汉明距离最大的那个测试用例的下标,作为listi的末端,重复执行2-2-6);
2-2-8)返回序列集S。
所述步骤2-3)包括以下步骤:
2-3-1)从S中选取一种下标序列Sk,按下标序列顺序依次选取测试用例,得到测试用例集TSk;
2-3-2)将所有的Ri中的所有t元组标为“0”,表示未被覆盖,以下开始按先后顺序遍历TSk;
2-3-3)对每个参量pi,依次枚举出TSk的当前测试用例中涉及参量pi的所有t元组,并在相应的记录集Ri中将相应的t元组标记为“1”,表示已被覆盖;
2-3-4)对每个参量pi和其对应的全部取值vj,检查其记录集合Ri中,所有pi取值为vj的t元组,如果这些元组都已被标记为“1”,则将当前测试用例之后的所有测试用例中,pj取值为vj的元素标记为非敏感元素;
2-3-5)重复执行2-3-3)至2-3-5),直到遍历完TSk中的全部测试用例;
2-3-6)重复执行2-3-1)至2-3-6),直到S为空集。
所述步骤3)采用以下步骤:
3-1)枚举k个参量的取值间所有的t+m元组,建立一个覆盖表R,并将每个元组标为“0”,表示尚未被覆盖;
3-2)遍历全部测试用例,并将测试用例中出现的t+m元组,在覆盖表R中标为“1”,表示已被覆盖;
3-3)再次遍历测试用例集,从前至后、从左至右对非敏感元素依次进行实例化。
所述步骤33)进行实例化具体包括以下步骤:
3-3-1)遍历当前测试用例中的每个元素,如果已无非敏感元素,执行3-3-4);
3-3-2)将遇到的非敏感元素,分别计算假如将其赋值为其对应参量的取值范围Vi中的每一个值vi,该测试用例能够覆盖到的、在覆盖表R中标为0的t+m元组的数目ni;
3-3-3)将非敏感元素赋值为ni最大的取值vi,并将R中新覆盖到的t+m元组标为“1”;
3-3-4)完成对非敏感元素的实例化,返回TS。
使用CATS、AETG、PICT、FireEye或Jenny作为工具,通过代数方法、贪心算法或元启发式算法生成所述强度为t的组合测试数据。
所述步骤4)中将最大限度提高t+m元组取值组合覆盖率的组合测试数据作为优化后的组合测试数据。
上述m建议取1,但不局限于1,可选1至k-t中的任意自然数。
与现有技术相比,本发明具有以下技术效果:
本发明方法不增加测试用例数目,即不增加额外的测试成本;
本发明方法不降低测试数据的强度,即原有的100%覆盖元组仍然被100%覆盖;
本发明方法能提高高维度元组覆盖率,从而提高测试数据的检错率;
本发明方法适应范围广,适用于目前现有工具和算法所生成的组合测试数据,尤其是对于执行测试用例成本高的场景具有更加重要的意义;使用本发明的方法,可以提高测试用例质量,最大程度地发挥每一个测试用例的潜力,从而能以同样的测试成本,达到更高的检错率。
附图说明
图1是本组合测试数据的优化方法流程示意图;
图2是测试用例集排序方案生成流程示意图;
图3是非敏感元素集查找流程示意图;
图4是非敏感元素集实例化流程示意图。
具体实施方式
下面结合附图和具体实施方式对本发明作更进一步的说明。其中各附图方框所标标签和上述的各个步骤(子步骤)相对应。
(1)如图1所示,首先构造一组强度为t的测试数据TS(构造测试数据的方法主要有代数方法、贪心算法、元启发式算法等等,有关工具有CATS、AETG、PICT、FireEye、Jenny等等)(图1中S1)
然后对组合测试数据进行优化,是通过以下两个关键步骤实现的:
(2)从TS中查找一个尽可能大的非敏感元素集(图1中S2)
该步的目标是,尽可能多地查找到原始测试数据中的非敏感元素,为测试数据的优化提供尽可能大的优化空间。
(3)实例化非敏感元素集中的非敏感元素(图1中S3)
该步的目标是,重新确定非敏感元素的取值,以尽可能地提高更高维度元组的覆盖率,使得重新实例化后的测试数据的检错范围更广,达到优化效果。
进一步,将上述提高t+m元组取值组合覆盖率的组合测试数据作为优化后的组合测试数据,其中m为自然数;(图1中S4)
最后,使用上述优化后的组合测试数据对该待测软件进行测试。(图1中S5)
其中步骤(2)采用的方法是:将N个测试用例进行排序,并依次遍历全部测试用例,遍历过程中,如果当前测试用例中,某一参量的取值可以覆盖所有t元组,则所有后续测试用例中遇到该参量取同样的值,就标记为非敏感元素。本发明通过以下子步骤实现:
(21)对组合测试数据中的每一个参量pi,分别计算所有包含该参量的t元组,并保存在相应的记录集合Ri中;(图3中S21)
(22)为TS中的N个测试用例,生成一组候选的排序方案S;(图3中S22)
(23)根据S中的每种排序方案Sk对全部测试用例进行排序,得到TSk,按照先后顺序,遍历TSk中的全部测试用例,查找非敏感元素;(图3中S23)
(24)把TS替换为上述查找到非敏感元素最多的TSk;(图3中S24)
进一步,重复进行步骤(22)至(24),直到找不到新的非敏感元素。
所述步骤(22)中的排序方案S,本发明通过以下子步骤生成:
(221)计算组合测试数据TS中任意两个测试用例之间的汉明距离,存入表M中;(图2中S221)
(222)随机选择某个测试用例,将其下标作为一个只含一个下标的序列,放入下标序列集S;(图2中S222)
(223)如果循环(223)至(225)已执行c次,转2-2-6);(图2中S223)
(224)遍历S中的每一个序列listi,设listi的最后一个下标为x,查找表M,找到下标值不包含在listi中,且和下标为x的测试用例汉明距离最大的b个测试用例的下标,分别作为listi的末端,放入S’;(图2中S224)
(225)将S替换为S’,并重复步骤(223)至(225);(图2中S225)
(226)如果S中的各序列包含的下标个数等于N,转(228);(图2中S226)
(227)遍历S中的每一个序列listi,设listi的最后一个下标为x,查找表M,找到下标值不包含在listi中,且和下标为x的测试用例汉明距离最大的那个测试用例的下标,作为listi的末端,重复执行(226);(图2中S227)
(228)返回序列集S。(图2中S228)
所述步骤(23)通过以下子步骤实现:
(231)从S中选取一种下标序列Sk,按下标序列顺序依次选取测试用例,得到测试用例集TSk;(图3中S231)
(232)将所有的Ri中的所有t元组标为“0”,表示未被覆盖,以下开始按先后顺序遍历TSk;(图3中S232)
(233)对每个参量pi,依次枚举出TSk的当前测试用例中涉及参量pi的所有t元组,并在相应的记录集Ri中将相应的t元组标记为“1”,表示已被覆盖;(图3中S233)
(234)对每个参量pi和其对应的全部取值vj,检查其记录集合Ri中,所有pi取值为vj的t元组,如果这些元组都已被标记为“1”,则将当前测试用例之后的所有测试用例中,pi取值为vj的元素标记为非敏感元素;(图3中S234)
(235)重复执行(233)至(235),直到遍历完TSk中的全部测试用例;(图3中S235)
(236)重复执行(231)至(236),直到S为空集。(图3中S236)
其中,步骤(3)采用的方法是依次遍历当前测试用例中的每个元素,遇到非敏感元素时,计算给非敏感元素取不同的值时,哪一个取值能最多地覆盖更多的t+m元组,就将给非敏感值实例化为该取值,具体通过以下子步骤实现:
(31)枚举k个参量的取值间所有的t+m元组,建立一个覆盖表R,并将每个元组标为“0”,表示尚未被覆盖;(图4中S31)
(32)遍历全部测试用例,并将测试用例中出现的t+m元组,在覆盖表R中标为“1”,表示已被覆盖;(图4中S32)
(33)再次遍历测试用例集,从前至后、从左至右对非敏感元素依次进行实例化。
所述步骤(33)进行实例化具体包括以下步骤:
(331)遍历当前测试用例中的每个元素,如果已无非敏感元素,执行(334);(图4中S331)
(332)将遇到的非敏感元素,分别计算假如将其赋值为其对应参量的取值范围Vi中的每一个值vi,该测试用例能够覆盖到的、在覆盖表R中标为0的t+m元组的数目ni;(图4中S332)
(333)将非敏感元素赋值为ni最大的取值vi,并将R中新覆盖到的t+m元组标为“1”;(图4中S333)
(334)完成对非敏感元素的实例化,返回TS。(图4中S333)
为了更清楚地理解本发明,特举一个具体的实例,将本方案的具体实施过程和效果描述。
例子:待测系统具有八个参量p0-p7,其中p0、p1具有两个不同的取值,分别用0、1表示;p2、p3具有三个不同的取值,分别用0、1、2表示;p4-p7具有4个不同的取值,分别用0、1、2、3表示。
表2为使用现有的组合测试数据生成工具生成的进行强度为2的组合测试的测试数据——混合覆盖数组MCA(2;25,8,223244)。
表2、优化前的MCA
p0 | p1 | p2 | p3 | p4 | p5 | p6 | p7 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
0 | 1 | 1 | 2 | 2 | 2 | 2 | 2 |
1 | 1 | 0 | 0 | 3 | 3 | 3 | 3 |
0 | 0 | 2 | 1 | 3 | 2 | 3 | 0 |
1 | 1 | 2 | 2 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 | 1 | 0 | 2 |
1 | 0 | 0 | 2 | 2 | 3 | 0 | 0 |
0 | 0 | 1 | 0 | 0 | 1 | 2 | 3 |
1 | 0 | 2 | 0 | 1 | 2 | 2 | 1 |
1 | 0 | 2 | 0 | 2 | 1 | 1 | 2 |
0 | 1 | 1 | 2 | 3 | 0 | 3 | 2 |
0 | 0 | 1 | 1 | 0 | 3 | 1 | 3 |
1 | 1 | 0 | 2 | 1 | 0 | 2 | 3 |
0 | 1 | 0 | 1 | 2 | 0 | 2 | 0 |
0 | 0 | 0 | 0 | 0 | 2 | 1 | 0 |
0 | 0 | 2 | 1 | 1 | 3 | 0 | 1 |
0 | 0 | 1 | 2 | 3 | 1 | 0 | 0 |
1 | 1 | 0 | 0 | 3 | 3 | 1 | 1 |
0 | 1 | 1 | 2 | 3 | 3 | 2 | 2 |
1 | 0 | 1 | 1 | 0 | 1 | 3 | 1 |
0 | 0 | 2 | 1 | 1 | 2 | 3 | 0 |
0 | 0 | 2 | 1 | 2 | 2 | 3 | 1 |
0 | 0 | 2 | 0 | 2 | 2 | 0 | 3 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 |
为了对表2中的数据进行优化,我们先执行步骤(2),查找出测试数据中的一个非敏感元素集,并将其中的取值标为“*”。具体如下:
(21)、对每一个参量建立一个含有该参量的全部二元组的记录表。例如对第一个参量p0,其记录表R0中有以下二元组:
参量组合<p0,p1>:<0,0>;<0,1>;<1,0>;<1,1>
参量组合<p0,p2>:<0,0>;<0,1>;<1,0>;<1,1>
参量组合<p0,p3>:<0,0>;<0,1>;<0,2>;<1,0>;<1,1>;<1,2>
参量组合<p0,p4>:<0,0>;<0,1>;<0,2>;<1,0>;<1,1>;<1,2>
参量组合<p0,p5>:<0,0>;<0,1>;<0,2>;<0,3>;<1,0>;<1,1>;<1,2>;<1,3>
参量组合<p0,p6>:<0,0>;<0,1>;<0,2>;<0,3>;<1,0>;<1,1>;<1,2>;<1,3>
参量组合<p0,p7>:<0,0>;<0,1>;<0,2>;<0,3>;<1,0>;<1,1>;<1,2>;<1,3>
(22)、针对表2中的测试用例,生成一个排序方案集合,排序方案可以根据需要来设定,包括使用随机方法生成,本发明给出了一种基于汉明距离的排序方法,在本例中,N=25,我们选择b=2,c=5,来生成排序方案:
(221)计算测试数据中任意两个测试用例之间的汉明距离,存入表M中,如测试用例
<0,0,0,0,0,0,0,0>和测试用例<1,0,1,1,1,1,1,1>之间的汉明距离为7;
(222)选择第一个测试用例的下标“0”作为长度为1的下标序列,放入下标序列集S;
(223)c=5,因为此时还未执行过循环(223)至(225),也即因为0<5,故需要继续执行下一步(224);
(224)此时S中仅有一个序列0,通过查询M,我们找到和TS[0](表示第一个测试用例,下同)汉明距离最大的两个测试用例的下标为1和2,分别把1和2作为0的后续节点,放入S’;
(225)将S替换为S’,即S变为{0-1,0-2},转(223);
由于c=5,循环(223)至(225)将共执行5次:
第二次执行循环后:
S={0-1-2,0-1-3,0-2-1,0-2-3}
第三次执行循环后:
S={0-1-2-3,0-1-2-16,0-1-3-2,0-1-3-16,0-2-1-3,0-2-1-11,0-2-3-1,0-2-3-16}
第五次执行循环后:
S={0-1-2-3-16-11,0-1-2-3-16-13,0-1-2-3-17-5,0-1-2-3-17-9,0-1-2-16-3-17,0-1-2-16-3-21,0-1-2-16-11-9,0-1-2-16-11-7,0-1-3-2-16-11,0-1-3-2-16-13,0-1-3-2-18-21,0-1-3-2-18-4,0-1-3-16-2-18,0-1-3-16-2-20,0-1-3-16-11-9,0-1-3-16-11-7,0-2-1-3-16-11,0-2-1-3-16-13,0-2-1-3-17-5,0-2-1-3-17-9,0-2-1-11-9-6,0-2-1-11-9-12,0-2-1-117-8,0-2-1-11-7-4,0-2-3-1-11-9,0-2-3-1-11-7,0-2-3-1-14-9,0-2-3-1-14-10,0-2-3-16-11-9,0-2-3-16-11-1,0-2-3-16-13-4,0-2-3-16-13-22}
(226):执行完5次循环后,共得到25即共32种不同的序列,每个序列中仅含6个下标,故继续执行循环(226)至(227);
(227):对S中的每个下标序列listi,查询M,得到与下标为listi的最后一个下标的测试用例之间汉明距离最大的测试用例,并将它的下标作为listi的最后一个下标;例如,对于S中的序列0-1-2-3-16-11,由于除开下标为0、1、2、3、16的测试用例,TS[11]和TS[9]的汉明距离最大,因此,序列0-1-2-3-16-11添加一个后续节点,变为0-1-2-3-16-11-9;
(228):上述(226)至(227)执行19次后,返回序列集S,此时S中共有32个序列,每个序列中包含了0至24共25个下标,依次如下:
0:0-1-2-3-16-11-9-6-5-4-13-22-18-21-19-10-14-20-23-7-8-15-17-12-24
1:0-1-2-3-16-13-4-5-6-9-11-7-8-18-21-19-10-14-20-23-12-17-22-24-15
2:0-1-2-3-17-5-4-13-22-18-21-19-9-11-7-8-6-10-14-20-23-12-24-16-15
3:0-1-2-3-17-9-11-7-8-5-4-13-22-18-21-19-10-14-20-23-6-12-24-16-15
4:0-1-2-16-3-17-5-4-13-22-18-21-19-9-11-7-8-6-10-14-20-23-12-24-15
5:0-1-2-16-3-21-18-4-13-22-19-9-11-7-8-5-6-10-14-20-23-12-17-15-24
6:0-1-2-16-11-9-6-5-4-13-22-3-17-18-21-19-10-14-20-23-7-8-15-12-24
7:0-1-2-16-11-7-8-5-4-13-22-3-17-9-6-10-14-20-19-15-18-21-24-12-23
8:0-1-3-2-16-11-9-6-5-4-13-22-18-21-19-10-14-20-23-7-8-15-17-12-24
9:0-1-3-2-16-13-4-5-6-9-11-7-8-18-21-19-10-14-20-23-12-17-22-24-15
10:0-1-3-2-18-21-5-4-13-22-19-9-11-7-8-6-10-14-20-23-12-17-15-16-24
11:0-1-3-2-18-4-13-22-19-9-11-7-8-5-6-10-14-20-23-12-17-15-16-24-21
12:0-1-3-16-2-18-21-5-4-13-22-19-9-11-7-8-6-10-14-20-23-12-17-15-24
13:0-1-3-16-2-20-13-4-5-6-9-11-7-8-18-21-19-10-14-12-17-22-24-23-15
14:0-1-3-16-11-9-6-5-4-13-22-18-21-19-10-14-20-2-7-8-15-17-12-23-24
15:0-1-3-16-11-7-8-5-4-13-22-18-21-19-9-6-10-14-20-2-12-17-15-23-24
16:0-2-1-3-16-11-9-6-5-4-13-22-18-21-19-10-14-20-23-7-8-15-17-12-24
17:0-2-1-3-16-13-4-5-6-9-11-7-8-18-21-19-10-14-20-23-12-17-22-24-15
18:0-2-1-3-17-5-4-13-22-18-21-19-9-11-7-8-6-10-14-20-23-12-24-16-15
19:0-2-1-3-17-9-11-7-8-5-4-13-22-18-21-19-10-14-20-23-6-12-24-16-15
20:0-2-1-11-9-6-5-4-13-22-3-16-8-7-12-10-14-20-19-15-17-18-21-24-23
21:0-2-1-11-9-12-13-4-5-6-3-16-8-7-19-10-14-20-23-18-21-24-22-17-15
22:0-2-1-11-7-8-5-4-13-22-3-16-10-14-9-6-12-18-21-19-15-20-23-17-24
23:0-2-1-11-7-4-13-22-3-16-5-6-9-12-10-14-20-19-15-17-18-21-8-23-24
24:0-2-3-1-11-9-6-5-4-13-22-18-21-19-10-14-20-23-7-8-16-15-17-12-24
25:0-2-3-1-11-7-8-5-4-13-22-18-21-19-9-6-10-14-20-23-12-17-15-16-24
26:0-2-3-1-14-9-11-7-8-5-4-13-22-18-21-19-10-6-12-17-15-16-20-23-24
27:0-2-3-1-14-10-11-9-6-5-4-13-22-18-21-19-15-16-8-7-12-17-20-23-24
28:0-2-3-16-11-9-6-5-4-13-22-18-21-19-1-14-10-12-7-8-15-20-23-17-24
29:0-2-3-16-11-1-14-9-6-5-4-13-22-18-21-19-10-12-7-8-15-20-23-17-24
30:0-2-3-16-13-4-5-6-9-11-1-14-10-19-15-20-23-18-21-7-8-22-17-12-24
31:0-2-3-16-13-22-18-21-5-4-1-11-9-6-7-8-14-10-19-15-20-23-12-17-24
(231)、从S中选取第一个下标序列:
0-1-2-3-16-11-9-6-5-4-13-22-18-21-19-10-14-20-23-7-8-15-17-12-24,按照下标先后,从TS中获取测试用例,得到TS0,下面将从TS0中查找非敏感元素;
(232)、将所有的Ri中二元组标为“0”;
(233)、依次遍历各个测试用例,并将当前测试用例中所有覆盖到的二元组,在Ri中标为“1”;例如,对于测试用例<1;0;1;1;1;1;1;1>而言,将该测试用例覆盖到的全部28个二元组(例如<p0=1;p1=0>、<p1=0;p2=1>等)在R0至R7中标为“1”;
(234)、依次检查R0至R7,标记非敏感元素。例如,如果R0中p0=0的全部二元组都已经被标记为“1”,则将当前测试用例后面的那些测试用例中,凡是p0取0的元素,都标记为“*”。
(235)、如果还有后续测试用例,则回到(233)继续处理下一个测试用例,直到遍历完整个测试用例集。
(236)、对S中的所有排序方案执行上述查找过程,分别找到如下数目的非敏感值:
0:15;1:19;2:18;3:18;4:17;5:17;6:15;7:22;8:15;9:19;
10:19;11:24;12:17;13:16;14:17;15:19;16:15;17:19;18:18;
19:18;20:26;21:30;22:28;23:27;24:15;25:19;26:23;27:
22;28:20;29:23;30:23;31:19;
(24)、由于TS21和TS30得到了最多的非敏感元素,均为30个,不妨将TS替换为TS21,得到TS如表3-1所示:
表3-1、第一遍查找到的非敏感元素集
p0 | p1 | p2 | p3 | p4 | p5 | p6 | p7 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 2 | 2 | 2 | 2 | 2 |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
0 | 1 | 1 | 2 | 3 | 0 | 3 | 2 |
1 | 0 | 2 | 0 | 1 | 2 | 2 | 1 |
0 | 0 | 1 | 1 | 0 | 3 | 1 | 3 |
1 | 1 | 0 | 2 | 1 | 0 | 2 | 3 |
0 | 0 | 2 | 1 | 3 | 2 | 3 | 0 |
1 | 1 | 2 | 2 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 | 1 | 0 | 2 |
1 | 1 | 0 | 0 | 3 | 3 | 3 | 3 |
0 | 0 | 2 | 1 | 1 | 3 | 0 | 1 |
* | 0 | 1 | 0 | 0 | 1 | 2 | 3 |
1 | 0 | 0 | 2 | 2 | 3 | 0 | 0 |
* | 1 | 1 | 2 | 3 | 3 | 2 | 2 |
1 | 0 | 2 | 0 | 2 | 1 | 1 | 2 |
* | 1 | 0 | 1 | 2 | 0 | 2 | 0 |
* | * | 1 | * | 0 | 1 | 3 | 1 |
* | * | 2 | * | 2 | 2 | 0 | 3 |
* | * | 0 | * | 3 | * | 1 | 1 |
* | * | * | * | 1 | 2 | 3 | 0 |
* | * | 0 | * | 0 | * | 0 | 2 |
* | * | * | * | 2 | 2 | 3 | 1 |
* | * | 1 | 2 | 3 | 1 | 0 | 0 |
* | * | 0 | * | 0 | 2 | 1 | 0 |
(25)、为了找到更多的非敏感元素,回到(22),继续执行上述过程,直到不能找到新的非敏感值,在此循环中,TS中查找到的非敏感元素数量变化过程为:
30->34->35->39->40->40
当第六次执行循环时,和第五次执行相比较,未见发现新的非敏感元素,故停止循环,最终得到40个非敏感元素,如标3-2所示:
表3-2、最终查找到的非敏感元素集
p0 | p1 | p2 | p3 | p4 | p5 | p6 | p7 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
0 | 1 | 1 | 2 | 2 | 2 | 2 | 2 |
0 | 0 | 2 | 1 | 1 | 3 | 0 | 1 |
1 | 1 | 0 | 2 | 1 | 0 | 2 | 3 |
0 | 0 | 1 | 1 | 0 | 3 | 1 | 3 |
1 | 0 | 2 | 0 | 1 | 2 | 2 | 1 |
0 | 1 | 1 | 2 | 3 | 0 | 3 | 2 |
1 | 0 | 0 | 2 | 2 | 3 | 0 | 0 |
0 | 1 | 0 | 1 | 1 | 1 | 0 | 2 |
1 | 1 | 2 | 2 | 0 | 0 | 1 | 1 |
* | 0 | 2 | 1 | 3 | 2 | 3 | 0 |
* | * | 1 | 0 | 0 | 1 | 2 | 3 |
* | 1 | 0 | 1 | 2 | 0 | 2 | 0 |
1 | 0 | 2 | 0 | 2 | 1 | 1 | 2 |
1 | 1 | 0 | 0 | 3 | 3 | 3 | 3 |
* | * | 1 | 2 | 3 | 1 | 0 | 0 |
* | * | 2 | * | 2 | 2 | 0 | 3 |
* | * | * | * | 3 | 3 | 2 | 2 |
* | * | 0 | * | 0 | 2 | 1 | 0 |
* | * | * | * | 0 | 1 | 3 | 1 |
* | * | 0 | * | 3 | * | 1 | 1 |
* | * | * | * | 1 | * | 3 | 0 |
* | * | * | * | 2 | * | 3 | 1 |
* | * | * | * | 0 | * | * | 2 |
然后,使用步骤(3),对表3-2中的非敏感元素“*”进行实例化,本例中选择m=1,即提高三元组的覆盖率。
(31)、首先枚举8个参量间所有可能的三元组,并记录在表R中。此时,R中的所有元组设为“0”,即未被覆盖。
(32)、遍历表3-2,并将R中所有被表32覆盖到的三元组标记为“1”。
(33)、依次遍历表3-2中的测试用例,如下:
(331)、如果当前测试用例不包含非敏感元素,跳到(334)。
(332)、遇到含有非敏感元素时,比如,第四个测试用例的第1个元素(p0)为非敏感元素,分别计算当p0赋值为0和1时,覆盖到的在R中标为“0”的三元组的数目8和12。
(333)、因为12>8,将非敏感元素赋值为1,并回到(331)。
(334)、此时已实例化所有非敏感元素,返回测试数据,如表4所示。
(4)、将表4得到的测试数据,作为优化后的测试数据。
(5)、使用上述优化的测试数据,对待测系统进行测试。
表4、优化后的MCA
p0 | p1 | p2 | p3 | p4 | p5 | p6 | p7 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
0 | 1 | 1 | 2 | 2 | 2 | 2 | 2 |
0 | 0 | 2 | 1 | 1 | 3 | 0 | 1 |
1 | 1 | 0 | 2 | 1 | 0 | 2 | 3 |
0 | 0 | 1 | 1 | 0 | 3 | 1 | 3 |
1 | 0 | 2 | 0 | 1 | 2 | 2 | 1 |
0 | 1 | 1 | 2 | 3 | 0 | 3 | 2 |
1 | 0 | 0 | 2 | 2 | 3 | 0 | 0 |
0 | 1 | 0 | 1 | 1 | 1 | 0 | 2 |
1 | 1 | 2 | 2 | 0 | 0 | 1 | 1 |
1 | 0 | 2 | 0 | 2 | 1 | 1 | 2 |
1 | 1 | 0 | 0 | 3 | 3 | 3 | 3 |
0 | 0 | 2 | 1 | 3 | 2 | 3 | 0 |
1 | 1 | 0 | 1 | 2 | 0 | 2 | 0 |
0 | 1 | 1 | 0 | 0 | 1 | 2 | 3 |
1 | 1 | 1 | 2 | 3 | 1 | 0 | 0 |
0 | 1 | 2 | 0 | 2 | 2 | 0 | 3 |
1 | 1 | 0 | 1 | 0 | 2 | 1 | 0 |
1 | 0 | 1 | 1 | 3 | 3 | 2 | 2 |
0 | 0 | 0 | 2 | 0 | 1 | 3 | 1 |
0 | 1 | 0 | 0 | 3 | 2 | 1 | 1 |
1 | 0 | 1 | 0 | 1 | 0 | 3 | 0 |
1 | 1 | 1 | 1 | 2 | 3 | 3 | 1 |
0 | 0 | 2 | 2 | 0 | 2 | 0 | 2 |
为了进一步说明该方法的有效性,特对优化前后的测试数据的有关特性进行统计如下:
表5、优化前后测试数据统计数据
测试数据 | 测试用例数 | 二元组覆盖率 | 三元组覆盖数 | 三元组覆盖率 |
优化前(表2) | 25 | 100% | 1012 | 54.2% |
优化后(表4) | 25 | 100% | 1138 | 61.0% |
差值 | 0 | 0 | 126 | 6.8% |
从表5可见,优化前后,测试用例的数目和强度不变,但三元组的覆盖数净增了126个,覆盖率提高了6.8%,将优化后的组合测试数据用于待测系统的测试,从而提高待测试系统的检错率。使用较少的测试例就可以查找到待测系统中更多的交互错误,提高了测试的有效性。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可以轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。例如:非敏感元素集的查找,也可通过上文中所述步骤的简化版本实现,例如不进行反复查找,尽管查找到的非敏感元素集规模较小。非敏感元素的实例化,还可以通过遗传算法、模拟退火算法等元启发式算法来实现,但时间开销较大。因此,本发明的保护范围应该以权利要求的保护范围为准。
Claims (7)
1.一种多参量软件测试方法,其步骤包括:
1)生成强度为t的组合测试数据TS,所述组合测试数据由N个测试用例组成,按照先后次序,其对应下标分别为0至N-1,其中每一测试用例为一个k元组(p0,p1,…,pk-1),强度t为自然数;k为自然数,表示待测软件的参量个数;pi代表各参量,分别取值于Vi;强度为t指该组合测试数据覆盖任意不超过t个参量的所有可能的取值组合;
2)识别所述组合测试数据的非敏感元素,所述非敏感元素指测试数据中取值的改变不影响所述组合测试数据强度t的那些元素;采用的方法如下:
对测试数据中的N个测试用例,按照一定的次序依次进行,如果当前测试用例中,包含某一参量的某个取值的全部t元组都已被覆盖过,则在所有后续测试用例中,如遇到该参量取同样的值,就标记为非敏感元素;
3)实例化上述非敏感元素,使得实例化后的组合测试数据中t+m元组覆盖率得到提高,
具体采用以下步骤:
3-1)枚举k个参量的取值间所有的t+m元组,建立一个覆盖表R,并将每个元组标为0,表示尚未被覆盖;
3-2)遍历全部测试用例,并将测试用例中出现的t+m元组,在覆盖表R中标为1,表示已被覆盖;
3-3)再次遍历测试用例集,从前至后、从左至右对非敏感元素依次进行实例化;
其中m为1至k-t中的任意自然数;
4)将上述最大限度地提高t+m元组覆盖率的组合测试数据作为优化后的组合测试数据;
5)使用上述优化后的组合测试数据对该待测软件进行测试。
2.如权利要求1所述的多参量软件测试方法,其特征在于,所述步骤2)包括以下步骤:
2-1)对组合测试数据中的每一个参量pi,分别计算所有包含该参量的t元组,并保存在相应的记录集合Ri中;
2-2)为TS中的N个测试用例,生成一个候选的排序序列集S;
2-3)根据S中的每种排序序列Sk对全部测试用例进行排序,得到TSk,按照先后顺序,遍历TSk中的全部测试用例,查找非敏感元素;
2-4)将TS替换为上述查找到非敏感元素最多的TSk。
3.如权利要求2所述的多参量软件测试方法,其特征在于,重复进行步骤2-2)至2-4),直到不能查找到新的非敏感元素为止。
4.如权利要求2所述的多参量软件测试方法,其特征在于,所述步骤2-2)排序序列集S生成具体采用以下步骤:
2-2-1)计算组合测试数据TS中任意两个测试用例之间的汉明距离,存入表M中;
2-2-2)随机选择某个测试用例,将其下标作为一个只含一个下标的序列,放入下标序列集S;
2-2-3)遍历S中的每一个序列listi,设listi的最后一个下标为x,查找表M,找到下标值不包含在listi中,且和下标为x的测试用例汉明距离最大的b个测试用例的下标,分别作为listi的末端,放入S’,其中b为参数,其取值为正整数;
2-2-4)将S替换为S’;
2-2-5)如果步骤2-2-3)至2-2-5)已执行c次,转2-2-6),其中c为参数,其取值为正整数,取5和N之间的较小值;
2-2-6)如果S中的各序列包含的下标个数等于N,转2-2-8);
2-2-7)遍历S中的每一个序列listi,设listi的最后一个下标为x,查找表M,找到下标值不包含在listi中,且和下标为x的测试用例汉明距离最大的那个测试用例的下标,作为listi的末端,重复执行2-2-6);
2-2-8)返回序列集S。
5.如权利要求2所述的多参量软件测试方法,其特征在于,所述步骤2-3)包括以下步骤:
2-3-1)从S中选取一种下标序列Sk,按下标序列顺序依次选取测试用例,得到测试用例集TSk;
2-3-2)将所有的Ri中的所有t元组标为0,表示未被覆盖,以下开始按先后顺序遍历TSk;
2-3-3)对每个参量pi,依次枚举出TSk的当前测试用例中涉及参量pi的所有t元组,并在相应的记录集Ri中将相应的t元组标记为1,表示已被覆盖;
2-3-4)对每个参量pi和其对应的全部取值vj,检查其记录集合Ri中,所有pi取值为vj的t元组,如果这些元组都已被标记为1,则将当前测试用例之后的所有测试用例中,pi取值为vj的元素标记为非敏感元素;
2-3-5)重复执行2-3-3)至2-3-5),直到遍历完TSk中的全部测试用例;
2-3-6)重复执行2-3-1)至2-3-6),直到S为空集。
6.如权利要求1所述的多参量软件测试方法,其特征在于,所述步骤3-3)进行实例化具体包括以下步骤:
3-3-1)遍历当前测试用例中的每个元素,如果已无非敏感元素,执行3-3-4);
3-3-2)将遇到的非敏感元素,分别计算假如将其赋值为其对应参量的取值范围Vi中的每一个值vi,该测试用例能够覆盖到的、在覆盖表R中标为0的t+m元组的数目ni;
3-3-3)将非敏感元素赋值为ni最大的取值vi,并将R中新覆盖到的t+m元组标为1;
3-3-4)完成对非敏感元素的实例化,返回TS。
7.如权利要求1所述的多参量软件测试方法,其特征在于,通过代数方法、贪心算法或元启发式算法生成所述强度为t的组合测试数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010105269938A CN101986281B (zh) | 2010-10-26 | 2010-10-26 | 一种多参量软件测试方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010105269938A CN101986281B (zh) | 2010-10-26 | 2010-10-26 | 一种多参量软件测试方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101986281A CN101986281A (zh) | 2011-03-16 |
CN101986281B true CN101986281B (zh) | 2012-07-11 |
Family
ID=43710630
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2010105269938A Active CN101986281B (zh) | 2010-10-26 | 2010-10-26 | 一种多参量软件测试方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101986281B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102629230B (zh) * | 2012-03-07 | 2015-04-01 | 南京邮电大学 | 一种基于多特征缺陷再分配图分配缺陷报告的方法 |
CN106033386A (zh) * | 2015-03-10 | 2016-10-19 | 联想(北京)有限公司 | 软件测试方法以及电子设备 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100407161C (zh) * | 2004-09-09 | 2008-07-30 | 北京航空航天大学 | 软件动态聚类测试方法 |
-
2010
- 2010-10-26 CN CN2010105269938A patent/CN101986281B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN101986281A (zh) | 2011-03-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Xiaoyang et al. | Effectiveness of ideological and political education reform in universities based on data mining artificial intelligence technology | |
CN102184204B (zh) | 一种智能Web表单自动填充方法及系统 | |
Dawson et al. | Current state and future trends: A citation network analysis of the learning analytics field | |
US7962443B2 (en) | Method and system for replacing data in a structured design template | |
CN102521248B (zh) | 一种网络用户分类方法及其装置 | |
Akbaritabar et al. | The conundrum of research productivity: A study on sociologists in Italy | |
CN110633730A (zh) | 一种基于课程学习的深度学习机器阅读理解训练方法 | |
CN105393264A (zh) | 人机交互学习中的交互区段提取 | |
CN111709244B (zh) | 一种用于矛盾纠纷事件因果关系识别的深度学习方法 | |
CN102646095B (zh) | 一种基于网页分类信息的对象分类方法和系统 | |
CN103324632B (zh) | 一种基于协同学习的概念识别方法及装置 | |
Mouriño-García et al. | Cross-repository aggregation of educational resources | |
CN104951560A (zh) | 基于知识点结构的搜索装置 | |
US8239425B1 (en) | Isolating desired content, metadata, or both from social media | |
CN107357763A (zh) | 一种基于自步学习的众包分类数据质量控制方法 | |
Chen et al. | Graph edit distance reward: Learning to edit scene graph | |
CN102799627A (zh) | 一种基于一阶逻辑和神经网络的数据对应方法 | |
CN111259240A (zh) | 一种试题推荐方法及装置 | |
Li | A study on the influence of non-intelligence factors on college students’ English learning achievement based on C4. 5 algorithm of decision tree | |
CN101986281B (zh) | 一种多参量软件测试方法 | |
Davis et al. | Automatically generating scenarios from a text corpus: A case study on electric vehicles | |
CN103309851B (zh) | 短文本的垃圾识别方法及系统 | |
Kirchner et al. | Researching alignment research: Unsupervised analysis | |
CN116432125B (zh) | 基于哈希算法的代码分类方法 | |
Wu et al. | Entity linking in web tables with multiple linked knowledge bases |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |