当前位置:首页 > 黑盒测试案例设计技术篇
则故障在程序的后半部分,反之故障在程序的前半部分。对程序中有故障的那部分,再重复使用这种方法,直到把故障范围缩小到容易诊断的程度为止。
4.归纳法
所谓归纳就是从个别推断一般的方法,这种方法从线索(错误征兆)出发,通过分析这些线索之间的关系而找出故障,这种方法主要有下述步骤:
(1) 收集有关数据
列出已经知道的关于程序哪些事做得对,哪些事做得不对的一切数据。 (2) 组织数据
因为归纳是从特殊推出一般的,所以必须整理数据,发现规律,揭示矛盾。 (3) 提出假设
分析研究线索之间的关系,力求找出它们的规律,从而提出关于故障的一个或多个假设。如 果无法作出推测,则应设计更多的测试方案,以便获得更多的数据;如果可以作出多种假设 ,则应选择可能性最大的一个。
(4) 证明假设
用假设来解释所有原始的测试结果,如果能圆满地解释一切现象,则假设得到证实,否则要么是假设不成立或不完备,要么是同时存在多个故障。
5.绎法
演绎法从一般原理或前提出发,经过删除和精化的过程推导出结论。演绎法的主要步骤为:
(1) 设想可能的原因
根据已有的数据,设想可能产生错误的所有原因。 (2) 用已有的数据排除不正确的假设
分析已有的数据,着重寻找矛盾,努力排除前一步列出的原因。如果所有假设都被排除了,则需要补充数据,以便提出新的假设。如果余下的假设有多个,则选取可能性最大的那个。
(3) 证明余下的假设
具体作法同归纳法的(4)相同。
7.5测试工具
在软件开发中,测试所占的工作量在40%左右,因此能够减少测试时间,同时又不降低测试彻底程度的测试工具是很有价值的。由于认识到了这一点,研究人员和工程技术人员设计出很多的自动化测试工具,简要介绍如下。 1.静态分析程序
静态分析程序它不执行被测试的程序,而仅仅是对被测试程序的正文进行扫描,从而证明程序结构及格式说明,并寻找可能导致错误的异常情况。 2.动态分析程序
动态分析程序执行被测试的程序,观察程序中每条语句的执行过程,寻找可能导致错误的异常情况。动态分析程序一般由两部分组成:
(1) 检测部分。它往被测程序中插入检测语句,当程序执行时,这些检测语句收集和整理关于每条语句执行次数的信息。
(2) 显示部分。它汇集检测语句提供的信息,并以某种容易理解的形式输出这些信息。3.测试数据生成程序
测试数据生成程序可以用来帮助用户选择测试数据,以使某个程序按某种方式运行。这种程序是通过一个存放程序各种“素材”的共同信息库,使测试人员能用命令方便地定义测
试用例,并在适当的时候自动运行这些测试用例。特别是当被测程序修改后,系统能自动修改测试用例,以保持这些测试用例的可用性。它对数据库管理系统是十分有效的。 4. 输出比较程序
输出比较程序是把某程序的一组输出数据和原先的另一组输出数据(正确数据)进行比较,以确定它们不一致的地方。具体做法是:
(1) 建立一个文件存放原始的正确结果;
(2) 执行测试,把输出数据存入另一个文件中;
(3) 使用输出比较程序比较上述两个文件,输出两者之间的差异。 5. 断言处理程序
断言处理程序是由一些前置处理和后继处理组成的系统,它是用于程序正确性证明的工具。首先输入源程序及程序断言,其次是运行被测程序,最后输出程序是否满足断言的要求。这种系统可以自动产生程序的中间归纳断言,也可在人机交互的过程中插入断言。 6. 源代码审查程序
是一些专用审查程序,用来检查软件的质量,以证实该软件符合最低限度的编程规范。 7. 测试文件产生程序
为被测试文件的程序产生典型的输入文件,并且把预先确定好的数据填入该输入文件。 8. 测试协助程序
这一类工具使测试工作能方便地进行,具体是: (1) 把被测程序放到测试环境中; (2) 向被测程序送入数据;
(3) 用存根模块模拟下属模块的作用。
目前,能完成自动测试工作的软件有很多种,下面我们介绍三种有代表性的测试系统。 1.DAVE自动测试系统
它是一种采用数据流和程序图形技术的自动化测试系统。该系统可以精确地识别程序的许多类型错误和数据流的异常情况。这个系统是为测试FORTRAN程序而设计的,运用了复杂的先纵深后横宽的查找算法来跟踪某个具体变量的变化过程,如图7-14所示。
图7-4DAVE
2.DISSECT自动化测试系统
它用符号方式评价一个系统,从控制流程导出符号谓词。软件可以分解为多个控制路径集合,这些集合叫做谓词系统,可用来检验程序中的运算是否有效。另外,谓词系统还可用来产生测试数据。
3程序更换技术自动测试系统
它是确定测试数据是否恰当的一种自动化技术,其方法描述如下: (1) 为程序P制定测试数据T;
(2) 由程序P执行T,如果有错误出现,则测试是成功的;
(3) 如果T没有找到P的错误,则将程序P的源代码作微小修改,然后重新运行T; (4) 如果改变后的P′程序在运行相同测试数据T时,得到的结果和P运行T时相同,那么T就不可能找到故意放入到程序P中的错误,T的灵敏性就不够。
上述步骤是自动进行的,可生成一组报告和其他信息,它们有助于判断给出的测试数据是否恰当。此外,由变换获得的信息,可以作为测试数据的设计工具。
软件自动测试工具是软件工程开发环境的一个方面,也是目前的一个重要研究领域。我们可望它能迅速发展,广泛使用。
7.6软件的可靠性
软件可靠性是软件质量中最重要的一个度量标准。测试的根本目标是消除故障,保证软件的可靠性。那么,什么是软件的可靠性,软件需要进行多少次测试才能达到所要求的可靠程度呢?本节我们着重讨论这些问题。 7.6.1基本概念
1.件可靠性
关于软件可靠性有许多不同的定义,目前大多数人认可的定义是:在给定的时间间隔内,程序按照规格说明书的规定成功地运行的概率。显然,随着运行时间的增加,运行时遇到程序故障的概率也随之增加。与此相反,软件可靠性随着给定时间间隔的加大而减少。
2.件的可用性
所谓软件的可用性是指在给定的时间点,程序按照规格说明书的规定成功地运行的概率。 可靠性与可用性之间的差别是,可靠性强调系统在0~t这段时间间隔内有效,而可用性强调 系统在时刻t这一点有效。
3.统的稳态可用性
如果在一段时间内,软件系统故障停机时间分别为td1,td2,?,正常运行时间分别为tu1,tu2,?,则系统的稳态可用性为:
Ass=Tup/(Tup+Tdown)
其中Tup=Σtui,Tdown=Σtdi。
如果系统的平均无故障时间为MTTF(系统按照规格说明书规定成功地运行的平均时间), 平均维修时间为MTTR(修改一个故障平均需要用的时间),则上式可改写为:
Ass=MTTF/(MTTF+MTTR)
7.6.2平均无故障时间的估算
软件的平均无故障时间MTTF是一个重要的质量指标,往往作为对软件的一项要求,由用户提出来。为了估算MTTF,我们要进行如下工作。
1.符号约定
ET——测试之前程序中故障总数;
IT——程序长度(机器指令总数); τ——测试(含调试)时间;
Ed(τ)——在0~τ期间发现的错误数; Ec(τ)——在0~τ期间改正的错误数; 2.基本假定
(1) 在类似的程序中,单位长度里的故障数ET/IT近似为常数,通常有:
0.5×10-2≤ET/IT≤2×10-2
即1000条指令中大约有5~20个故障。
(2) 失效率正比于软件中剩余的故障数,而平均无故障时间MTTF与剩余的故障数成反比。
(3) 发现的每一个错误都能立即正确地改正。则有:
Ec(τ)=Ed(τ) 剩余的故障数为
ET(τ)=ET-Ec(τ)
单位长度程序中剩余的故障数为
εT(τ)=ET/IT-Ec(τ)/IT 3.估算平均无故障时间
因为平均无故障时间与单位长度程序中剩余的故障数成反比,则有
MTTF=1/K(ET/IT-Ec(τ)/IT)
其中K为经验常数,取值为200。
估算平均无故障时间的公式,也可用于评价软件测试的进展情况
Ec=ET-IT/K·MTTF
因此,也可以根据对软件平均无故障时间的要求,估计需要改正多少个错误之后,测试工作 才能结束。
4.估计故障总数的方法 程序中含有的故障数目,直接关系到软件的可靠程度,也影响着平均无故障时间的计算。由于程序中的故障总数ET与程序规模、类型、开发环境、开发方法、开发人员的技术水平和管理经验等有着密切关系,ET的估计方法有两种,现介绍如下。
(1) 植入故障法
在进行测试之前,由专人在程序中随机地植入一些故障,测试之后,依据测试人员发现的原有故障和植入故障的比例,估计程序中的原有故障总数ET。
设植入的故障数为Ns,测试后发现的植入故障数为ns,发现原有故障数为n,则故障总 数为
ET=n/ns*Ns
(2) 分别测试法
植入故障法是以测试方案发现植入故障和原有故障的概率相同为假设的,这个假设可能与事实不完全一致。
分别测试法是随机地把程序中一部分原有故障加上标记,根据在测试中发现有标记故障和无标记故障的比例,估算程序中原有的故障总数ET。具体做法是,由测试人员甲和乙同时对一个程序的两个副本分别进行测试,再由另一名分析员分析他们的测试结果。用τ表示测试时间,设
τ=0时的故障总数为B;
τ=τ1时测试人员甲发现的故障由数B1(有标记的); τ=τ1时测试人员乙发现的故障数为B2;
τ=τ1时两个测试人员发现相同故障数为bc(有标记的)。
在假定测试员乙发现有标记故障和发现无标记故障概率相同的情况下,则有
B0=B2/bc*B1
其中B0近似等于ET。 7.6.3程序正确性证明
程序正确性证明是验证程序正确性的一条途径,是即程序测试技术之后的又一种保证软件可靠性的重要手段。程序正确性证明技术的出现,使测试的工作量大大减少。但由于程序测试和程序正确性证明二者均有各自的长处及劣势,所以在目前的软件质量检查中,实行二种方法并用,缺一不可的原则。
证明程序正确性的一般方法是归纳断言法,它的基本思想是对所验证的程序建立一组定理,定理得到证明就保证了程序中无错。这种方法要求人们首先对程序的输入条件和正确结果写出断言,断言均以形式逻辑系统的符号表示,通常是一阶谓词演算公式。然后对程序中的每个循环写一个断言,描述在循环中的不变量条件。于是程序就被划分成固定数目和一定长度的路径。对于每一路径,任取一端的断言沿路径移动,同时插入程序语句的语义来修改断言,直至抵达该路径的另一端点。这时,在这一端点就存在两个断言——原始断言和从相应端点推导出的断言,进而写出一个定理——从原始断言推导出的断言,最后去证明这个定理。如果定理能被证明,那么只要程序终止,就证明程序无错。其他的程序证明技术有谓词变换法,部分目标归纳,计算归纳,结构归纳和间断归纳等。
程序正确性证明给出一个令人鼓舞的思想,但尚没有达到实用阶段,目前还仅仅是在小程序上得以使用。例如,已研究出证明Pascal和LISP程序正确性的程序系统。要证明大型软件的正确性,必须研究开发能证明程序正确性的自动系统。应该指出,程序正确性证明的方法,对于软件技术而言,不仅在于它可作为证明程序正确性的技术,更重要的在于它提供了设计和编制一般程序的思路,使程序设计人员在调试之前避免了一些可能发生的错误。例如,程序正确性证明中的“最弱前置条件”、“循环不变式”等概念已直接为程序的设计与编写提供了重要的思想方法。
共分享92篇相关文档