上次学习了黑盒测试,这次来学习白盒测试吧!
黑盒测试是在测试中,把程序看作一个不能打开的黑盒子!(要不怎么能叫黑呢!)在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。
说白了就是,给你一个软件,告诉你他能干什么,但是不告诉你他是怎么完成的。你只能测试他的功能完不完善,能不能完成他说他能完成的功能。
关于黑盒测试都学习了些什么,传送门:HIT软件构造:黑盒测试学习Blog_m0_51401323的博客-CSDN博客
白盒测试
理解白盒测试是什么
(百度百科)白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,即清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。
我的理解:其实我觉得叫白盒测试只是为了和黑盒测试搭配,叫透明盒测试感觉更贴切!不同于黑盒测试,白盒测试是可以看到内部代码如何运作的,确定测试用例的时候就可以根据它实现的逻辑来选择啦。
白盒测试的优缺点
优点:代码覆盖率高
缺点:覆盖所有代码路径难度大
业务功能可能覆盖不全
测试开销大
白盒测试覆盖标准
在说测试方法之前必须要提到的是白盒测试的覆盖标准。
白盒测试的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和修改条件判断覆盖 。六种覆盖标准发现错误的能力呈由弱到强的变化:
- 语句覆盖每条语句至少执行一次。
- 判定覆盖每个判定的每个分支至少执行一次。
- 条件覆盖每个判定的每个条件应取到各种可能的值。
- 判定/条件覆盖同时满足判定覆盖条件覆盖。
- 条件组合覆盖每个判定中各条件的每一种组合至少出现一次。
- 修改条件判断覆盖每一个判断的所有可能结果都出现过、每一个判断中所有条件的所有可能结果都出现过、每一个进入点及结束点都执行过、判断中每一个条件都可以独立的影响判断的结果。
白盒测试测试方法
白盒测试的方法:总体上分为静态方法和动态方法两大类。
静态分析是一种不通过执行程序而进行测试的技术。静态分析的关键功能是检查软件的表示和描述是否一致,没有冲突或者没有歧义。
动态分析的主要特点是当软件系统在模拟的或真实的环境中执行之前、之中和之后 , 对软件系统行为的分析。动态分析包含了程序在受控的环境下使用特定的期望结果进行正式的运行。它显示了一个系统在检查状态下是正确还是不正确。在动态分析技术中,最重要的技术是路径和分支测试。下面要介绍的六种覆盖测试方法属于动态分析方法。
下面主要介绍动态方法!
以下的方法都基于这个图来讲啦
1.语句覆盖
语句覆盖:设计测试用例,使得程序中每条语句至少被执行一次
语句覆盖率 = 被执行过的语句数量/可执行的语句总数
可以选择一下测试用例
x | y | 路径 | |
1 | 50 | 35 | 1 2 |
2 | 100 | 55 | 1 3 4 |
3 | 100 | 100 | 1 3 5 |
优点:语句覆盖的测试方法可以很直观地从源代码得到测试用例,无须细分每条判定表达式。
缺点:由于这种测试方法仅仅针对程序逻辑中显式存在的语句,但对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。如果在上面的图中去掉(2)那么就少 了一条测试路径。在if结构中若源代码没有给出else后面的执行分支,那么语句覆盖测试就不会考虑这种情况。
2.判定覆盖
判断覆盖:也叫分支覆盖,设计测试用例,使得程序中的每个判断的”真“和”假“都至少被执行一次
判断覆盖率 = 每个判定的真假值至少出现一次/判断结果的总数
可以选择一下用例(和上面一样hhh)
x | y | 路径 | |
1 | 50 | 35 | 1 2 |
2 | 100 | 55 | 1 3 4 |
3 | 100 | 100 | 1 3 5 |
优点:判定覆盖具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。
缺点:往往大部分的判定语句是由多个逻辑条件组合而成(如:判定语句中包含AND、 OR、CASE)。若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。比如在我自己写的这个例子这种的条件中有很多逻辑运算,判定覆盖只在乎这个判断整体的对错要选择哪一个分支继续执行,而不在乎逻辑运算的元素的真假
3.条件覆盖
条件覆盖:设计测试用例,使得判定中的每个条件至少有一次取真值,有一次取假值
条件覆盖率 = 每个条件的真价值至少出现一次/条件结果的总数(条件结果 = 判断数 * 条件数)
可以采用以下用例:
x | y | 路径 | |
1 | 50 | 80 | 1 2(假真) |
2 | 100 | 30 | 1 2(真假) |
3 | 100 | 46 | 1 3 4(真;假真) |
4 | 100 | 65 | 1 3 5(真;真假) |
优点:条件覆盖比判定覆盖,增加了对符合判定情况的测试,增加了测试路径。
缺点:要达到条件覆盖,需要足够多的测试用例,但条件覆盖并不能保证判定覆盖。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。
4.判定条件覆盖
判定条件覆盖:设计测试用例,使得被测程序中的每个判断本身的判定结果(真假)至少满足一次,每个逻辑条件的可能值也至少被满足一次。就是既满足判断覆盖,也满足条件覆盖。
判断条件覆盖率 =每个判断真假值和条件真假值至少出现一次/(判断结果的总数 + 条件结果的总数)
x | y | 路径 | |
1 | 50 | 80 | 1 2(假真) |
2 | 100 | 30 | 1 2(真假) |
3 | 100 | 46 | 1 3 4(真;假真) |
4 | 100 | 55 | 1 3 5(真;真假) |
优点:判定/条件覆盖满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。
缺点:判定/条件覆盖准则的缺点是未考虑条件的组合情况。
5.条件组合覆盖
条件组合覆盖:设计测试用例,使得被测程序中的每个判定中条件结果的所有可能组合至少执行一次
条件组合覆盖率 = 条件组合至少出现一次的数量/条件组合的总数
可以考虑以下测试用例:
x | y | 路径 | |
1 | 50 | 35 | 1 2(假假+--) |
2 | 100 | 50 | 1 2(真假+--) |
3 | 50 | 100 | 1 2(假真+--) |
4 | 100 | 46 | 1 3 4(真真+假真) |
5 | 100 | 55 | 1 3 5(真真+真真) |
6 | 80 | 70 | 1 3 4(真真+假假) |
优点:多重条件覆盖准则满足判定覆盖、条件覆盖和判定/条件覆盖准则。更改的判定/条件覆盖要求设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次。每个判定本身的所有可能结果也至少出现一次,并且每个条件都显示能单独影响判定结呆。
缺点:线性地增加了测试用例的数量。
6.路径覆盖
路径覆盖:设计测试用例,覆盖程序中所有可能的路径
路径覆盖率 = 至少被执行过一次的路径数/总的路径数
这是我认为的符合路径覆盖的测试用例,但是我没有get到为什么说他是覆盖面最广的,可能是我写的例子不太好,后续我在琢磨一下再补充……
x | y | 路径 | |
1 | 50 | 35 | 1 2 |
2 | 100 | 50 | 1 3 4 |
3 | 100 | 100 | 1 3 5 |
优点:这种测试方法可以对程序进行彻底的测试,比前面五种的覆盖面都广。
缺点:由于路径覆盖需要对所有可能的路径进行测试(包括循环,条件组合.分支 选择等).那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长。而在有些情况下,一些执行路是不可能被执行的
测试步骤
- 测试计划阶段:根据需求说明书,制定测试进度;
- 测试设计阶段:依据程序设计说明书,按照一定规范化的方法进行软件结构划分和设计测试用例;
- 测试执行阶段:输入测试用例,得到测试结果;
- 测试总结阶段:对比测试的结果和代码的预期结果,分析错误原因,找到并解决错误。
文末致谢: