软件工程导论—软件测试(下)

简介: 软件工程导论—软件测试

正文


5. 白盒测试技术


5.1. 白盒测试技术概述


白盒测试应包含完整的测试方案,所谓测试方案包括具体的测试目的(例如,预定要测试的具体功能),应该输入的测试数据和预期的结果。通常又把测试数据和预期的输出结果称为测试用例。

18.png


5.2. 逻辑覆盖


有选择地执行程序中某些最有代表性的通路是对穷尽测试的惟一可行的替代办法。从覆盖源程序语句的详尽程度分析,大致有以下一些不同的覆盖标准:


语句覆盖

选择足够多的测试数据,使被测程序中每个语句至少执行一次。语句覆盖对程序的逻辑覆盖很少。语句覆盖只关心判定表达式的值,而没有分别测试判定表达式中每个条件取不同值时的情况。语句覆盖是很弱的逻辑覆盖标准。

判定覆盖

不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次。

条件覆盖

不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果。条件覆盖通常比判定覆盖强,因为它使每个条件都取到了两个不同的结果,判定覆盖却只关心整个判定表达式的值。但也有反例,总之,判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖。

判定/条件覆盖

使得判定表达式中的每个条件都取到各种可能的值,每个判定表达式也都取到各种可能的结果。

条件组合覆盖

要求选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次。条件组合覆盖是前述几种覆盖标准中最强的。满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。但是,条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行到,是从对程序路径的覆盖程度分析的逻辑覆盖标准。

点覆盖

选取足够多的测试数据,使得程序执行路径至少经过流图的每个结点一次。由于流图的每个结点与一条或多条语句相对应,因此点覆盖标准和语句覆盖标准是相同的。

边覆盖

选取足够多测试数据,使得程序执行路径至少经过流图中每条边一次。通常边覆盖和判定覆盖是一致的。

路径覆盖

选取足够多测试数据,使程序的每条可能路径都至少执行一次(如果程序图中有环,则要求每个环至少经过一次。

19.png


5.3. 控制结构测试


控制结果测试分为基本路径测试和循环测试,具体如下


基本路径测试

基本路径测试是Tom McCabe提出的一种白盒测试技术。首先计算程序的环形复杂度,以该复杂度为指南定义执行路径的基本集合,从该基本集合导出的测试用例可保证程序中的每条语句至少执行一次,而且每个条件在执行时都将分别取真、假两种值。

循环测试

循环测试是一种白盒测试技术,它专注于测试循环结构的有效性。在结构化的程序中通常只有3种循环,即简单循环、串接循环和嵌套循环。

(1)简单循环

应该使用下列测试集来测试简单循环,其中n是允许通过循环的最大次数:

跳过循环、只通过循环一次、通过循环两次、通过循环m次,其中m<n-1、通过循环n-1,n,n+1次。

(2)嵌套循环

从最内层循环开始测试,其他循环都设置为最小值。对最内层循环使用简单循环测试方法,而使外层循环的迭代参数取最小值,并为越界值或非法值增加一些额外的测试。由内向外,对下一个循环进行测试,但保持所有其他外层循环为最小值,其他嵌套循环为“典型”值。然后继续进行下去,直到测试完所有循环。

(3)串接循环

如果串接循环的各个循环都彼此独立,则可以使用测试简单循环的方法来测试串接循环。如果两个循环串接,而且第一个循环的循环计数器值是第二个循环的初始值,则这两个循环并不是独立的。当循环不独立时,建议使用测试嵌套循环的方法来测试串接循环。

20.png


6. 黑盒测试技术


6.1. 黑盒测试概述


黑盒测试着重测试软件功能,主要的错误类型为: 功能不正确或遗漏了功能、界面错误、数据结构错误或外部数据库访问错误、性能错误、初始化和终止错误

黑盒测试的公认标准主要有两个:(1)测试用例尽可能少;(2)一个测试用例能指出一类错误


6.2. 等价划分


使用等价划分法设计测试方案首先需要划分输入数据的等价类,等价划分是一种黑盒测试技术,把程序的输入域划分成若干个数据类,据此导出测试用例。设计测试方案时尽量设计出能发现若干类错误的测试用例,从而减少测试用例的数目,每类中的一个典型值在测试中的作用要与这一类中所有其他值的作用相同。此外常常还需要分析输出数据的等价类,以便根据输出数据的等价类导出对应的输入数据等价类。


等价类划分的启发式规则:


如果规定了输入值的范围,则可划分出一个有效的等价类(输入值在此范围内),两个无效的等价类(输入值小于最小值或大于最大值);

如果规定了输入数据的个数,则类似地也可划分出一个有效的等价类和两个无效的等价类;

如果规定了输入数据的一组值,而且程序对不同输入值做不同处理,则每个允许的输入值是一个有效的等价类,此外还有一个无效的等价类(任一个不允许的输入值);

如果规定了输入数据必须遵循的规则,则可以划分出一个有效的等价类(符合规则)和若干个无效的等价类(从各种不同角度违反规则);

如果规定了输入数据为整型,则可以划分出正整数、零和负整数等3个有效类;

如果程序的处理对象是表格,则应该使用空表,以及含一项或多项的表。

使用等价划分法设计黑盒测试的方案时可以按照如下两个步骤进行:


设计一个新的测试方案以尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步骤直到所有有效等价类都被覆盖为止;

设计一个新的测试方案,使它覆盖一个而且只覆盖一个尚未被覆盖的无效等价类,重复这一步骤直到所有无效等价类都被覆盖为止。


6.3. 边界值分析


经验表明,处理边界情况时程序最容易发生错误。例如,许多程序错误出现在下标、纯量、数据结构和循环等等的边界附近。使用边界值分析方法设计测试方案首先应该确定边界情况。选取的测试数据应该刚好等于、刚刚小于和刚刚大于边界值。


通常设计黑盒测试方案时总是联合使用等价划分和边界值分析两种技术。


6.4. 错误推测


不同类型不同特点的程序通常又有一些特殊的容易出错的情况。因此必须依靠测试人员的经验和直觉,从各种可能的测试方案中选出一些最可能引起程序出错的方案。它的基本想法是列举出程序中可能有的错误和容易发生错误的特殊情况,并且根据它们选择测试方案。


7. 调试


7.1. 调试概述


调试是在测试发现错误之后排除错误的过程,软件错误的外部表现和它的内在原因之间可能并没有明显的联系,调试就是把症状和原因联系起来的尚未被人深入认识的智力过程。

7.2. 调试过程和途径


调试发生在测试之后,调试过程从执行一个测试用例开始,评估测试结果,如果发现实际结果与预期结果不一致,则这种不一致就是一个症状,它表明在软件中存在着隐藏的问题。

调试过程试图找出产生症状的原因,以便改正错误。

21.png

调试可以通过下列途径进行:


蛮干法

蛮干法可能是寻找软件错误原因的最低效的方法。其他方法都失败时才使用这种方法,这种方法印出内存的内容,激活对运行过程的跟踪,在程序中到处都写上WRITE(输出)语句。更多情况下这种方法只会浪费时间和精力。必须首先进行周密的思考,有明确的目的,尽量减少无关信息的数量。

回溯法

回溯是一种相当常用的调试方法,当调试小程序时这种方法是有效的。具体做法是,从发现症状的地方开始,人工沿程序的控制流往回追踪分析源程序代码,直到找出错误原因为止。但是随着程序规模扩大,应该回溯的路径数目也变得越来越大,以至彻底回溯大程序变成完全不可能了。

原因排除法

(1)对分查找法

如果已经知道每个变量在程序内若干个关键点的正确值,则可以用赋值语句或输入语句在程序中点附近“注入”这些变量的正确值,然后运行程序并检查所得到的输出,如果输出结果是正确的,则错误原因在程序前半部分;反之,错误原因在程序后半部分,对错误原因所在的那部分重复使用这个方法,直到把出错范围缩小到容易诊断的程度为止。

(2)归纳法

归纳法是从个别现象推断出一般性结论的思维方法。首先把和错误有关的数据组织起来进行分析,以便发现可能的错误原因,然后导出对错误原因的一个或多个假设,并利用已有的数据来证明或排除这些假设。

(3)演绎法

演绎法从一般原理或前提出发,经过排除和精化的过程推导出结论。首先设想出所有可能的出错原因,然后试图用测试来排除每一个假设的原因。


8. 软件可靠性


8.1. 软件可靠性相关的几个概念


软件可靠性:程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。


软件的可用性:程序在给定的时间点,按照规格说明书的规定,成功地运行的概率。


稳态可用性(Ass):如果在一段时间内,软件系统故障停机时间分别为t d o w n 1  ,t d o w n 2,…,正常运行时间分别为t u p 1,t u p 2 ,…,则系统的稳态可用性为:

22.png

其中

23.png

平均维修时间(MTTR):是修复一个故障平均需要用的时间,它取决于维护人员的技术水平和对系统的熟悉程度,也和系统的可维护性有重要关系。


平均无故障时间(MTTF):是系统按规格说明书规定成功地运行的平均时间,它主要取决于系统中潜伏的错误的数目,因此和测试的关系十分密切。稳态可用性也可以表示为:

24.png


8.2. 估算平均无故障时间的方法


1、相关量的符号

E T——测试之前程序中错误总数;

I T ——程序长度(机器指令总数);

τ ——测试(包括调试)时间;

E d ( τ ) ——在0 至τ 期间发现的错误数;

E c ( τ ) ——在0至τ 期间改正的错误数。


在类似的程序中,单位长度里的错误数25.png近似为常数,通常26.png

效率正比于软件中剩余的错误数,而平均无故障时间MTTF与剩余的错误数成反比。

假设发现的每一个错误都立即正确地改正了,则27.png剩余的错误数为28.png单位长度程序中剩余的错误数为29.png

3、估算平均无故障时间

经验表明,平均无故障时间与单位长度程序中剩余的错误数成反比,即

30.png

其中K为常数,典型值是200。

估算平均无故障时间的公式,可以评价软件测试的进展情况,其公式为

31.png


因此,也可以根据对软件平均无故障时间的要求,估计需要改正多少个错误之后,测试工作才能结束。


4、估计错误总数的方法

程序中的错误总数E T ETET与程序规模、类型、开发环境、开发方法论、开发人员的技术水平和管理水平等都有密切关系。


估计ET的两个方法:

植入错误法

在测试之前由专人在程序中随机地植入一些错误。测试之后,根据测试小组发现的错误中原有的和植入的两种错误的比例,来估计程序中原有错误的总数E T 。

假设人为地植入的错误数为N s ,经过一段时间的测试之后发现n s 个植入的错误,此外还发现了n 个原有的错误。如果可以认为测试方案发现植入错误和发现原有错误的能力相同,则能够估计出程序中原有错误的总数为:N = n / n s × N s


32.png

分别测试法

植入错误法的基本假定是所用的测试方案发现植入错误和发现原有错误的概率相同,这个基本假定可能有时和事实不完全一致。如果有办法随机地把程序中一部分原有的错误加上标记,然后根据测试过程中发现的有标记错误和无标记错误的比例,估计程序中的错误总数,那就可以做分别测试。

分别测试法使用两个测试员(小组),彼此独立地测试同一个程序的两个副本,把其中一个测试员发现的错误作为有标记的错误。

τ表示测试时间,设:

τ = 0 时错误总数为B 0

τ = τ 1 时测试员甲发现的错误数为B 1  ,测试员乙发现的错误数为B 2  ,两个测试员发现的相同错误数为bc;

如果认为测试员甲发现的错误是有标记的,即程序中有标记的错误总数为B 1 ,则测试员乙发现的B 2

个错误中有b c bcbc个是有标记的。假定测试员乙发现有标记错误和发现无标记错误的概率相同,则错误总数为34.png


33.png

相关文章
|
2月前
|
安全 测试技术 持续交付
【软件工程】实用测试手册:软件工程中各种测试类型一览
【软件工程】实用测试手册:软件工程中各种测试类型一览
54 0
|
4月前
|
安全 测试技术 持续交付
软件工程之测试阶段
软件工程之测试阶段
71 0
|
7月前
|
存储 数据管理 人机交互
【软件工程】测试六
【软件工程】测试六
105 0
|
2月前
|
Java 测试技术 持续交付
【软件工程】单元测试:构建坚固软件基石的不可或缺一环
【软件工程】单元测试:构建坚固软件基石的不可或缺一环
21 0
|
4月前
|
安全 测试技术 持续交付
软件工程之测试
软件工程之测试
54 0
|
7月前
|
监控 项目管理 调度
【软件工程】测试十
【软件工程】测试十
37 0
|
7月前
|
敏捷开发 安全 程序员
【软件工程】测试七
【软件工程】测试七
51 0
|
7月前
【软件工程】测试九
【软件工程】测试九
45 0
|
7月前
|
监控 测试技术
【软件工程】测试五
【软件工程】测试五
84 0
|
7月前
|
算法 程序员 测试技术
【软件工程】测试四
【软件工程】测试四
145 0

热门文章

最新文章