qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

软件可靠性测试方法新探

摘要:针对传统软件可靠性测试方法在对软件因长期使用软件性能下降,甚至完全失效这种严重影响软件可靠性的测试存在不足的现状,通过对软件自身特性以及软件可靠性估算面临问题的深入分析和研究,结合传统的软件可靠性测试方法,提出了基于操作剖面的软件可靠性压力测试思想和操作剖面、压力测试点相互结合、互为补充的软件可靠性测试方法,并给出了软件可靠性测试新方法实施的技术途径。该思想与方法既是对传统软件可靠性测试方法的一个大胆探索,也是对软件可靠性测试方法的一个有益补充。

  关键词:软件缺陷;软件可靠性;压力测试;

  0、引言

  软件在计算机发展的不同阶段有不同的认识。计算机发展的初期,硬件在计算机应用中起决定作用,而软件,即程序,甚至是机器指令程序或汇编程序,是处于从属地位的。软件开发是以个体手工的方式进行,设计是人的智力行为,软件质量完全取决于个人的智力和编程技巧。随着计算机的发展,人们认识到软件使得计算机的计算能力大大提高,应用能力大大增强。于是在开发计算机应用系统时,硬件和软件同时考虑,而且开始编制应用支撑程序,如操作系统数据库等。这时的生产方式是以小作坊的形式进行。到了后来,社会的各种应用需要对计算机提出了更高和更特别的要求,很多大型软件系统开发的工作量高达数千人年,指令数百万条或更多,如美国宇航飞船的软件系统有4000万条语句。而今,计算机的应用面越来越广,应用规模越来越大,应用过程越来越复杂,软件在计算机系统中的比重越来越大,软件成本在总成本中的比重正在逐年上升,而且这种趋势还在增加。这时人们感到传统的软件生产方式已不适应计算机发展的需要,需要把工程学的基本原理和方法引入到软件开发过程中,即软件工程思想。

  事实上,无论计算机技术如何发展,计算机中的软件是人通过智力劳动产生的,其软件产品是人的思维结果,是一个逻辑部件,而不是一个物理部件。软件开发水平很大程度上取决于软件人员的教育、训练和经验的积累。由此软件具有与硬件或传统工业产品不同的特点:

  (1)软件是一种逻辑实体,具有抽象性,人们必须通过观察、分析、思考、判断,才能了解它的功能、性能等特性;

  (2)软件没有明显的制造过程,一旦研制开发成功,就可以大量拷贝同一内容的副本。所以对软件的质量控制,必须在软件开发方面下工夫;

  (3)软件在使用过程中,没有磨损、老化的问题,但为了适应硬件、环境以及需求的变化而进行修改,这些修改常常会引入错误,导致软件失效率升高,软件质量降低。如果修改成本太高,质量风险太大,软件就会被抛弃;

  (4)软件对硬件和环境有着不同程度的依赖性,由此带来了软件移植的问题;

  (5)软件的开发至今尚未完全摆脱手工作坊式的开发方式,生产效率低。这对复杂软件,特别是今后会更加复杂的软件带来了是否能够控制其复杂性和时效性的问题;

  (6)软件开发需要投入大量、高强度的脑力劳动,成本非常高,风险也大。现在软件的开销已大大超过了硬件的开销;

  (7)许多软件的开发和运行涉及机构、体制和管理方式等问题,还会涉及到人们的观念和心理。这些人的因素,常常成为软件开发的困难所在,直接影响到项目的成败。

  基于上述软件的特性,美国国防部中大量的软件系统其可靠性得不到保证,几乎没有不存在错误的软件系统。尽管人们在软件开发过程中采用各种软件工程方法,应用各种软件测试技术,但他们只能尽量发现错误、减少错误,却不可能彻底消除错误,无法实现真正意义上的无错软件,百分之百的可靠。

  现今计算机硬件技术的发展,使得在计算机系统中的硬件可靠性越来越高,而软件可靠性的问题变得日益突出。在一些关键的应用领域,如航空、航天等,对软件可靠性的要求尤为重要。如在银行等服务性行业,其软件系统的可靠性也直接关系到自身的声誉和生存发展竞争能力。由于软件中存在缺陷、错误和故障使软件失效很有可能造成巨大的损失或惨重的灾难。研究结果表明:由于软件开发出现问题引起的系统失效与由于硬件设计或使用引起的失效之比是10:1。由此可见,软件在计算机系统中占有绝对重要的地位。于是,人们借鉴硬件可靠性理论,提出了“软件可靠性”概念,不再追求软件无错,而以统计的观点去判断软件满足用户使用要求的程度。

  1、软件可靠性

  软件可靠性借鉴了硬件可靠性的概念,即软件按规定的条件,在规定的时间内运行而不发生故障的能力。软件可靠性与硬件可靠性不同的是:软件可靠性不但与软件中存在的缺陷有关,而且与系统输入和系统使用有关。

  从定义上看,评价或测试一个软件的可靠性,最主要的是要确定系统怎样输入、如何使用一整套的方法和策略。另一方面,软件可靠性是软件质量特性中重要的固有特性和关键因素,软件可靠性反映了用户的质量观点。而软件的故障是由于软件的质量存在问题——即它固有的缺陷导致错误,进而使系统的输出不满足预定的要求,造成系统的故障。所谓按规定的条件主要是指软件的运行(使用)环境,它涉及软件运行所需要的一切支持系统及有关的因素。如支持硬件、网络、操作系统及其它支持软件、输入数据、操作规程等。

  尽管当前的软件可靠性定义借用了硬件可靠性的定义,但事实上软件可靠性因软件的特性它与硬件可靠性相比较是有很大的差别的,如:

  (1) 硬件有老化损耗现象,硬件失效是物理故障,是器件物理变化的必然结果。软件不发生变化,没有磨损现象,但软件由于长期使用软件性能下降,甚至完全失效的故障也是有的。例如,无休止的线程、无释放的文件锁闭、数据污染、存储空间的彻底分裂与积聚差错等;

  (2) 硬件可靠性的决定因素是时间,受设计、生产、运用的所有过程影响,软件可靠性的决定因素是与输入数据有关的软件差错,是输入数据和程序内部状态的函数,更多地决定于人;

(3)硬件的纠错维护可通过修复或更换失效的系统重新恢复功能,软件只有通过重设计或排除错误;

  (4)对硬件可采用预防性维护技术预防故障,采用断开失效部件的办法诊断故障,而软件则不能采用这些技术;

  (5)可靠性预测和可靠性增长等技术对软件和硬件有不同的意义;

  (6)为提高硬件可靠性可采用冗余技术,而同一软件的冗余不能提高可靠性;

  (7)硬件可靠性检验方法已建立,并已标准化且有一整套完整的理论,而软件可靠性验证方法仍未建立,更没有完整的理论体系;

  (8)硬件可靠性已有成熟的产品市场,而软件产品市场还很新;

  (9)软件错误是永恒的,可重现的,而一些瞬间的硬件错误可能会被误认为是软件错误。

  从上我们看到,由于软件固有的特性,软件可靠性很难以硬件可靠性的概念为基础,来进行度量和评估,即硬件的可靠性计算方法和相关模型难以用于软件可靠性的估算中。这也正是软件可靠性评估与验证没有很好的方法、模型和技术,人们无法事先预测软件可靠性,无法确定软件可靠性是否增长的根本原因。

  2、软件可靠性测试

  从软件可靠性的定义上看,评价或测试一个软件的可靠性,最主要的是要确定系统怎样输入、如何使用一整套的方法和策略。即软件可靠性测试是指为了达到或验证用户对软件的可靠性要求而对软件进行的测试,属于软件测试或软件可靠性评价的范畴。尽管软件可靠性测试也不能保证软件中残存的错误数达到最少,但经过软件可靠性测试可以保证软件的可靠性达到较高的要求。

  软件可靠性测试是在软件的预期使用环境中,为了最终评价软件系统的可靠性而运用建模、统计、试验、分析、评价等一系列手段对软件系统实施的一种测试。它应该是面向故障的测试,以用户将要使用的方式来进行的,每一次测试代表用户将要完成的一组操作,使测试成为最终产品使用的预演。如:我们可以通过给系统加载一定的业务压力(例如资源在70%~90%的使用率)的情况下,让应用持续运行一段时间,测试系统在这种条件下是否能够稳定运行。这里的可靠性测试仅仅是让软件在大压力环境下运行较长的时间,来估算系统是否能在平均压力下持续正常工作。

  软件可靠性测试是获取软件可靠性估算数据的重要手段,它通过发现软件系统可靠性缺陷,为软件的使用和维护提供数据,确认软件是否达到可靠性的定量要求。目前软件可靠性测试用得最多的方法是类似于硬件操作剖面上的统计测试方法,即基于被测软件操作剖面的统计测试方法。这是最为传统、经典的软件可靠性测试方法。通过这种方法,能够实现软件可靠性的定量评估,从而有效地保障和提高软件的质量。

  软件可靠性测试与传统意义上的软件测试不同,软件可靠性测试是统计测试思想在软件可靠性度量上的应用,要求测试按照软件的操作剖面进行,测试结果使用软件可靠性模型进行评价,其中操作剖面的构造是进行软件可靠性测试的基础。

  操作剖面的英文是Operational Profile,也称为软件的使用模型,是指系统测试数据输入域以及各种输入数据的组合使用概率。它刻画了在预期环境中软件各种预期操作的统计分布,用来描述软件的实际使用情况的。在基于软件操作剖面的统计测试中,能够保证在测试过程中较早地发现那些在软件操作使用中最经常发生的失效。

  操作剖面反映了软件规格说明定义的预期使用情况。因此在建立操作剖面之前,首先必须对规格说明进行评审和澄清,保证规格说明提供了完整的功能规格说明,描述了软件在预定环境中的预期使用情况;然后,根据用户使用这些系统模式、功能、任务的概率对软件的系统模式、功能、任务需求及相应的输入激励的分析来构造操作剖面。操作剖面构造的质量决定着其测试或分析结果是否可信的程度。

  统计测试的英文是statistical testing;是通过使用对输入统计分布进行分析来构造测试用例的一种测试设计方法。

统计测试标识出频繁执行的部分,并相应地调整测试策略,针对这些频繁执行的部分进行详尽的测试。通过提高关键模块的安全性和可靠性,来提高整个系统的安全性和可靠性,以提高测试的性价比。统计测试进行的前提条件就是生成如实反映系统使用情况的使用模型。以往使用模型的建立主要是通过预测和估计得出的,不能如实地反映系统的真实情况。

  通过软件可靠性测试可以有效地发现程序中影响软件可靠性的缺陷,从而实现可靠性增长。由于软件可靠性很大程度上依赖条件的变化,特别是软件操作剖面的输入分布。因此,我们首先需要建立描述软件操作情况的操作剖面,然后在软件的操作剖面基础上按照概率统计方法设计输入的分布,最后利用操作剖面从所有软件操作中获得统计上正确的采样并对软件进行可靠性测试。这种测试方法也是惟一能直接对软件操作可靠性进行估算的统计方法。通过操作建模可以改进规格说明,得到规格说明的分析性描述,量化测试代价,通过统计测试为软件可靠性推断提供依据。

  事实上,软件可靠性测试方法就是一种黑盒测试方法,它面向需求、面向使用开展测试,不用了解程序的结构、程序的实现等问题。软件可靠性测试最好由独立的第三方测试机构来承担,主要是在系统测试、验收、交付阶段进行。

  总之,基于被测软件操作剖面的统计测试方法是在对软件的实际使用情况进行统计的基础上建立软件的操作剖面,并采用统计测试的方法进行测试。用这种方法所获得的测试数据与软件的实际运行数据比较接近,可直接用于软件可靠性估算。

  3、基于操作剖面的软件可靠性压力测试

  前述的软件可靠性测试是基于被测软件操作剖面的统计测试方法,这种方法在操作剖面确定后如何针对由于长期使用软件性能下降,甚至完全失效这种严重影响软件可靠性的问题上有一定的不足。例如,无休止的线程、无释放的文件锁闭、数据污染、存储空间的彻底分裂与积聚差错等。而这些问题的产生还是软件设计和逻辑实现带来的问题。如果这些问题解决了,就不会出现由于长期使用使软件性能下降的问题。而解决这一问题的有效方法就是基于操作剖面的压力测试或疲劳测试,即在一段时间内(经验上一般是连续72 小时)保持操作剖面上的某些点进行某些操作频繁使用,检查系统是否发生功能或者性能上的问题。

  通常现代大型软件的操作剖面很复杂,覆盖整个操作剖面进行压力测试是不现实的。如何在被测软件的操作剖面上确定压力测试的范围或测试点以及压力测试的类型是软件可靠性压力测试的重要研究内容。因此,在传统的操作剖面上结合软件可靠性统计测试方法,针对软件有别于硬件的自身特性,以及软件由于长期使用使软件性能下降,甚至完全失效这种严重影响软件可靠性的问题,采用操作剖面压力测试的方法,确定重要的压力测试点,并在这些压力测试点上分别进行相应类型的压力测试,以保证软件经过长时间运行后,性能不会下降,失效不会产生,来达到提高软件可靠性的目的。这种面点结合、互相补充的测试思想丰富了软件可靠性测试内容,解决了软件可靠性测试不仅要考虑操作剖面的功能统计测试问题,还要考虑操作剖面上的压力测试问题,并使操作剖面和操作剖面上的压力测试点成为相辅相成的软件可靠性测试方案。

  从以上方案可以看到,准确地寻找操作剖面上的各个压力测试点,有效地确定压力测试类型,设计相应的压力测试用例,并将这些测试用例纳入到被测软件的操作剖面的统计测试用例中是软件可靠性压力测试的关键,也是现代软件可靠性测试的关键。这需要在操作剖面的基础上对被测软件进行静态分析和动态测试,查找可能严重影响软件可靠性的因素,如:内存泄露、数据污染、线程死锁、文件冲突等,并将这些作为压力测试点的压力测试内容,确定相应的压力测试类型。

  由于软件自身的特点,软件可靠性与硬件可靠性相比内涵发生了根本的变化,软件可靠性估算必须以软件可靠性分析及软件可靠性测试等结果或缺陷数据为重要依据,软件可靠性估算模型及模型输入参数与软件可靠性测试结果紧密相连。为此,我们一定要抓住软件的特性,强调软件可靠性测试对于软件可靠性估算的重要支撑作用,研究软件可靠性测试方法和技术,特别是研究基于被测软件操作剖面的压力测试技术和基于软件可靠性分析和测试结果的软件可靠性估算模型是一个有理论价值和变革意义、并存在很大的难度且面临极大挑战的研究课题,这也是本文抛砖引玉要达到的目的。

  4、结束语

  本文对软件的自身特性、软件可靠性及软件可靠性测试等概念进行了阐述,并在此基础上根据笔者工作实践对软件可靠性测试方法进行了探讨,提出了用操作剖面上的压力测试概念来弥补传统的操作剖面上的功能统计测试的不足,强调软件可靠性测试对于软件可靠性估算的重要支撑作用。软件可靠性研究的理论和方法多种多样但无法实施和运用的关键问题是没有很好地分析和研究软件的自身特性和软件出错的自身规律,照搬照套硬件可靠性的概念和估算方法与估算模型,从而使软件可靠性估算及评测走向死胡洞。对软件可靠性估算及评测起决定支撑作用的软件可靠性测试应该是当前乃至今后的一个重要研究领域或课题。计算机系统或软件系统的整个可靠性应该分别计算硬件可靠性和软件可靠性,然后进行结果的科学整合,而这也是国内外研究的空白,因此需要有更多的人力和物力投入到这方面的研究之中。

posted on 2013-06-25 10:18 顺其自然EVO 阅读(264) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2013年6月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜