0%

白盒测试基本方法

结合自己的项目对白盒测试方法学习写个小结,理论部分转自CSDN https://blog.csdn.net/zxxssdsd/article/details/49314203。

白盒测试的概述

由于逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。由于我们经常相信某逻辑路径不可能被执行, 而事实上,它可能在正常的情况下被执行。由于代码中的笔误是随机且无法杜绝的,因此我们要进行白盒测试。
白盒测试又称结构测试,透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。

白盒测试的特点

依据软件设计说明书进行测试、对程序内部细节的严密检验、针对特定条件设计测试用例、对软件的逻辑路径进行覆盖测试。

白盒测试用例的设计目标

保证一个模块中的所有独立路径至少被使用一次
对所有逻辑值均需测试 true 和 false
在上下边界及可操作范围内运行所有循环
检查内部数据结构以确保其有效性

白盒测试的实施步骤

测试计划阶段:根据需求说明书,制定测试进度。
测试设计阶段:依据程序设计说明书,按照一定规范化的方法进行软件结构划分和设计测试用例。
测试执行阶段:输入测试用例,得到测试结果。
测试总结阶段:对比测试的结果和代码的预期结果,分析错误原因,找到并解决错误。

白盒测试的方法

其中语句覆盖是一种最弱的覆盖,判定覆盖和条件覆盖比语句覆盖强,满足判定/条件覆盖标准的测试用例一定也满足判定覆盖、条件覆盖和语句覆盖,条件组合覆盖是除路径覆盖外最强的,路径覆盖也是一种比较强的覆盖,但未必考虑判定条件结果的组合,并不能代替条件覆盖和条件组合覆盖。

语句覆盖

设计的用例需要保证每一个可执行语句至少执行一次。
覆盖率公式为:

1
覆盖率 = 被测到的语句数据 / 可执行语句数 * 100%

判定覆盖

设计的测试用例,需要保证每个判断的每个取值分支都至少经历一次。
优点:较语句覆盖可以有更强的覆盖,简单易理解,只需要关注单个判定,无需细分即可得到测试用例。
缺点:大部分的判定条件都是多个组合起来的(or/and/case),若仅判断整个条件的结果,会遗漏部分数据类型测试路径。
如下:

1
2
3
4
5
if (list.length===0 || proxy.length === 0) {
return result1;
}else{
return result2;
}

程序要设计判定覆盖2条用例就够了,我们的测试用例可以是:
1.都为真

1
2
const list = []
const proxy = []

2.都为假

1
2
const list = ['1']
const proxy = ['2']

路径覆盖

设计的测试用例,需要保证每条可能执行到的路径至少执行一次。

条件覆盖

条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,判定中每个条件的所有可能结果至少出现一次,但未必能覆盖全部分支
条件覆盖要检查每个符合谓词的子表达式值为真和假两种情况,要独立衡量每个子表达式的结果,以确保每个子表达式的值为真和假两种情况都被测试到。

判定条件覆盖

判定-条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果至少执行,即要求各个判断的所有可能的条件取值组合至少执行一次。

条件组合覆盖

使所有判定中各条件判断结果的所有组合至少出现一次,满足这种覆盖标准成为条件组合覆盖。这是算是覆盖最全的了,但成本也很

实例:

1
2
3
4
5
6
7
8
9
10
11
12
if(repassword !== password) {
this.form.current.showError('repassword', 'repassword not equal password')
return
}
if(!!result) {
RegisterDao.registerDone(result)
.then(response => {
if(response.registerStatus === '0') {
this.props.navigation.navigate('Home')
}
})
}

语句覆盖:

只需要让程序中的语句都执行一遍即可

1.

1
2
3
const repassword = '1111'
const password = '1111'
const result = 'test'

判定覆盖:

使得程序中每个判断的取真分支和取假分支至少经历一次

1.

1
2
3
const repassword = '1111'
const password = '1111'
const result = 'test'

2.

1
2
3
const repassword = '1111'
const password = '222'
const result = null

条件覆盖:

使得每个判断中的每个条件的可能取值至少满足一次。

1.

1
2
3
const repassword = '1111'
const password = '1111'
const result = 'test'

2.

1
2
3
const repassword = '1111'
const password = '222'
const result = null

3.

1
2
3
const repassword = '1111'
const password = '222'
const result = undefind

路径覆盖:

要求覆盖程序中所有可能的路径,这里如下图有四条路径。

1.

1
2
3
const repassword = '1111'
const password = '1111'
const result = 'test'

2.

1
2
3
const repassword = '1111'
const password = '222'
const result = null

3.

1
2
3
const repassword = '1111'
const password = '1111'
const result = null

4.

1
2
3
const repassword = '1111'
const password = '222'
const result = 'test'

理解上面的条件组合判断也会得到类似用例,不过他是针对一个判断内的条件进行组合,示例程序中没有组合条件,实际使用还需按实际情况灵活选择合适的方法。