一.白盒测试vs黑盒测试
黑盒测试,又称功能测试,简单来说就是测试软件是否有效地完成所述功能。
白盒测试,又称结构测试,即对序内部逻辑结构、对所有逻辑路径进行测试。
从主观上,不是特别清楚两者功能区别的重要性上来说,会理解为一种能看得见代码,一种看不见代码。
我从网上看到过一种特别有意思的比喻,来跟大家分享一下。
如果把咱们要测试的程序就比作常年不用的饮水机来说,你很多年没用了,里面可能会有土啊,生锈啊什么的,这些其实就是程序中的bug。
那么就有两种方法找出这些“土”、“锈”——“bug”。
第一,往里面灌水,如果从出水口出来的水是清澈的,那么意味着里面没有土拉。
第二,直接打开饮水机,清洗尘土,污渍。
第一种类似黑盒测试,只要水是清澈,我们就觉得可以饮用了,这个饮水机能完成我们喝水的需求拉,但是里面的锈渍可能特别顽固,不能被几次水冲所清理掉,机器内部的污渍还存在。
第二种类似白盒测试,直接打开看里面的结构,但是里面的结构可能比较复杂,你要走很多分支。
项目 | 黑盒测试 | 白盒测试 |
规划方面 | 功能的测试 | 结构的测试 |
优点 | 能确保从用户的角度出发进行测试 | 能对程序内部的特定部位进行覆盖测试 |
缺点 |
无法测试程序内部特定部位; 当规格说明有误不能发现问题 |
无法检查程序的外部特性; 无法对未实现规格说明的程序内部 欠缺部分进行测试 |
设计用例方法 | 边界分析法、等价类划分法、决策表测试 |
语句覆盖,判定覆盖 条件覆盖,判定/条件覆盖,、路径覆盖,循环覆盖, 模块接口测试 |
二、白盒测试
1.白盒的测试用例需要做到:
(1)保证一个模块中的所有独立路径至少被使用一次
(2)对所有逻辑值均需测试 true 和 false
(3)在上下边界及可操作范围内运行所有循环
(4)检查内部数据结构以确保其有效性
2.六种白盒测试设计用例方法:
1)所谓语句覆盖:就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。这里的“若干个”,意味着使用测试用例越少越好。语句覆盖率的公式可以表示如下:
语句覆盖率=被评价到的语句数量/可执行的语句总数 x 100%
2)判定覆盖:使设计的测试用例保证程序中每个判断的每个取值分支(t or f)至少经历一次
[优点]:判定覆盖具有比语句覆盖更强的测试能力,而且具有和语句覆盖一样的简单性,无需细分每个判定就可以得到测试用例。
[缺点]:往往大部分的判定语句是由多个逻辑条件组合而成(如,判定语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。
例如:
int a,b;
if(a || b)
执行语句1
else
执行语句2
要达到这段程序的判断覆盖,我们采用测试用例:1)a = true , b = true ;2)a = flase, b = flase
3)条件覆盖:条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,判定中每个条件的所有可能结果至少出现一次,但未必能覆盖全部分支
条件覆盖要检查每个符合谓词的子表达式值为真和假两种情况,要独立衡量每个子表达式的结果,以确保每个子表达式的值为真和假两种情况都被测试到。
4) 判定条件覆盖:判定-条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果至少执行,即要求各个判断的所有可能的条件取值组合至少执行一次。
5) 条件组合覆盖:在白盒测试法中,选择足够的测试用例,使所有判定中各条件判断结果的所有组合至少出现一次,满足这种覆盖标准成为条件组合覆盖。
6)路径覆盖:是每条可能执行到的路径至少执行一次;
说明:其中语句覆盖是一种最弱的覆盖,判定覆盖和条件覆盖比语句覆盖强,满足判定/条件覆盖标准的测试用例一定也满足判定覆盖、条件覆盖和语句覆盖,条件组合覆盖是除路径覆盖外最强的,路径覆盖也是一种比较强的覆盖,但未必考虑判定条件结果的组合,并不能代替条件覆盖和条件组合覆盖。
举例:
if A and B then Action1
if C or D then Action2
1)语句覆盖最弱,只需要让程序中的语句都执行一遍即可 。上例中只需设计测试用例使得A=true B=true C=true 即可。
2)分支覆盖又称判定覆盖:使得程序中每个判断的取真分支和取假分支至少经历一次,即判断的真假均曾被满足。上例需要设计测试用例使其分别满足下列条件即可(1)A=true,B=true,C=true,D=false(2)A=true,B=false,C=false,D=false。
3)条件覆盖:要使得每个判断中的每个条件的可能取值至少满足一次。上例中第一个判断应考虑到A=true,A=false,B=true,B=false第二个判断应考虑到C=true,C=false,D=true,D=false,所以上例中可以设计测试用例满足下列条件(1)A=true,B=true,C=true,D=true(2)A=false,B=false,C=false,D=false。
4) 路径覆盖:要求覆盖程序中所有可能的路径。所以可以设计测试用例满足下列条件(1)A=true,B=true,C=true,D=true(2)A=false,B=false,C=false,D=false(3)A=true,B=true,C=false,D=false(4)A=false,B=false,C=true,D=true。