软件测试分类及白盒测试不同覆盖原理详解
一、软件测试与调试
1.1软件测试
软件测试是在软件正式运行前,设计测试用例尽可能多地发现软件中的错误。
软件测试有多种不同分类方式:
- 按照测试过程中程序执行状态,可分为静态测试和动态测试;
- 根据具体实现算法细节和系统内部结构的相关情况,可分为黑盒测试、白盒测试和灰盒测试;
- 根据软件测试阶段划分,可分为单元测试、集成测试和系统测试。
1.2软件调试
软件调试发生在测试之后,是根据测试过程中发现的错误找出错误原因,并进行修正。修正错误之后要进行回归测试,以验证修正部分的正确性和软件原有的正常功能不受影响。
二、单元测试与系统测试
2.1单元测试
单元测试也称模块测试,主要对软件的模块进行测试,通过测试发现模块功能是否满足预期希望。
单元测试的依据文档是软件详细设计说明书。
2.2集成测试
集成测试也称组装测试,通常要对已经组装起来的模块同时进行测试,以检查程序组装的正确与否,以及发现接口和通信有关的问题。
集成测试的依据文档是软件概要设计说明书。
2.3系统测试
系统测试是软件测试最后阶段的测试,它是在单元测试和集成测试的基础上进行的,从全局考察软件系统的功能和性能要求。
系统测试的依据文档是软件需求规格说明书或用户合同。
系统测试通常包括确认测试和验收测试。
三、黑盒测试与白盒测试
3.1黑盒测试
黑盒测试又称功能测试,主要用于集成测试和确认测试阶段。
黑盒测试将程序看成是一个黑盒,测试人员不必考虑程序内部的结构和特性,只检查程序功能是否按照规范正确无误地运行。

常用的黑盒测试技术包括等价类划分、边界值分析、错误推测、因果图和判定表等。
3.2白盒测试
白盒测试又称结构测试,主要用于单元测试阶段,主要根据程序内部逻辑,检查程序是否按照设计规格说明书的设定执行动作,检查每一条通路能否正常工作。

常用的白盒测试法有控制流分析、数据流分析、路径分析、程序变异等。
根据设计的测试用例对程序逻辑的覆盖程度可分为:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合条件覆盖和路径覆盖。
3.2.1语句覆盖
语句覆盖,指被测程序每条语句都至少执行一遍,但并不要求并不要求判断语句的True/False两个分支都执行,例如如下情况:
powershell
if (A > 0)
S1;
S2;
设计一个测试用例A=1,则将每条语句都执行了一遍,完成了语句覆盖。
3.2.2判定覆盖
判定覆盖又称分支覆盖,不仅要求每条语句都至少执行一遍,还要求每个判定表达式的每种可能的结果都至少执行一次,例如上一小节中的例子:
powershell
if (A > 0)
S1;
S2;
如果只设计一个测试用例A=1,那么就漏掉了A≤0的情况,所以需要再设计一个测试用例A=-1,两个测试用例才能完成判定覆盖。
因此判定覆盖通常强于语句覆盖,只在一些特殊情况下二者相同。
3.2.3条件覆盖
条件覆盖,要求在每条语句都至少执行一遍的基础上,每个判定表达式中的每个子条件都取得各种可能的结果,例如如下例子:
powershell
if (A or B)
S;
例子中判定表达式的子条件有两个,分别为A和B,那么设计两个测试用例即可满足条件覆盖:
| 测试用例 | A | B | A or B |
|---|---|---|---|
| 用例1 | true | false | true |
| 用例2 | false | true | true |
上述两个测试用例中A和B的两种可能结果都已取到,则完成了条件覆盖,但是判定表达式的结果却只取到了一种,不满足判定覆盖。同样地,也可以设计例子满足判定覆盖而不满足条件覆盖,因此有如下结论:
条件覆盖不一定包含判定覆盖,而判定覆盖也不一定包含条件覆盖。
3.2.4判定/条件覆盖
判定/条件覆盖,要求同时满足判定覆盖和条件覆盖,例如如下例子:
powershell
if (A or B)
S;
设计3个测试用例即可满足判定/条件覆盖:
| 测试用例 | A | B | A or B |
|---|---|---|---|
| 用例1 | true | false | true |
| 用例2 | false | true | true |
| 用例3 | false | false | false |
上述测试用例中A和B的两种可能结果都已取到,而判定表达式的两种可能结果也都取到,同时满足判定覆盖和条件覆盖。但是注意并不是A和B的所有可能组合都会被取到。
3.2.5条件组合覆盖
条件组合覆盖要求,每个判定表达式中的每个子条件结果的所有可能组合都至少出现一次。
在上一小节的例子中,判定表达式有两个子条件,因此有4种组合,同时取到才能满足条件组合覆盖。
显然,满足条件组合覆盖也一定满足判定/条件覆盖,条件组合覆盖程度强于前述4种。
3.2.6路径覆盖
路径覆盖要求,程序的每种可能执行到的路径都至少经过一次。例如如下例子:
powershell
if (A > 0)
S1;
if (B > 0)
S2;
S3;
程序结果如下:
xml
start
|
A>0 ?
/ \
S1 |
\ /
B>0 ?
/ \
S2 |
\ /
S3
程序有4条路径:
| 路径 | A | B | 执行语句 |
|---|---|---|---|
| P1 | T | T | S1 → S2 → S3 |
| P2 | T | F | S1 → S3 |
| P3 | F | T | S2 → S3 |
| P4 | F | F | S3 |
如果是语句覆盖,那么只要覆盖P1即可,而路径覆盖则需覆盖全部4条路径。
路径覆盖实际上覆盖了判定表达式的所有可能结果,但是注意并没有考虑判定表达式的子条件的取值情况。
因此路径覆盖包含了语句覆盖和判定覆盖,但不一定包含条件覆盖、判定/条件覆盖和条件组合覆盖。