浅议软件可靠及安全测试
来源:用户上传
作者: 何 迅
[摘要]本文在介绍软件可靠性及安全性的基础上,讨论软件可靠性测试的特点、进行软件可靠性测试的基本条件,以及软件安全性测试的必要条件和常用的测试方法。并简要阐述软件测试在软件生产中是必不可少的质量保障手段。
[关键词]软件可靠性 软件安全性 基本条件 测试方法
现在的信息系统应用越来越广泛、越来越深入和重要,成为社会生活不可或缺的东西。而在信息系统中,软件的比例愈来愈大、愈来愈复杂、地位愈来愈关键。软件的可靠性是整个信息系统可靠性的重要因素,甚至是决定因素。软件的可靠性是由软件系统中潜在的漏洞情况决定的。软件漏洞在复杂的信息系统运行过程中,在一定的输入信息和运行环境下,潜在的错误有时会显露出来,对系统的运行造成严重影响。例如1998年前苏联一次载入飞行不能顺利返回地面,1996年欧洲阿丽亚娜火箭的发射失败等,都是由于系统的软件故障造成的。特别要注意的是软件往往是系统可靠性的薄弱环节,因此软件系统的可靠性需要引起有关人员的格外重视。
软件可靠性是指在规定条件下,在规定时间内,软件不引起系统失效的概率。该概率是系统输入和系统使用的函数,也是软件中存在故障的函数,系统输入将确定是否会遇到存在的故障。
软件可靠性测试指在有使用代表性的环境中,为进行软件可靠性估计对该软件进行的功能测试。需要说明的是,“使用代表性”指的是在统计意义下该环境能反映出软件的使用环境特性。软件可靠性测试一般在软件验收阶段进行,即可以在实验室也可以在现场测试运行。一般仅适用于有可靠性定量要求、且可能会影响安全和任务完成的关键软件。
软件系统的可靠性测试是软件系统可靠性质量保证过程中非常关键的一步,根据国外有关资料统计和工作实践证明,可靠性测试对提高软件的可靠性有重大作用,其他测试不能代替,但是软件可靠性测试又不能代替其他软件测试的作用。软件可靠性测试的主要目的有: (1)通过在有使用代表性的环境中执行软件,以证实软件需求是否正确实现。(2)为进行软件可靠性估计采集准确的数据。估计软件可靠性一般可分为四个步骤,即数据采集、模型选择、模型拟合以及软件可靠性评估。可以认为,数据采集是整个软件可靠性估计工作的基础,数据的准确与否关系到软件可靠性评估的准确度。 (3)通过软件可靠性测试找出所有对软件可靠性影响较大的错误。
软件可靠性测试分为四个阶段:
1.制订测试方案
本阶段的目标是识别软件功能需求,触发该功能的输入和对应的数据域,确定相关的概率分布及需强化测试的功能。
(1)分析功能需求。分析各种功能需求,识别触发该功能的输入及相关的数据域(包括合法与不合法的两部分)。
(2)定义失效等级。判断是否存在出现危害度较大的1级和2级失效的可能性。如果这种可能性存在,则应进行故障树分析,标识出所有可能造成严重失效的功能需求和其相关的输入域。
(3)确定概率分布。确定各种不同运行方式的发生概率,判断是否需要对不同的运行方式进行分别测试。如果需要,则应给出各种运行方式下各数据域的概率分布;否则,给出各数据域的概率分布。判断是否需要强化测试某些功能。
(4)整理概率分布的信息将这些信息编码送入数据库。
2.制订测试计划
本阶段的目标是:
(1)根据前一阶段整理的概率分布信息生成相对应的测试实例集,并计算出每一测试实例预期的软件输出结果。本阶段需要注意:在按概率分布随机选择生成测试实例的同时,要保证测试的覆盖面。
(2)编写测试计划,确定测试顺序,分配测试资源。由于本阶段前一部分的工作需要考虑大量的信息和数据,因此需要一个软件支持工具,建立数据库,并产生测试实例。另外,有时预测软件输出结果也需要大量的计算,有些复杂的软件甚至要用到仿真器模拟输出结果。总之,具体实施与被测应用软件的实际功能类型有关。
3.测试
本阶段进行软件测试。需注意的是被测软件的测试环境(包括硬件配置和软件支撑环境)应和预期的实际使用环境尽可能一致,对某些环境要求比较严格的软件(如嵌入式软件)则应完全一致。测试时按测试计划和顺序对每一个测试实例进行测试,判断软件输出是否符合预期结果。测试时应记录测试结果、运行时间和判断结果。如果软件失效,那么还应记录失效现象和时间,以备以后核对。
4.编写测试报告
按软件可靠性估计的要求整理测试记录,并将结果写成报告。笔者认为,软件可靠性测试的关键在于:对需求、输入、数据域的识别及相关概率分布的确定。按照概率分布随机生成测试实例,并确定测试顺序。
软件可靠性是软件质量指标体系中最重要的质量指标之一,软件可靠性指标的高低,决定了软件是否能稳定、可靠性地工作。软件中的错误是在软件的开发过程中,因为人的错误而引入到软件中的,而且这种错误的出现是不可避免的。经过可靠性测试的软件系统可以大大降低因软件系统的实效而造成的损失。但是软件可靠性测试也不是万能的,它可以有效降低软件系统实效的可能,但是不能将软件系统中存在的错误都排除(实际上在可预见的未来也不可能把软件中的所有错误都排除)。
对软件进行安全测试是软件测试的重要研究内容。软件安全测试是保证软件能够安全使用的最主要的手段,如何进行高效的安全测试成为业界关注的话题。多年的安全测试经验告诉我们,做好软件安全测试的必要条件是:一是充分了解软件安全漏洞,二是拥有高效的软件安全测试技术和测试工具。
软件安全性测试的方法:(1)形式化安全测试。模型检测用状态迁移系统S描述软件的行为,用时序逻辑、计算树逻辑或演算公式F表示软件执行必须满足的性质,通过自动搜索S中不满足公式F的状态来发现软件中的漏洞。(2)基于模型的安全功能测试。基于模型的测试方法是对软件的行为和结构进行建模,生成测试模型,由测试模型生成测试用例.常用的软件测试模型有有限状态机、UML模型、马尔可夫链等。(3)语法测试。语法测试是根据被测软件的功能接口的语法生成测试输入,检测被测软件对各类输入的响应。接口可以有多种类型,命令行、文件、环境变量、套接字等。语法测试基于这样一种思想,软件的接口或明确或隐含规定了输入的语法。语法定义了软件接受的输入数据的类型、格式。语法定义可采用BNF或正则表达式。语法测试的步骤是识别被测软件接口的语言,定义语言的语法,根据语法生成测试用例并执行测试。生成的测试输入应当包含各类语法错误,符合语法的正确输入。不符合语法的畸形输入等。通过察看被测软件对各类输入的处理情况,确定被测软件是否存在安全缺陷。语法测试适用于被测软件有较明确的接口语法,易于表达语法并生成测试输入的情况。语法测试结合故障注入技术可得到更好的测试效果。(4)模糊测试。模糊测试(Fuzz Testing)是一种发现安全漏洞的有效的测试方法,在安全性测试中越来越受到重视。模糊测试将随机的坏数据插入程序,观察程序是否能容忍杂乱输入。模糊测试是不合逻辑的,只是产生杂乱数据攻击程序。采用模糊测试攻击应用程序可发现其他采用逻辑思维来测试很难发现的安全缺陷。(5)基于属性的测试。相关报道描述了基于属性的测试方法,采用TASPEC语言对软件的安全属性进行描述生成安全属性规格说明,利用程序切片技术抽取与这个安全属性相关的代码,测试这部分代码是否违反安全属性规格说明。基于属性的测试有针对性的测试目标软件的特定安全属性,可满足安全属性的分类和优先级排序要求,且部分与具体软件无关的属性规格说明是可重用的。
软件测试一方面是业务需求检查、验证的一种手段,也是检查软件功能是否按照系统需求进行设计,是否符合客户的需要;另一方面也是通过有限的测试数据案例检查发现程序中存在的Bug是保证软件质量至关重要的一步。对于像银行这样的公司,对系统的要求是每天24小时不间断工作,特别是国内各商业银行大集中以后,如果软件存在Bug引起系统不稳定,一旦出现系统宕机或客户资金损失,就会造成全国范围内业务无法办理,将产生巨大的影响。所以说,对于一个大型应用处理软件系统,测试贯彻于其中,是一项非常重要的工作,是项目研发中一个相当重要的步骤。而测试质量的好坏直接关系到整个系统能否按期正常投产,关系到系统投产后业务处理是否正确,关系到整个系统运行的可靠性、稳定性。
管理大师彼得•德鲁克说:“组织管理的目的就是为了使人们能为实现目标而有效地工作,为此必须设计和维持一种职务结构”。因此,要做好软件测试工作,在软件公司内部必须建立一个专门负责软件产品测试的组织,并配备负责软件公司全面测试工作的测试管理人员和配备一定数量的具有测试理论、掌握软件测试技术的专业测试人员。可以根据软件公司规模的大小设置软件测试组织的组织架构、隶属关系和确定软件测试人员的数量。
近年来,以软件测试为中心的软件质量保障技术在软件生产实践中得到了迅速发展,软件测试已经成为软件生产中必不可少的质量保障手段。
参考文献:
[1]郑人杰,殷人昆,陶永雷.实用软件工程[M].北京:清华大学出版社.
[2]何国伟.软件可靠性[M].北京:国防工业出版社,1998.
[3]朱鸿,金凌紫.软件质量保证与测试[M].北京:科学出版社,1997.
[4]Stevens W R著,施振川译.UNIX网络编程[M].北京:清华大学出版社,2001.
转载注明来源:https://www.xzbu.com/2/view-466209.htm