软件可靠性分析之于软件测试意义探讨
2021-12-06孙士文
孙士文
摘要:自1985年微软发布人类历史上第一个基于个人计算机视窗操作系统以来,社会的科技、文明进入了迅猛发展阶段。软件应用已渗透到了我们生活中的各个方面。相应的软件质量已经成为软件企业的核心竞争力。本文基于笔者实际工作经验,结合软件测试工作实际情况探讨了软件可靠性分析对软件质量保证的重要意义。
关键词:软件可靠性分析;软件测试
随着软件业的飞速发展,软件企业间的竞争也更加激烈。一方面软件产品发布周期不断缩短;另一方面,用户对软件的质量要求也越来越高。软件失效导致的隐私数据泄露、软件响应速度慢、分析结果错误等都会让用户对软件丧失信心,使软件企业失去竞争力。如何通过软件可靠性研究,提高软件产品质量是软件质量管理从业者需要考虑和研究的重要方向。
一、软件可靠性研究介绍
根据IEEE在1991年的定义,软件可靠性是指计算机程序在特定环境中的特定时间段内无缺陷运行的概率[1]。软件可靠性工程(SRE)被定义为根据用户对可靠性的要求对基于软件系统的操作行为进行定量研究[2]。SRE 过程由四个主要部分组成:可靠性目标;软件测试;可靠性建模、测量以及可靠性验证。可靠性目标是从客户的角度对产品可靠性目标的规范,可靠性建模是可靠性估计过程的基本要素。通过对已有失效数据进行分析,可以对产品可靠性进行估计。SRE已被多个组织在其软件项目和报告中采用作为标准或最佳实践,包括AT&T、朗讯、IBM、美国宇航局、微软以及北美、欧洲、亚洲的许多其他组织。
软件可靠性增长模型(SRGM)是描述软件可靠性的数学工具。该模型认为在软件开发过程中的测试阶段,软件中的错误会被检测出来,并且被不断修复。随着测试的进行,软件系统中剩余错误(faults)的数量会减少。这意味着软件失效的概率降低,软件可靠性增加。两次被检测出的软件失效(failures)时间间隔随测试时间的延长而变长。
从1972年Jelinski 和 Moranda发表Jelinski-Moranda 模型以来,世界上已经公开发表了上百个软件可靠性模型。从建模方法上可以将软件可靠性增长模型分为软件可靠性解析模型和软件可靠性启发模型两大类[3]。
软件可靠性解析模型可以分为指数模型、对数模型、Littlewood-Verrall模型、数据域模型、基于Markov过程的NHPP模型、随机Petri网模型等。经典的指数模型有Jelinski-Moranda软件可靠性模型,Goel-Okumoto软件可靠性模型,Musa基本执行时间模型,超指数增长模型,S-Shape模型等。经典的对数模型是Geometric模型和Musa-Okumoto对数泊松模型,这两个模型都属于对数无限错误模型。Littlewood-Verrall可靠性模型 (L-V模型)考虑了发现失效不被完全剔除的情况。数据域模型的典型代表是Nelson模型,它是最重要的软件可靠性模型之一。基于Markov过程的不完美调试NHPP模型主要用于评估预测基于构件的软件系统。随机Petri网模型作为软件可靠性建模的一种工具能较全面地描述系统的动态变化行为,当系统发生变化时,只要增加相应位置中的标记数即可,可以大大减少工作量。
软件可靠性启发模型利用软件历史失效数据对自身进行训练、更新,最终找到最优模型。启发模型可分为基于神经网络的软件可靠性模型和基于遗传编程的软件可靠性模型。Adnan, Yaakob, Anas等人通过实验证明了增加隐藏层可以有效地提高神经网络模型的性能。Kiran, Ravi等人使用小波神经网络对软件可靠性进行建模,并验证该模型的有效性。Harirforoush, Seyyedi 和Mirzaee等人使用构件故障进行建模分析,证明该方法可以节约可靠性评估/预测时间。Lu Zhao, Jian-pei Zhang, Jing Yang和Yan Chu等人使用模糊小波神经网络对软件可靠性进行建模,实验证明该模型构建方法简单。在遗传编程 (genetic programming,GP)软件可靠性建模方面,Costa, Vergilio和Pozo 等人于2005年提出了基于时间GP模型和测试覆盖率GP模型,并将GP模型与传统解析性软件可靠性模型和神经网络软件可靠性模型进行了比较。
对解析模型和启发模型比较来看,解析模型的应用需要基于一定的假设约束,随着软件系统越来越复杂,软件企业对软件的管理过程差异化越来越大,这些假设条件很难得到满足。软件可靠性启发模型的优点在于无需对软件系统的失效进行假设约束,具有强大的自适应、自学习、容错和推广能力,能够从背景不清楚和不完全的数据中自动提取反映事物内在规律和特点的知识,并能够应用通过学习所获取的知识来进行问题求解。
二、当前软件研发过程中质量管理面临的问题
互联网的兴起使软件产品的交付方式、交付周期发生了巨变。软件企业既要不断改进软件研发过程,又要合理地分配资源。这就需要用科学的方法去指导实践。
随着软件工程的演进,软件的组织管理模式从传统的瀑布式逐渐转变为敏捷开发模式。Web应用软件的发展使持续集成/持续部署(CI/CD)思想深入软件企业。基于CI/CD,Web应用软件可以实现每天上百万次的灰度发布。自动测试技术的飞速发展,使自动测试的覆盖度大幅提高。软件测试有几个不变的公理 [4]: ○1完全測试程序是不可能的。○2软件测试是有风险的行为。○3测试无法发现潜伏的软件缺陷。○4找到的软件缺陷越多,不能说明软件中存在缺陷越多。○5并非所有软件缺陷都要修复。○6什么时候才叫缺陷难以说清。○7 产品说明书从来没有最终版。以上问题说明想要通过全面的软件测试发现所有软件缺陷是不可能的。并且每增加一次的测试,都意味着投入更多的成本。
在软件产品的研发阶段,如何科学合理地分配测试资源,是软件企业面临的一个问题。 在大部分的软件企业中,分配测试资源主要是依据软件开发过程的管理规范以及管理者的经验。如果在这一过程中,能结合已有软件失效数据进行定量分析,将使测试资源的分配更加科学、合理。
三、应用软件可靠性分析的实际意义
通过使用软件可靠性分析模型对已有数据进行预测,能够解决以下问题:
1. 预测软件中存在软件失效风险的功能区域,合理分配测试资源。
无论采用瀑布式软件开发模型还是敏捷软件开发模型,我们都可以将软件测试划分为若干阶段。通过对当前阶段已有失效数据进行可靠性分析,可以预测下一阶段中软件失效风险较大的区域,并依此分配测试资源。
2. 分析用户反馈,对用户重点关注的区域或问题投入较多测试资源。
通常,软件企业会收集用户在使用软件产品过程中发现的软件失效。通过对用户反馈的失效进行分析,能够了解对用户来说哪些功能区域最重要。这些功能区域可能会随时发生变化。比如,对于统计分析软件来说,从2020年新冠疫情爆发以来,用于帮助医药企业进行药品研发的功能区域变得更加重要。对于这些区域,可以投入相对较多测试资源。
实际上,并非所有软件中存在的失效都需要被修复。或者说,并非所有软件失效都具有相同的优先级。通过对用户的失效数据进行分析,可以对软件失效设置优先级,优先修复对用户来说最重要的问题。
3. 预测软件产品中潜在风险
当软件的底层代码发生更改后,很多功能区域都会受到影响。作为软件研发人员,有时候很难说清哪些功能区域会受到影响。通过对已有的软件失效数据进行分析,能够及时发现可能出现功能衰退的潜在风险区域。
4. 预测新版本的质量
在即将发布一个新版本的时候,通常,我们不知道这个版本的质量如何。相比上一个版本,是否存在衰退问题。通过对已有失效数据进行分析,可以对即将发布的新版本质量进行预测。
5. 寻找影响软件质量的其他因素
软件企业一直在寻找、尝试提高软件质量的方法,希望能够从建立软件研发过程中的标准规范、对研发人员进行培训、改进项目管理方式、尝试使用更先进的软件开发模型、建立共享知识库等方面来帮助提高软件产品质量。在软件可靠性分析中,可以将这些因素作为输入变量,通过软件可靠性分析,判断他们是否有助于提高产品质量,从而为企业的管理方向提供参考。
四、结论
通过使用软件可靠性分析对已有失效数据进行分析,能够帮助软件企业合理分配测试资源,找到用户关注的重点区域、重点问题。同时,能够帮助企业对管理方法、流程进行检验与调整。在做软件可靠性分析的过程中,要结合软件开发的过程、方法、管理手段等对软件失效数据进行分析,从而找出适合当前软件的可靠性分析模型。
参考文献
[1] ANSI/IEEE, Standard Glossary of Software Engineering Terminology, STD-729-1991.
[2] M.R. Lyu (ed.), Software Reliability Engineering: A Roadmap.
[3] 耿技,聶鹏,秦志光,软件可靠性模型现状与研究, 电子科技大学学报,第42卷第4期2013年7月
[4] (美)佩腾(Patton, R.)著,张小松等译,软件测试(原书第2版), ISBN 978-7-111-18526-0.