基于帕累托法则的软件测试策略优化

时间:2022-03-22 05:43:16

基于帕累托法则的软件测试策略优化

摘 要:通过分析软件测试故障的分布特性,研究故障发现、分布与测试用例设计、测试人员等的相关性,提出一种基于帕累托法则的测试策略优化改进方法,在测试设计方法的应用、人员的任务分配、测试重点等方面进行有效的优化,并介绍该方法的具体应用步骤。最后,通过几个项目的应用结果表明:该方法简单、实用,可以有效地提高测试效率和暴露软件缺陷的概率。

关键词:软件测试;故障数据分析;帕累托;策略优化

中图分类号:TP311文献标识码:B

文章编号:1004-373X(2008)24-089-04

Optimization of Software Testing Strategy Based on Pareto

HUANG Maosheng,YANG Chunhui

(Software Quality Engineering Research Center,The 5th Electronics Research Institute of MII,Guangzhou,510610,China)

Abstract:This paper analyses the distribution of bugs and studies the relation between bugs and the method of uncovering them,then proposes a method to optimize the strategy of software testing based on Pareto,the method introduces how to assign the method of test case design,test engineer and function point.The paper also introduces how to apply the method.Finally,the result of using this method in several projects shows that the method is simple and useful,it can improve the efficiency of software testing and the possibility of uncovering bug.

Keywords:software testing;analysis of fault data;Pareto;strategy;optimization

1 引 言

软件测试策略是在一定的软件测试标准、测试规范的指导下,依据测试项目的特定环境约束而规定的软件测试的原则、方式、方法的集合。依据软件本身性质、规模和应用场合等的不同,选择不同测试方案,以最少的软硬件、人力资源投入得到最佳的测试效果,这是测试策略的目标所在[1]。按照当前的技术发展趋势,软件规模和复杂程度急剧地提高,在软件测试工作需要更多时间的同时,项目周期却比以前大大缩短,如何在有限的时间内,利用有限的资源完成软件测试工作,尽最大的可能暴露软件中隐含的缺陷,实施高效的软件测试,是软件测试工作中亟待解决的问题。

针对这一问题,对软件测试故障特性进行分析,根据被测软件中故障的分布特性,对测试方法、人员等资源进行优化配置,进行测试过程进行改进是一种有效的途径。Myers 曾在其经典著作《The Art of Software Testing》中说到“研究软件错误对改进将来的设计和测试过程有无法估量的意义”[2],但对软件故障分析的内容、方法研究,以及如何利用故障分析结果改进测试过程是目前工程实践中亟待解决的问题。

本文分析了软件故障与帕累托法则的相关性,并基于帕累托法则,统计分析软件故障的分布特性,研究故障发现与测试用例设计、测试人员等的相关性,结合测试项目实践,提出基于帕累托(Pareto)法则的测试策略优化方法,并给出具体应用的步骤,介绍实际应用效果。

2 软件故障分布与帕累托法则的相关性

帕累托法则是由19世纪末和20世纪初意大利经济学家及社会学家帕累托研究国民收入的差异时提出,又称2/8定则。帕累托分布的分布函数为P{X>t}=(-a),其中t>1,a>0,帕累托分布在自然界的广泛存在是由以下定理保证的:

定理1:独立同分布的随机量之和服从stable分布(正态分布只是stable分布的一个特例,中心极限定理也是本定理的特例)。

定理2:当x无穷时,stable分布近似于Pareto分布(Pareto分布是大样本情况下stable分布的近似)。

Mller早在1984年就报道这样一个分布规律:45%的错误集中在10%代码,而最后的50%代码包含只有10%的错误,IBM等公司的统计数据也表明:80%的缺陷是在20%的模块中发现的,由此可见,软件故障是有类聚性的[3],遵循帕累托分布规律,即20%的模块包含了80%的错误。此外,开发人员的思维定势也会造成同样的错误在其编写的代码中一再重复出现,而测试工作由于人员和设计方法的不同,也使其发现的故障呈现一定的分布规律。由此可见软件故障在模块、人员、测试设计方法等方面,遵循帕累托分布规律。

3 基于帕累托法则的故障分布特性分析及测试优化策略

3.1 针对故障类型与模块分布特性的测试策略优化

(1) 违反编码规则和度量指标的问题分布。

根据对多个测试项目的测试结果分析表明:静态分析发现问题较多的模块,在动态测试中也会出现较多的缺陷,静态分析结果与动态问题数有一定的关联性;缺陷的密度分布与子系统的复杂程度有关,如一些圈复杂度较高的代码,其出现问题的可能性较高。因此,静态分析结果可以用来指导动态测试的测试用例设计,进行的测试用例时,针对程序最容易出现的故障的地方有所侧重和重点关注,可以提高测试用例发现故障的概率,进一步提高测试效能。

在具体应用上,可以利用测试工具进行静态分析和人工评估分析来实现分布特性分析。静态分析包括代码检查、控制流分析、数据流分析、表达式分析和静态度量指标分析等项目。检查的规则和度量指标值根据一些统计数据(即经验数据)来确定,也可以依据一些国际上常用的标准,如欧洲防务标准和汽车工业标准等。测试工具分析后的数据再进行人工分析定位、统计、评估,形成被测试软件的编码规则和度量指标的问题分布表,并用来指导动态测试用例的设计。

(2) 故障在各个模块中的分布。

IBM等公司的统计数据表明:80%的缺陷是在20%的模块中发现的,而这20%易出错的模块,基本上对开发人员来说是新技术或者难度高、技术含量高的部分。在软件测试中应把握这一规律,对软件开发人员以前未曾开发过或未接触过的、对软件运行起到关键作用的模块和代码尤其注意,对其进行充分的测试以发现更多的错误[4]。

因此,在用例执行过程中对发现的故障,进行初步的统计分类,计算其在不同软件功能模块中的分布(即软件故障的区域分布),根据软件缺陷的类聚性,“发现的软件缺陷越多,表明未发现软件缺陷越多” [3],对发现较多缺陷的模块增加针对性测试用例,尽可能暴露更多的软件缺陷,可以有效提高测试用例的故障发现率。

(3) 故障类型的分布。

一个错误往往是由类似的同一原因引起的更多错误的征兆,这些错误往往会在同一个人或同一团体已经完成的工作中被找到。通过分析故障类型的分布,得出出现较多的典型错误,对分析的结果可以马上应用于开发一个更有效的检查单和测试用例,选择更重要的回归测试,发现更多的同一类型错误或由同一原因引起的错误。

3.2 针对故障与人员相关性的测试策略优化

(1) 不同开发人员编写的代码中故障数据分布。

每个人都有其固定的思维特点和偏好,程序员往往会犯相同的错误,同一个开发人员在其开发的程序中常会反复犯其容易犯的错误。通过对发现的故障数据进行分析,统计故障数和故障类型在不同开发人员开发的程序中的分布情况,对发现较多故障的模块(代码),确定其开发者,然后对其开发的其他模块(代码)加强测试,在测试用例的设计上,也要侧重于其所引入的故障类型,使测试用例能达到较高的缺陷发现率。

(2) 不同研制单位的故障数据分布。

软件的开发人员及研制单位都常会犯一些相同的错误,导致一些典型的软件缺陷。通过对发现的故障数据分析,可以设法找到一个软件研制单位所常犯的典型错误,这些典型错误通常是由于欠缺规范(或标准)、配置管理、设计训练或单元测试,或其他原因而引起的。通过统计分析不同单位开发软件的测试故障数据发现,一个单位开发软件出现的较多的某种错误类型,在另外一个单位开发的软件中却很少或几乎不会出现,而另一种错误类型的出现情况则相反。

(3) 不同测试人员发现故障的特点分析。

测试人员与开发人员同样具有其固定的思维特点和偏好,这些特点和偏好往往有助于其去发现某些特定类型的软件缺陷,却不利于其发现另外一些类型的软件缺陷,这个特性在使用猜错法进行测试和进行代码走查时尤其明显。对不同测试人员发现故障类型的分类和特点分析,其目的就是对测试组内不同的测试工程师的优缺点进行分析,在测试工作中用其所长,避其所短,提高测试发现缺陷的效率,也为对测试人员进行合理的调配,组建高效率测试组提供有益的借鉴。

不同测试人员发现故障的分类及其特点分析主要统计所有发现缺陷,进行故障分类;并将这些分类与测试工程师进行关联分析,查找每个测试工程师在发现缺陷方面的特点;然后利用这些特点,在组建测试组和进行测试组内工作分工时将这些因素和特点考虑进去,则可以有效地提高测试组发现软件缺陷的效率。

3.3 针对各研发阶段的故障分布的测试策略优化

“什么时候出的错?是最难回答的一个问题,但也是最有价值的问题”[2],通过查阅设计文件和设计的历史资料查找和分析直接导致故障出现的原因根源,其可能是需求中的一个二义性语句、修改先前的错误所造成的或没有考虑非法输入导致的,用故障分析去确定每个故障是什么时候和谁造成的还远远不够,还要确定到底为什么出错[5],如果找出一个错误的问题根源,就能用同样的方法发现更多同类性质的错误。

3.4 针对故障类型与用例设计方法相关性的测试策略优化

故障分析还要回答一个问题“用例是怎样发现错误的?”[5],如果一个测试用例成功地发现了一个故障,就要对这一用例的设计方法和输入的测试数据进行分析“为什么这个测试用例成功?”[5]。对于其他测试用例能否从这得到有益的借鉴,使本次测试、也使将来的测试有所改进。进行故障类型与用例设计方法之间关联分析,才能利用成功的测试经验来改进检查和测试过程,以便在将来的设计中更好地发现这一类型的错误。

4 应用步骤和实践

4.1 步骤

(1) 收集故障数据。

在测试过程中,对每一个用例的实际输出和故障现象进行详细的记录,形成测试问题报告单,然后按故障分析对象和分析内容,分类收集测试故障数据。

(2) 计算整理。

对收集来的数据资料进行整理和加工,并按不同分析类型要求进行分类(如模块分布、类型分布等),计算故障数,故障数占总数的百分比,如表1所示。

(3) 数据分类排序。

根据选择定的分析类型要求(如模块分布)对计算整理后的数据进行从大到小的排序,然后计算故障累计比率,并将计算结果填写在表格最右边一列,如表1所示。

表1 故障数据表

模块代号故障数故障比例累计故障比例模块代号故障数故障比例累计故障比例

M12526.9%26.9%M1511.1%96.8%

M22122.6%49.5%M1611.1%97.8%

M31314.0%63.4%M1711.1%98.9%

M466.5%69.9%M1811.1%100.0%

M555.4%75.3%M1900.0%100.0%

M655.4%80.6%M2000.0%100.0%

M744.3%84.9%M2100.0%100.0%

M833.2%88.2%M2200.0%100.0%

M911.1%89.2%M2300.0%100.0%

M1022.2%91.4%M2400.0%100.0%

M1111.1%92.5%M2500.0%100.0%

M1211.1%93.5%M2600.0%100.0%

M1311.1%94.6%M2700.0%100.0%

M1411.1%95.7%M2800.0%100.0%

(4) 绘制帕累托图。

用表1所列数据绘制双坐标图,首先以模块代号为横坐标,模块故障数为纵坐标,绘制直方图,从大到小显示不同模块的故障数,然后再以累计故障比例为纵坐标,绘制折线图。

(5) 提出测试侧重点,优化测试策略。

根据帕累托图,查找故障累计达到80%之前的模块代号,在图1中为M1~M6。在补充和选取回归测试用例时,侧重性地针对这几个模块补充和选取测试用例。

同样道理,在补充测试用例时,所使用的设计方法也应是基于帕累托法则分析所得到的20%最有效的设计方法。

图1 帕累托图

4.2 应用实践

(1) 故障在模块中的分布特性分析及测试策略优化。

根据在装备软件第三方测试工作中的尝试,根据帕累托法则对测试进行优化,改进测试重点和测试设计方法,提高了缺陷的发现率和测试用例的效率,取得了比较明显的效果,见表2所示。项目1中提高了11.7%的缺陷数,而项目2则提高了15.6%,其他项目也普遍占10%以上。在测试用例的效率上,项目1和项目2在优化前分别为25和16.9个测试用例发现1个软件故障,而经过优化后增加的测试用例则分别为7.7和14个测试用例发现1个软件故障。

表2 测试策略优化应用效果统计表

项目名

项目基本情况测试策略优化后

总用例数总缺陷数增加用例数新发现缺陷数占总缺陷数比例

项目11 02145 46613.3%

项目226416 28212.5%

(2) 测试人员发现故障的特点分析。

首先,对3个装备软件测试项目的代码检查数据进行统计分类后,剔除测试工具发现的问题,不列入故障数据统计范围。项目1和项目2由A,B,C三位测试工程师参加代码走查,项目3由A,B,C,D四个测试工程师进行代码走查,对每个测试人员代码走查发现问题数转换成其占该类问题的百分比,见表3所示,然后通过比较发现以下规律:

①测试工程A在3个项目中,发现的“指针内存”和“循环结构”类问题基本上占了该类问题总数一半以上,而其他的测试工程师在发现该类问题上,在不同的项目是随机的,没有一定的规律和趋势。

②在“指针内存”问题上C测试工程师在3个项目的代码走查中发现问题数占该类型问题数都较少甚至没有。

其次,根据上述不同测试人员发现故障的特点,在第4个测试项目的分工上,让测试工程师A在第四个项目代码走查中,负责对“指针内存”和“循环结构”类问题进行重点审查,其他测试工程师则不进行侧重性分工,统计结果表明,工程师A发现问题的比例和绝对数量提高明显。

表3 项目代码走查数据分类统计表

问题 /%

项目1项目2项目3项目4

ABCABCABCDABCD

宏定义100.00093.106.9000100.0000100.0

循环结构75.025.0046.22.651.350.00050.075.025.000

指针内存55.644.4050.0050.00000100.0000

最后,由于测试工程师未参加第1、第2个项目,则在4个项目中在进行比较,又可以发现测试工程师A和D在发现“宏定义”类问题的能力上基本相当,但比测试工程师B和C更有效率,因此,在后续的项目中可以根据这一特点,对测试人员A,B,C,D进行合理的调配,组建高效率测试组,而且随着可分析项目的数量增加,测试人员的特长会分析的越来越精确,对测试组内人员分工就可以越细化,工作也越高效。

5 结 语

基于帕累托法则的测试策略优化,一方面,在项目测试工作过程中,通过对故障类型和分布特性进行分析,查找故障缺陷模块类聚性和故障类型的类聚性,改进软件测试设计过程和提高测试的效能;另一方面,进行故障与人员相关性分析,查找发现软件设计人员、开发过程等方面的不足,根据其薄弱点提出一个机构或个人在那一方面需要提高或需要加强培训,并提出针对性培训建议,从而促进开发过程的改进。此外,利用测试人员发现故障特点分析结果,对测试人员进行针对性的调配,组建高效率测试组和进行合理的组内分工,可以提高测试故障的发现率,促进测试过程的改进。通过多个项目的实践证明,基于帕累托法则的测试策略优化可以明显提高测试效率。

参考文献

[1]朱少民.软件测试技术和方法[M].北京:清华大学出版社,2005.

[2]GLenford J Myers.计算机软件测试技巧[M].周芝英,译.北京:清华大学出版社,1985.

[3]Ron Patton.软件测试[M].周予滨,译.北京:机械工业出版社,2002.

[4]肖瑜.测试用例自动生成方法研究与实现.现代电子技术,2008,31(16):100-102.

[5]Endres A.An Analysis of Errors and Their Causes in System Programs[J].IEEE Transactions on Software Engineering SE-1,1975:140-149.

[6]李宁.软件测试策略研究与实践[A].国防科技工业软件评测技术交流会论文集,2007.

[7]郑人杰.计算机软件测试技巧[M].北京:清华大学出版社,1992.

[8]William E Lewis.软件测试与持续质量改进[M].2版.陈绍英,译.北京:人民邮电出版社,2008.

[9]Marnie L Hutcheson.Software Testing Fundamentals Methods and Metrics[M].人民邮电出版社,2007.

[10]罗圣仪.计算机软件质量保证的方法和实践[M].北京:科学出版社,1999.

作者简介 黄茂生 男,1973年出生,广东肇庆人,高级工程师,学士。主要研究方向为软件测试、软件可靠性。

杨春晖 女,1965年出生,湖南洞口人,研究员,硕士。主要研究方向为软件质量工程、项目管理。

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

上一篇:OFDM自适应算法在煤矿井下的应用研究 下一篇:两种剔除异常数据的方法比较