软件测试的关键技术

2010-08-03  付民 

随着软件复杂度的不断增加、客户要求的不断提高,如何保证软件质量、提高软件可靠性越来越受到各研究机构、相关企业的普遍关注,同时也成为软件开发机构特别关注的方向。
目前,许多能有效提高软件质量的质量保证技术相继问世,例如,几乎所有的大型软件开发机构都结合自身软件开发实际和经验制定了相关的质量标准来规范企业内部的软件开发过程,
陆续成立了与软件开发相独立的软件测试中心,在开发过程中增加了许多环节(如软件配置管理、阶段性测试和评审),用来保证开发出来的软件具有高可靠性,满足客户要求,成为真正可用的软件。
    软件测试技术作为保障软件质量最直接、最有效的手段之一,也就成为了重要的研究热点。但是由于软件本身的复杂性和不确定性,软件测试技术始终具有极大的难度。深人研究软件测试技术和方法,从而提高软件可靠性,已成为国内外重要的研究方向。
目前,国内相关研究机构和院校都加大软件测试方面的研究力度,把软件测试作为研究的重要内容和主要方向,软件开发机构和相关企业也把软件测试技术作为投人的焦点之一。
1  软件测试的概念
    软件测试实质上就是发现软件中存在的bug,并不断修复bug的过程。如何才能尽可能多地发现软件缺陷,这是软件测试需要完成的工作。测试方法包括静态分析和动态测试。
静态分析主要通过静态分析工具来检查软件中存在的缺陷,如俗称”检查”(checkout)的方法、CMM中二级成熟度级别中给出的关键过程域一一同行评审;
而动态测试则是由测试人员根据软件需求选取合适的、有限的测试用例,通过让被测软件运行这些测试用例,检查软件能否按预定的要求运行,如果不能,则根据运行结果确定软件中存在的缺陷。

1.1特性
    根据上述定义,软件测试的关键特性是:
    (1)动态性测试是在给出输人值的基础上进行的动态过程。
    (2)有限性测试执行的次数必须是有限的,而且测试过程还必须具有可管理性,也就是说测试意味着要在有限的资源与潜在的、无限的测试需求之间进行平衡,
这一对矛盾就是测试技术要解决的两个根本问题:要制定相应的测试充分性判定准则,并制定相应的测试过程管理规范用以考查测试的效果。
    (3)选择性
    测试技术的关键问题就是如何选择有限的测试用例。选择不同的测试用例集合会产生截然不同的测试结果,在给定条件下,确定最合适的测试用例选择准则是目前软件测试技术研究的热点之一,也是能从根本上提高测试效果的有效手段。
    (4)预测性
    测试技术应能判定程序执行后的结果是否可接受,否则,测试结果无效。现在,常用名词预示程序( oracle program)给出程序运行的可能结果。
当然,如何给出预示程序也是测试技术的难点之一,如果要检验运行结果与客户需求是否一致,需要进行有效性测试;如果要检验运行结果是否与给定的规范是否一致,则需要进行验证测试。
1.2目标
    可以在软件开发过程中的不同阶段实施软件测试,这就意味着,测试的目标根据测试阶段的不同而不同:整个程序、部分程序(相关)或者就是一个模块。这里面涉及到一个概念,就是测试层次。
    测试具有非常明确的测试目的,可能是显式或隐式给出,其中其准确性可能根据不同的软件会有一些差别。在实际进行软件测试时,能准确、定量地给出测试目的是控制软件整个开发过程的关键环节。
在已有的软件测试技术中,其本质就是试图”攻击”被测程序,使之崩溃或者暴露缺陷,从而提高软件可靠性,使用测试技术可用来进行可靠性度量、可用性评估、承包商验证,根据不同的测试目标选用不同的测试技术。
    有时,测试目标和测试技术之间也会有矛盾,比如,分支覆盖是通用的软件测试技术,但是其真正的含义是尽可能地、系统地测试所有判定点上的每一个程序分支,而不仅仅只是考虑到程序本身所给出的测试目标。类似这样的问题在实施软件测试时常常会发生。
2.1软件故障和缺陷
    目前,有许多描述软件故障的术语,比如:缺陷( defect)、失效(failure )、错误(error )、故障( fault)等等,这些术语之间有着细微的差别,但是又难以说清,总之,有的软件故障隐藏在代码中,
如果按照正常的运行顺序、给出合乎常规的输人数据就不会轻易暴露出异常,但是无论这些术语之间存在着怎样的差别,可以将所有的软件故障都称之为软件缺陷,因此,软件测试的目标就是用有效的技术和方法发现软件中存在的软件缺陷。
    根据软件开发过程,可以将如下几种情况定义为软件缺陷:
    .软件没有完成需求规格说明书给出的功能需求。
    .由于理解上的偏差,软件设计没有严格遵循。
    .由于编码实现与软件设计之间的接口出现了问题,使得软件出现了不应有的错误,有时甚至无法运行。
    .软件功能超出了产品说明书预先指明的范围。
    .软件没有达到产品说明书虽未指出但应该达到的目标。
    .软件测试人员在实施静态分析时,发现编码实现冗余,导致运行速度缓慢。
    .客户认为软件有缺陷,不能满足其要求。
    任何软件都存在着软件缺陷,通过完全测试发现所有的软件缺陷是不现实的,要尽量减少软件中的软件缺陷,有两项重要的措施:
    .使用软件时,对于如何改进软件每个人都会有不同的建议和要求,应该在开发软件时由软件开发机构和客户一起指定合理、客观的验证规则,满足客户需求。
    .软件在开发过程必定会不断地进行修改,这些修改要反映到软件文档中去,经过大量的实践发现,造成软件缺陷的一部分原因是没有按照要求即使修改文档,由于需求的变更造成设计、编码上的修改要及时以文档的形式给出。
    当然,在实际的软件开发过程中,还需要其他一些有效的措施来减少软件缺陷的产生。比如,在进行软件测试之前,根据被测软件的特点组织相关专家进行分析,明确何种类型的软件故障会出现在被测软件中,就可以有的放矢地地实施软件测试。

2.2测试用例的选取准则和预示程序
    测试用例的选取准则可以用一个三元组(P,S,T)来刻划,其中P是程序;S是规范(specification),即与测试相关的所有信息源;T是测试用例。
    预示程序可以衡量测试是成功还是失败。现在有多种预示程序。根据被测软件的实际而自动生成预示程序是当前的研究热点。
2.3测试方法
    根据软件开发的过程,可以将测试阶段分成单元测试、部件测试、集成测试、系统测试、验证测试、安装测试、Alpha和Beta测试。测试类型可以分成:
    (1)一致性测试
     验证被测系统的测试行为与规范是否一致。
    (2)选取测试
     依据运行剖面随机地选取测试,可以明确故障,修正故障,使程序的可靠性更高。
    (3)回归测试
     回归测试是对系统或部件进行的测试,以验证修改后的程序不会产生意想不到的结果。回归测试可在测试的任何层次进行,目前回归测试的成本和工作量很大,有一种切片技术(宝库静态切片技术和动态切片技术),
其思想是查找并修改与修改过的程序代码部分相关的代码来减少测试的工作量,保证回归测试的顺利进行。
    (4)批量测试(volume testing)
    批量测试可用于内部程序或系统资源紧张时对系统行为实施评估。现在实用的批量测试方法有:
    加压测试(stress testing),用一些极端的方法使系统资源紧张(如内存不足、CPU运行速度变慢),从而暴露软件缺陷,国外还有一些工具专门用来实施这种测试。
    恢复性测试(recovery testing)可以验证系统在崩溃后的自恢复能力。
    配置测试(configuration testing)可以针对不同的用户在不同的特定配置条件下进行系统分析。
    可用性测试可以检验最终用户使用程序的方便性。
    背靠背测试(back一to一back)的基本思想就是用同样的测试用例对同一系统运行两次,从而进行相互比较,找出其中的差异。
2.4测试技术
    (1)基于规范的测试技术
    在该类测试中,除了早已熟悉的边界值分析、等价类划分等方法外,还有决策表、有限自动机、形式化规范等方法。决策表用来表示条件(输人)和行为(输出)之间的逻辑关系,从条件和行为的所有可能组合中系统地选取测试用例,可用因果图来表示这样的关系。
用有限自动机的理论对有限自动机进行建模,在此基础上,用不同的技术,选取测试用来覆盖其中的状态及其转换,这些技术适用于事务处理系统。以形式化语言给出规范(比如,准确地定义语法和语义),从而使得能够自动地由规范生成测试用例,
同时提供输出,可以称为预示输出以检验测试结果,在模型和代数基础上生成测试用例的方法大不相同。
    (2)基于代码的测试技术
    基于代码的测试技术主要有基于代码的参考模型、基于控制流的标准和基于数据流的标准。示程序的控制结构,其中的结点和边对应程序中的元素,例如,结点表示语句或语句的顺序流,边表示结点之间的控制转换。
    基于控制流的标准旨在覆盖所有程序中的所有语句和语句块,目前已有多种准则(如决策/条件覆盖准则),但是想要覆盖所有控制路径是不可能的。
    基于数据流的测试标准是用控制流程图作为注释来解释如何定义和使用程序变量,不同的准则提供了不同的方法,也就是如何沿着流程图的不同流向看出同一个变量的值,可以用一个三元组(d,u,V)来表示,其中V是变量,d是定义V的结点,u是使用V的结点,这样,在d,u和V就可以看出它们之间的明确关系。
    (3)基于故障的测试技术
    由于形式化程度不同,基于故障的测试技术对测试用例进行规范化的设计,目的在于给出预定义的故障或可能有的故障类。这类测试技术主要有错误猜测、故障植人、变化测试三种,其中错误猜测是由测试人员根据给定的程序,
依据自身经验和以前类似项目的记载大致猜测最有可能的故障;故障植人是目前非常通用的测试方法,通过人工地将故障植人程序并对其后的结果进行监控,找出程序暴露出的缺陷,这种方法可以用来测量测试有效性;变化程序是指对程序稍微进行修改,
与以前的原始版本不同,做了一些语法上的修改。让所有的测试用例都在原始版本和修改后的版本上运行(有效地使用该技术就必须使得能自动地生成变化体)。如果测试用例能够分清程序与变化程序之间的差别,就把后者删去。
变化测试的基本理论是配对效应,这样就可以找出程序的语法故障,有的甚至是很复杂的故障。当然,在具体应用时,变化可以幅度大也可以小。
    (4)基于使用的测试技术
    可以使用模拟仿真技术来重新生成产品实际操作的环境,将输人生成剖面图,根据剖面图生成实际操作的场景。目前有软件可靠性工程测试技术。
3结束语
    软件测试正在受到软件界和企业界越来越多的关注和重视。本文是在对软件测试的技术和方法进行了大量的相关研究基础上,概述了软件测试的基本观点和实施方法,这个工作还在进一步的研究中,会随着研究经验的积累而不断深人。


673°/6682 人阅读/5 条评论 发表评论

易水寒  2010-08-03

可能你写的很好,但太长了,我没有看完


王海凤  2010-08-03

呵呵是够长的啊!复制回去看啊


孙维屹  2010-08-03

先去泡茶慢慢看


付民  2010-08-04

孙维屹: 先去泡茶慢慢看


方炯  2010-08-05

我一杯茶喝完了,还没看完!!!再来一杯慢慢看!!!


登录 后发表评论