软件测试分类及白盒测试不同覆盖原理详解

软件测试分类及白盒测试不同覆盖原理详解

一、软件测试与调试

1.1软件测试

软件测试是在软件正式运行前,设计测试用例尽可能多地发现软件中的错误。

软件测试有多种不同分类方式:

  1. 按照测试过程中程序执行状态,可分为静态测试和动态测试;
  2. 根据具体实现算法细节和系统内部结构的相关情况,可分为黑盒测试、白盒测试和灰盒测试;
  3. 根据软件测试阶段划分,可分为单元测试、集成测试和系统测试。

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条路径。

路径覆盖实际上覆盖了判定表达式的所有可能结果,但是注意并没有考虑判定表达式的子条件的取值情况。

因此路径覆盖包含了语句覆盖和判定覆盖,但不一定包含条件覆盖、判定/条件覆盖和条件组合覆盖。

相关推荐
@insist1231 天前
信息安全工程师-测评核心知识框架与关键流程(下篇)
网络·安全·软考·信息安全工程师·软件水平考试
软件测试慧姐1 天前
软件测试面试题总结【含答案】
软件测试·测试工具·面试
橘长_1 天前
【软考】单双缓冲区的时间计算
软考
橘长_1 天前
【软考】缓存直接映射计算1
软考
水云桐程序员1 天前
游戏开发工作流程
游戏程序·软件工程·创业创新·学习方法·游戏策划
marsh02061 天前
47 openclaw监控指标设计:关键性能指标(KPI)选择与实现
网络·ai·编程·技术
workflower1 天前
AI能源智慧生产与绿色开发核心场景
大数据·人工智能·设计模式·机器人·软件工程·能源
硅谷秋水1 天前
ARIS:基于对抗性多智体协作的自主研究
人工智能·科技·机器学习·语言模型·软件工程
skywalk81631 天前
全面评估这门中文语言的情况,看它离一个可以实际产业落地的编程语言还有多远距离!
开发语言·编程