软件测试基本概念-白盒测试

2014-08-06 walter lee 更多博文 » 博客 » GitHub »

软件测试

原文链接 http://www.xiangguo.li/software_test/2014/08/06/software_test5
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


{% include JB/setup %}

软件测试基本概念-白盒测试

又称结构测试、逻辑驱动测试、程序员测试

1 逻辑覆盖法

1.1 语句覆盖

原理

如果语句中有错误,仅靠观察不执行可能发现不了.

定义

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

观点

  • 语句覆盖率-已执行的可执行语句占程序中可执行语句总数的百分比
  • 复杂的程序不可能达到语句的完全覆盖
  • 语句覆盖率越高越好

优点

  • 检查所有语句
  • 结构简单的代码的测试效果较好
  • 容易实现自动测试
  • 代码覆盖率高
  • 如果是程序块覆盖,则不涉及程序块中的源代码

不能检查出的错误

  • 逻辑运算(&&、||)错误-判定的第一个运算符“&&”错写成“||”,或第二个运算符“||”错写成“&&”,这时使用上述的测试用例仍然可以达到100%的语句覆盖.
  • 循环语句错误
  • 循环次数错误
  • 跳出循环条件错误

1.2 判定覆盖

定义

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

1.3 条件覆盖

定义

在设计程序中,一个判定语句是由多个条件组合而成的复合判定,判定(a)&&(b||c)包含了三个条件:a,b和c。为了更彻底的实现逻辑覆盖,可以采用条件覆盖。
条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。

1.4 判定-条件覆盖

定义

判定/条件覆盖实际上是将判定覆盖和条件覆盖结合起来的一种方法, 就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判定的可能结果也至少出现一次。

1.5 条件组合覆盖

定义

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

1.6 路径覆盖

定义

路径覆盖就是设计足够的测试用例,覆盖程序中所有可能的路径。

注意

满足路径覆盖的测试用例并不一定满足条件组合覆盖,但是一定满足判定覆盖。

说明

对于比较简单的小程序,实现路径覆盖是可能做到的。但如果程序中出现较多判断和较多循环,可能的路径数目将会急剧增长,要在测试中覆盖所有的路径是无法实现的。为了解决这个难题,只有把覆盖路径数量压缩到一定的限度内,如程序中的循环体只执行一次。
在实际测试中,即使对于路径数很有限的程序已经做到路径覆盖,仍然不能保证被测试程序的正确性,还需要采用其他测试方法进行补充。

2 基本路径测试方法

2.1 定义

路径测试就是从一个程序的入口开始,执行所经历的各个语句的完整过程。从广义的角度讲,任何有关路径分析的测试都可以被称为路径测试。 完成路径测试的理想情况是做到路径覆盖,但对于复杂性大的程序要做到所有路径覆盖是不可能的。 在不能做到所有路径覆盖的前提下,如果某一程序的每一个独立路径都被测试过,那么可以认为程序中的每个语句都已经检验过了,即达到了语句覆盖。这种测试方法就是通常所说的基本路径测试方法。

2.2 方法

基本路径测试方法是在控制流图的基础上,通过分析控制结构的环形复杂度,导出执行路径的基本集,再从该基本集设计测试用例。基本路径测试方法包括4个步骤:

  1. 画出程序的控制流图。
  2. 计算程序的环形复杂度,导出程序基本路径集中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。
  3. 导出基本路径集,确定程序的独立路径。
  4. 根据3中的独立路径,设计测试用例的输入数据和预期输出。

3 循环测试

3.1 循环分为4种不同类型:

循环测试

  • 简单循环
  • 连锁循环(串接循环)
  • 嵌套循环
  • 非结构循环(不规则循环)

3.2 简单循环

  1. 零次循环:从循环入口到出口
  2. 一次循环:检查循环初始值
  3. 二次循环:两次通过循环
  4. m次循环: 检查多次循环
  5. 最大次数循环n、比最大次数多一次n+1、少一次的循环n-1。
 详情(略) ###3.3 嵌套循环
  6. 对最内层循环做简单循环的全部测试。所有其它层的循环变量置为最小值;
  7. 逐步外推,对其外面一层循环进行测试。测试时保持所有外层循环的循环变量取最小值,所有其它嵌套内层循环的循环变量取“典型”值。
  8. 反复进行,直到所有各层循环测试完毕。
  9. 对全部各层循环同时取最小循环次数,或者同时取最大循环次数

3.4 连锁循环

如果各个循环互相独立,则可以用与简单循环相同的方法进行测试。但如果几个循环不是互相独立的,则需要使用测试嵌套循环的办法来处理。

非结构循环

这一类循环应该使用结构化程序设计方法重新设计程序,或者酌情设计测试用例。

4 Z路径测试

定义

完成路径测试的理想情况是做到路径覆盖,对于比较简单的小程序实现路径覆盖是可以做到的,但是如果程序中出现多个判断和多个循环,可能的路径数目将会急剧增长,达到天文数字,以至于实现完全的路径覆盖是不可能的。
为了解决这一问题,我们必须舍掉一些次要因素,对循环机制进行简化,从而极大地减少路径的数量,使得覆盖这些有限的路径成为可能。这种简化意义下的路径覆盖称为Z路径覆盖

注意

循环化简是指限制循环的次数。无论循环的形式和实际执行循环体的次数是多少,只考虑循环一次和零次两种情况。即:只考虑执行时进入循环体一次和跳过循环体的两种情况。

5 程序插桩技术

在软件动态测试中,程序插桩(Program Instrumentation)是一种基本的测试手段

方法简介

借助往被测程序中插入操作,来实现测试目的的方法。

最简单的插桩

在程序中插入打印语句printf(“…”)语句

6 白盒测试综合策略

在不同的测试阶段,测试的侧重点不同

  • 在单元测试阶段,以代码检查、逻辑覆盖为主;
  • 在集成测试阶段,需要增加静态结构分析、静态质量度量;
  • 在系统测试阶段,先进行黑盒测试,然后根据黑盒测试的结果,采取相应的白盒测试。

在白盒测试中,可以使用各种测试方法的综合测试如下所示:

  • 在测试中,应尽量先用工具进行静态结构分析。
  • 测试中可采取先静态后动态的组合方式:先进行静态结构分析、代码检查和静态质量度量,再进行覆盖率测试。
  • 利用静态分析的结果作为引导,通过代码检查和动态测试的方式对静态分析结果进行进一步的确认,使测试工作更为有效。
  • 覆盖率测试是白盒测试的重点,一般可使用基本路径测试法达到语句覆盖标准;对于软件的重点模块,应使用多种覆盖率标准衡量代码的覆盖率;