软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试(2)
接前一篇文章:软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试(1)
本文内容参考:
黑盒测试和白盒测试详解-CSDN博客
软件测试中的各种覆盖(Coverage)详解-CSDN博客
特此致谢!
二、白盒测试
1. 基本介绍
白盒测试也称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试,是一种动态分析法。白盒测试主要用于检测软件编码过程中的错误。程序员的编程经验、对编程软件的掌握程度、工作状态(编写代码时的精神状态)等因素都会影响到编程质量,导致代码错误。
软件程序基本的语法错误在程序调试时,就能够比较及时地发现,然后及时进行改正。但是软件程序在运算顺序、逻辑判断以及运行路径上的错误很难发现。在实际的软件程序代码编写上,没有程序员能够保证代码编写结构不出现任何错误,即使是水平很高的程序员也不能保证。白盒测试下,软件程序被看做是一个打开的盒子,盒子里有被测软件的源代码,还能够分析盒子内部的结构,所以这种测试方法能够全面地测试程序代码结构。
白盒测试方法一般遵循以下原则:
- 保证一个模块中的所有独立路径至少被测试一次。
- 所有逻辑值均需测试真(true)和假(false)两种情况。
- 检查程序的内部数据结构,保证其结构的有效性。
- 在上下边界及可操作范围内运行所有循环。
2. 优缺点
(1)优点
- 迫使测试人员去仔细思考软件的实现。
- 可以检测代码中的每条分支和路径。
- 揭示隐藏在代码中的错误。
- 对代码的测试比较彻底。
- 最优化。
(2)缺点
- 投入成本高、昂贵。
- 无法检测代码中遗漏的路径和数据敏感性错误。
- 不验证规格的正确性。
3. 方法
白盒测试方法主要分为语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖以及路径覆盖。
(1)语句覆盖(Statement Coverage)
基本思想是设计若干测试用例,运行被测程序,使程序中的每个可执行语句至少被执行一次。语句覆盖是最基础的覆盖标准。
示例:
def calculate(x):if x > 0: # 分支语句print("正数") # 语句1else:print("非正数") # 语句2
测试用例:
- x为1(覆盖语句1)
- x为-1(覆盖语句2)
覆盖率计算:
-
总语句数:3(if + print + print)
-
已覆盖:3 → 100%语句覆盖
优缺点:
- 优点:简单易实现。
- 缺点:无法检测缺失分支(如没有测试x为0情况)。
(2)分支覆盖(Branch Coverage)
也称判定覆盖。基本思想是设计若干用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断真假值均曾被满足。
示例:
def check(score):if score >= 60: // 分支点return "及格"; // 分支1else:return "不及格"; // 分支2
测试用例:
- score为80(覆盖分支1)
- score为50(覆盖分支2)
与语句覆盖的关系:
-
100%分支覆盖 ⇒ 100%语句覆盖
-
反之不成立
(3)条件覆盖(Condition Coverage)
基本思想是设计若干测试用例,执行被测程序以后,要使每个判断中每个条件的可能取值至少满足一次。
示例:
if (age > 18 && gender == 'M') { // 两个子条件// do something
}
子条件:
- age > 18(T/F)
- gender == 'M'(T/F)
测试用例:
用例 | age | gender | 覆盖条件组合 |
---|---|---|---|
1 | 20 | 'M' | T && T |
2 | 15 | 'F' | F && F |
3 | 20 | 'F' | T && F (可选) |
4 | 15 | 'M' | F && T (可选) |
(4)判定-条件覆盖
是判定和条件覆盖设计方法的交集,即设计足够的测试用例,使得判断条件中的所有条件可能取值至少执行一次,同时,所有判断的可能结果至少执行一次。
(5)条件组合覆盖
基本思想是设计足够的测试用例,使得程序中每个判断的所有可能的条件取值组合都至少出现一次。
(6)路径覆盖(Path Coverage)
基本思想是设计足够的测试用例,覆盖程序中所有可能的执行路径。路径覆盖是最严格的覆盖标准。
示例:
def func(x, y):if x > 0: # 分支1y += 1if y < 10: # 分支2x += 1return x + y
独立路径:
- 分支1=T → 分支2=T
- 分支1=T → 分支2=F
- 分支1=F → 分支2=T
- 分支1=F → 分支2=F
现实挑战:
-
循环可能产生无限路径 → 通常限制循环次数
-
复杂度随分支数指数增长(n个分支⇒最多2ⁿ条路径)
优缺点:
- 优点:可以对程序进行彻底的测试用例覆盖,比前面讲的5种方法覆盖度都要高。
- 缺点:需要对所有可能的路径进行测试(包括循环、条件组合、分支选择等),那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长。
至此,对于白盒测试就讲解完了。黑盒测试、白盒测试的全部内容也就讲解完了。