Alex_McAvoy

想要成为渔夫的猎手

软件测试方法

【概述】

黑盒测试与白盒测试,是动态测试中两种非常流行的测试技术

不论是黑盒测试还是白盒测试,它们都可以发现被测系统的问题,但是由于它们侧重的角度不同,所以发现的问题也不尽相同

一般在软件测试的过程中,既要用到黑盒测试,又要用到白盒测试。大的功能模块采用黑盒测试,小的构件采用白盒测试

可以说,黑盒测试和白盒测试都是基于用例的测试方法,因为它们都通过运行测试用例来发现问题。

白盒测试和黑盒测试是两类软件测试方法,传统的软件测试活动基 本上都可以划分到这两类测试方法中,下表给出了两种方法的一个基本比较

白盒测试 黑盒测试
考察程序逻辑结构 不涉及程序结构
用程序结构信息生成测试用例 用软件规格说明书生成测试用例
主要适用于单元测试和集成测试 可适用于从单元测试到系统验收测试
对所有逻辑路径进行测试 某些代码段得不到测试

【黑盒测试】

概述

黑盒测试着重于测试软件功能,其能发现的错误类型有:

  • 功能不正确或遗漏
  • 输入能否正确的接受
  • 能否输出正确的结果
  • 性能错误数据
  • 结构或外部数据库访问错误
  • 初始化或终止错误

常见黑盒测试技术有:等价类划分、边界值分析、错误推测、因果图等

黑盒测试的每种测试方法都有各自的优缺点,需要测试人员根据实际项目特点和需要选择合适的方法设计测试用例,以下是选择方法的几条经验:

  • 在任何情况下都必须选择边界值分析方法,用该方法设计出的测试用例发现程序错误的能力最强
  • 必要时用等价类划分法补充一些测试用例
  • 用错误推测法再追加一些测试用例
  • 如果程序的功能说明中含有输入条件的组合情况,则可选用因果图法和决策表法

等价类划分

等价类分为有效等价类和无效等价类。有效等价类是指对程序的规格说明是有意义的、合理的输入数据所构成的集合;无效等价类是指对程序的规格说明是无意义的、不合理的输入数据构成的集合

在划分等价类时,有可遵循以下原则:

1)按双边区间划分

如果输入条件规定了取值范围或个数,则可确定一个有效等价类和两个无效等价类。

例如:输入值是选课人数,在 0 到 100 之间,那么可根据范围来划分出以下三个等价类

2)按单边区间划分

如果输入条件规定了输入值的集合,则可确定一个有效等价类和一个无效等价类

例如:输入值必须是日期类型的数据,那么可根据输入条件来划分出以下两个等价类

3)按取值划分

如果输入条件是一组值,且程序对不同的值有不同的处理方式,那么每个允许的输入值对应一个有效等价类,所有不允许的输入值的集合为一个无效等价类

例如:输入条件“职称”的值是初级、中级或高级,那么可划分为以下四个等价类

4)按限制条件划分

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

例如:在 Pascal 语言中对变量标识符规定为一个语句必须以;结束,那么可以划分以下为若干等价类

在划分完等价类后,即可设计测试用例,其可归纳为三步:

  1. 对每个输入和外部条件进行等价类划分,画出等价类表,并为每个等价类进行唯一的编号
  2. 设计一个测试用例,使其尽可能多地覆盖有效等价类,重复这一步,直到所有的有效等价类被覆盖
  3. 为每一个无效等价类设计一个测试用例,直到所有无效等价类都被覆盖为止

等价类表如下:

边界值分析法

边界值分析法是等价类划分的补充,通过确定边界情况,选择边界值、大于边界值的测试外点、小于边界值的测试内点作为测试数据

用边界值分析法设计测试用例时遵守以下原则:

1)规定范围

如果输入/输出条件规定了取值范围,应以该范围的边界内及刚刚超范围的边界外的值作为测试用例

例如:重量 10-50kg 的邮件,选择边界值 10、50、10.01、49.99、9.99 及 50.01 作为测试用例

2)规定个数

若输入/输出条件规定了值的个数,应分别以最大、最小个数和稍小于最小和稍大于最大个数作为测试用例

例如:一个输入文件有 1-300 个记录,设计测试用例时则可以分别设计有 1、300、0、301 个记录的输入文件

3)有序集合

如果输入/输出范围是有序的集合,如顺序文件、表格等,选取有序集的第一个和最后一个元素作为测试用例

例如:一个输入文件是一个从 1~10 的有序表格,设计测试用例时可以选取 1、10 作为测试用例

错误推测法

错误推测法是依靠经验和直觉来推测程序可能存在错误,通过有针对性编写来检查这些错误的测试用例

常见的有:

  • 输入数据或输出数据为零
  • 输入或输出数目为零
  • 缺省值
  • 空白与空值
  • 多个数据的组合效应
  • 错误的群集现象

因果图法

因果图法是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,该方法充分考虑了输入情况的各种组合及输入条件之间的相互制约关系,适用于检查程序输入条件的各种组合情况

在因果图中,用 C 表示原因,E 表示结果,各节点表示状态,取值0 表示某状态不出现,取值 1 表示某状态出现。

在原因和结果之间,有四种关系:

  • 恒等:若 C1 是1,则 E1 也是 1,否则 E1 为0
  • 非:若 C1 是 1,则 E1 是 0,否则 E1 是 1
  • 或:若 C1 或 C2 是 1,则 E1 是 1,否则 E1 为 0
  • 与:若 C1 和 C2 都是 1,则 E1 为 1,否则 E1 为 0

在原因与原因之间、结果与结果之间存在以下约束关系:

  • 互斥(E 约束):a 和 b 中至多有一个可能为 1,即 a 和 b 不能同时为 1
  • 包含(I 约束):a、b 和 c 中至少有一个必须是 1,即 a、b 和 c 不能同时为 0
  • 唯一(O 约束):a 和 b 必须有一个,且仅有 1 个为 1
  • 要求(R 约束):a 是 1 时,b 必须是 1,即不可能 a 是 1 时 b 是 0
  • 屏蔽/强制(M 约束):若结果 a 是 1,则结果 b 强制为 0

需要注意的是,以上五种约束关系,前四种是输入条件的约束,只有最后一种是输出结果的约束。

用因果图生成测试用例的基本步骤如下:

  1. 分析软件规格说明描述:原因、结果、标识符
  2. 分析软件规格说明描述中的语义:找出逻辑关系
  3. 由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现,需要添加必要的约束条件
  4. 把因果图转换成判定表
  5. 把判定表的每一列拿出来作为依据,设计测试用例

【白盒测试】

概述

白盒测试,又称玻璃盒测试,其关注软件产品的内部细节和逻辑结构,即把被测的程序看成是一个透明的盒子

白盒测试利用构件层设计的一部分而描述的控制结构来生成测试用例,其需要对系统内部结构和工作原理有一个清楚的了解

白盒测试也有多种技术,比如:代码检查法、逻辑覆盖法、基本路径法、静态质量度量、域测试、Z 路径覆盖等

白盒测试的每种测试方法都有各自的优点和不足,需要测试人员根据 实际软件特点、实际测试目标和测试阶段选择合适的方法设计测试用例,这样能 有效地发现软件错误,提高测试效率和测试覆盖率

在选择测试方法时有以下经验:

  • 在测试中,可采取先静态再动态的组合方式,先进行代码检查和静态结构分析,再进行覆盖测试
  • 利用静态分析的结果作为引导,通过代码检查和动态测试的方式对静态分析的结果做进一步确认
  • 覆盖测试是白盒测试的重点,一般可使用基本路径测试法达到语句覆盖标准,对于软件的重点模块,应使用多种覆盖标准衡量测试的覆盖率
  • 在不同的测试阶段测试重点不同,在单元测试阶段,以代码检查、覆盖测试为主,在集成测试阶段,需要增加静态结构分析等,在系统测试阶段,应根据黑盒测试的结果,采用相应的白盒测试方法

逻辑覆盖法

概述

对于一个具有多重选择和循环嵌套的程序,当选择不同的路径进行测试时,路径数目可能是一个天文数字,这就是完全测试的困难性

逻辑覆盖法以程序内在的逻辑结构为基础,根据程序的流程图设计测试用例

上面的程序流程图,可分为四条路径:

  • L1(a->c->e):$(A>1\: and \: B=0)\: and \:(A=2 \: or \: X/A>1) $
  • L2(a->b->d):$\overline{(A>1 \: and \: B=0)} \: and \: \overline{(A=2 \: or \: X>1)}$
  • L3(a->b->e):$\overline{(A>1 \: and \: B=0)} \: and \: (A=2 \: or \: X>1)$
  • L4(a->c->d):$(A>1\: and \: B=0)\: and \: \overline{(A=2 \: or \: X/A>1)} $

化简后有:

对于这四条路径设计测试用例,其格式为:【输入 (A,B,X),输出(A,B,X)】

那么当这四条路径覆盖时,有:

  • 覆盖 L1:【(2,0,4),(2,0,3)】
  • 覆盖 L2:【(1,1,1),(1,1,1)】
  • 覆盖 L3:【(1,1,2),(1,1,3)】
  • 覆盖 L4:【(3,0,3),(3,0,1)】

分类

根据覆盖的目标不同,又可分为语句覆盖、分支覆盖、条件覆盖、分支-条件覆盖、条件组合覆盖和路径覆盖。

1)语句覆盖

语句覆盖,是设计若干个测试用例,运行被测程序,使得每一可执行 语句至少执行一次

在上图中,正好所有的可执行语句都在路径 L1 上,所以选择路径 L1 设计测试用例,就可以覆盖所有的可执行语句

2)分支覆盖

分支覆盖,就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次

在上图中,选取路径 L1 和 L2 是一个分支,选取路径 L3 和 L4 又是另一个分支

3)条件覆盖

条件覆盖,就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次

在上图中,选取路径 L3 就是一个条件覆盖

4)分支-条件覆盖

分支-条件覆盖,是取足够多测试数据,使判定表达式每个条件都取各种可能值,且每个判定表达式也都取到各种可能结果,实现不同的分支

5)条件组合覆盖

条件组合覆盖,是设计足够的测试用例,运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次

6)路径覆盖

路径覆盖思想,是覆盖被测试程序中的所有可能路径

即选择上图中的四条路径

基本路径法

基本路径法设计出的测试用例要保证在测试中程序的每条可执行语句至少执行一次,其需要使用程序的控制流图进行可视化表达

基本路径法的步骤如下:

1)根据过程设计结果画出相应流图

2)计算流图的环形复杂度

  • V(G)=边数-点数+2
  • V(G)=图所在平面被划分为的区域数
  • V(G)=判定节点数+1

3)确定线性独立路径的基本集合

独立路径是指至少包含一条在定义该路径之前不曾用过的边

从程序的环形复杂度可以导出程序基本路径集合中的独立路径数,这是确保程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。

4)设计测试用例覆盖基本集合的路径

【灰盒测试】

除黑盒测试和白盒测试外,还有一种灰盒测试,其是介于白盒测试和黑盒测试之间的测试方法,它关注输出对于输入的正确性,同时也关注内部表现,但是不像白盒测试那样详细、完整,只是通过一些表征性的现象、事件、标志来判断内部的运行状态

有时候输出是正确的,但是程序内部已经是错误的,这种情况非常多,如果每次都通过白盒测试来操作,效率会很低,因此可采取灰盒测试这种方法

灰盒测试结合了白盒测试和黑盒测试的要素,考虑了用户端、特定 的系统知识和操作环境。它在系统组件的协同性环境中评价应用软件的设计,可以认为,集成测试就是一类灰盒测试

感谢您对我的支持,让我继续努力分享有用的技术与知识点!