《软件测试》第三章 白盒测试技术
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
法
路径测试、符号测试、逻辑驱动
覆盖、循环测试、数据流测试等 方法。
采用白盒测试方法必须遵循以下几条原则,才能达到测试目的。
(1)保证一个模块中的所有独立路径至少被测试一次。
(2)所有逻辑值均需测试真(true)和假(false)两 个分支。
(3)检查程序的内部数据结构,保证其结构的有效性。 (4)在上下边界及可操作范围内运行所有循环。
7.路径覆盖
路径覆盖:定义
路径覆盖是指设计足够过的测试用例,使得 程序中所有可能的路径都至少被执行一次即是覆 盖程序中的所有路径。
以一段简单的C语言代码为例讨论 图3-1所示为一个被测模块流程图
测试用例设计:为了实现TestExample 函数的判定覆盖,需要设计两个测试用例就 可以使得程序中每个判定节点的取真分支和 取假分支至少执行一次。根据分析得到测试 用例如表所示。
从本例来看要满足条件覆盖,就是 要使得基本逻辑判定条件T1~T4的取真和 取假分支至少执行一次。这4个条件的所有 取值情况如表3-3所示。
图3-1 函数TestExample的流程图
根据条件覆盖的基本思想,要使上述4个条件可能产
生的每种情况至少满足一次,设计测试用例如下表
所示。
分析:上面表中的TE-004和TE-005不 但覆盖了4个条件可能产生的8种情况, 而且将两个判定的4个分支b、c、d、e 也同时覆盖了,即同时达到了条件覆盖 和判定覆盖。但是,并不能说满足条件 覆盖就一定能满足判定覆盖。例如表中 TE-006 和TE-007,则虽然满足了条件 覆盖,但只是覆盖了程序中第一个判定 的取假分支c和第二个判定的取真分支d, 不满足判定覆盖要求。
测试用例设计:为了实现TestExample 函数的判定覆盖,需要设计两个测试用例就 可以使得程序中每个判定节点的取真分支和 取假分支至少执行一次。根据分析得到测试 用例如表所示。
图3-1 函数TestExample的流程图
分析:上述两个测试用例不仅满足了判定覆 盖,同时还做到了语句覆盖。从这点看似乎 判定覆盖比语句覆盖更强一些,但仍然无法 确定判定内部条件的错误。例如吧第二个判 定中的条件y>5错误写成y<5,使用上述用 例,照样能能按原来路径执行而不影响结果, 因此,需要有更强的逻辑覆盖准则去检验判 定内的条件。
判定覆盖:测试分析
1. 比语句覆盖增加了几乎一倍的测试路径,测试 能力更强。
2. 未深入测试复合判定表达式的细节,仍存在测 试漏洞。
3.条件覆盖
条件覆盖:定义
设计测试用例时应保证程序中每个复合判定 表达式中,每个简单判定条件的取真和取假情况 至少执行一次。
条件覆盖率
条件覆盖率 = 条件操作数值至少被评价一次 的数量 / 条件操作数值的总数
分析:语句覆盖可以保证程序中每个语句 都得到执行,但发现不了判定中逻辑运算 的错误,即它并不是一种充分的检验方法。 例如,在第1个判定条((x>3)&&(z<10)) 中如果把“&&”错误的写成“||”,这 是仍然使用该测试用例,则程序仍会按照 流程图上的路径abd执行。可以说语句覆 盖时最弱的逻辑覆盖准则。
语句覆盖:测试分析
1. 是最弱的覆盖指标 2. 关注语句而非判定节点 3. 对隐式分支无效
2.判定覆盖
判定覆盖:定义
设计测试用例时应保证程序中每个判定节点的取 真和取假分支至少执行一次。
判定覆盖率
判定覆盖率 = 判定结果被评价的次数 / 判定结果 的总数
以一段简单的C语言代码为例讨论 图3-1所示为一个被测模块流程图
对穷举测试唯一可行的代替方法。
所谓逻辑覆盖是对一系列测试过程的
、
总称,这组测试过程逐渐进行越来越完整
。
的通路测试。
根据测试覆盖目标的不同,以及覆盖源程序的详尽程度 分析由高到低排序,逻辑测试可依次分为:
● 语句覆盖(Statement Coverage,SC); ● 判定覆盖(Decision Coverage,DC); ● 条件覆盖(Condition Coverage,CC); ● 判定/条件覆盖(Decision/Condition Coverage ,D/CC); ● 修正的判定/条件覆盖(Modified Decision/Con dition Coverage,MD/CC); ● 条件组合覆盖(Condition Combination Covera ge,CCC);
在白盒测试中,通常会用覆盖率来度量测试的完整性。 测试覆盖率是程序被一组测试用例执行到的百分比。
(至少被执行一次的被测试项数)
覆盖率=
被测试项总数
3.2.1 逻辑覆盖法
逻辑覆盖是白盒测试中以程序内部的逻辑结构为 基础的设计测试用例的技术。因为不可能进行穷尽的 测试,有选择的执行程序中某些最具代表性的通路是
2020-08-05
‹#›
3.2 白盒测试的方法
白盒测试通常可分为静态和动态两种类 型,包含了很多常用的测试方法。
静态分析:静态方法是指按
白
一定步骤直接检查源代码或代
盒
码的测试方法,包括代码审查、 桌面检查、代码走查等方法。
测
试
的
动态测试:动态测试是指按一
方
定步骤生成测试用例并驱动被测 程序运行来发现错误,包括基本
以一段简单的C语言代码为例讨论 图3-1所示为一个被测模块流程图
测试用例设计:对TestExample函数的 条件覆盖测试时,为了便于说明条件覆盖的 覆盖指标,对代码中各个判定的各种条件进 行如下标记:
对于第一个判定(x>3&&z<10): T1:x>3 T2:z<10 对于第二个判定(x==4||y>5): T3:x==4 T4:y>5 各条件取真时记做“T”取假时记做“F”。
● 路径覆盖(Path Coverage,PC)。
1.语句覆盖
语句覆盖:定义
设计测试用例时应保证程序的每一条可执行语句 至少执行一次。它以程序中每条可执行语句是否
都执行到为测试终止的标准。
语句覆盖率
语句覆盖率 = 至少被执行一次的语句数量 / 可执 行的语句总数
为了便于说明语句覆盖法,这里以 一段简单的C语言代码为例讨论, 图3-1所示为一个被测模块流程图
静态分析
白盒测试类型
动态测试
2020-08-05
代码审查 桌面检查 代码走查等
基本路径测试 符号测试
逻辑驱动覆盖 循环测试
数据流测试等
‹#›
白盒测试方法必须遵循原则
• (1)保证一个模块中的所有独立路径至少被测试一次。 • (2)所有逻辑值均需测试真(true)和假(false)两
个分支。 • (3)检查程序的内部数据结构,保证其结构的有效性。 • (4)在上下边界及可操作范围内运行所有循环。
测试用例设计:为了实现TestExample 函数的语句覆盖,程序实行的路径应该是 abc,只需要设计一个测试用例就可以覆盖 程序中的所有可执行语句。根据分析得到测 试用例如表3-1所示。
ID 输 入 预期输入
xyz j k TE-001 4 5 5 12 19
通过 路径 abd
图3-1 函数TestExample的流程图
判定/条件覆盖实际上是将判定覆盖准 则和条件覆盖准则结合起来的一种方法,弥 补了二者的不足。但是没有考虑单个判定对 整体结果的影响,无法发现程序中的逻辑错 误。
5.修正的判定判定/条件覆盖
修正的判定/条件覆盖定义要求如下
(1)修正的判定/条件覆盖是要求判定(由条件和零 或者多个布尔操作符号组成的布尔表达式)中的每一 个条件(即不含布尔操作符号的布尔表达式)的所有 可能结果至少出现一次。
测试用例设计:根据两个判定的所有条件取值组合表格,每次选择表 格中的一行构成测试用例即可。如表3-10所示,TE-008到TE-011共同 满足条件组合覆盖。
表3-10 条件组合覆盖的测试用例
分析:上面这组测 试用例覆盖了所有 8种条件取值组合, 覆盖了所有判定的 真假分支,但是却 丢失了一条路径 abe。
表3-6
满足(A and B)修正的判定/条件覆盖的测试用例集合
为了加深了解,再对(A or B)进行分析。如表3 -7所示,测试用例1和3体现条件A的独立影响,测试 用例2和3体现条件B的独立影响,因此得出满足(A o r B)的修正的判定/条件覆盖的测试用例集合如表38所示。
表3-8 满足(A or B)修正的判定/条件覆盖的测试用例集合
LOGO
第三章
内容提要
A 白盒测试的基本概念 B 白盒测试的方法 C 白盒测试的流程 D 本章小结
3.1 白盒测试的基本概念
❖ 定义 白盒测试也称结构测试、逻辑驱动或基
于程序的测试,是一种测试用例设计方法,它从 程序的控制结构导出测试用例。它一般用来分析 程序的内部结构。它依赖于程序细节的严密验证 ,针对特定的条件和循环设计测试用例,对程序 的逻辑路径进行测试。通过在程序的不同点检验 程序状态,来判定其实际情况是否和预期的状态 一致。
6.条件组合覆盖
条件组合覆盖:定义
条件组合覆盖是通过执行足够多的测试用例 ,使得程序中每个判定中的所有可能的条件的取 值组合都至少被执行一次。满足条件组合覆盖准 则一定满足判定覆盖、条件覆盖和判定/条件覆盖 准则。
条件组合覆盖率
条件组合覆盖率 = 条件操作数值至少被评价 一次的数量 / 条件操作数值的所有组合总数
判定条件覆盖率
判定/条件覆盖率 = 条件操作数值或判定结果 值至少被评价一次的数量 / (条件操作数值总数 + 判定结果总数)
以一段简单的C语言代码为例讨论 图3-1所示为一个被测模块Βιβλιοθήκη Baidu程图
测试用例设计:根据判定/条件覆盖的基 本思想,只需要取前面分析得出的一组测试 用例TE-004和TE-005便可以覆盖程序中4 个条件的8种取值以及4个判定分支达到此覆 盖指标了。用例如下表所示。
条件覆盖与判定覆盖相比较,增加了 对符合判定情况的测试,增加了测试路径 。要达到条件覆盖,需要足够多的测试用 例,但条件覆盖并不能保证判定覆盖。条 件覆盖只能保证每个条件至少有一次为真 ,而不考虑所有的判定结果。
4.判定/条件覆盖
判定/条件覆盖:定义
测试用例的设计应满足判定节点的取真和取 假分支至少执行一次,且每个简单判定条件的取 真和取假情况也应至少执行一次。
(A and B)所有条件组合情况
为了体现条件A对整个表达式的独立影响,需满足当A为真时,(A and B) 为真;当A为假时,(A and B)为假,显然此时B的取值应为真,对应表3-5 中的测试用例1和3。同理,为了体现条件B对整个表达式的独立影响,A的取 值应为真,对应表中的测试用例1和2。那么,测试用例4是否是冗余的呢?从 整体表达式的结果来看,测试用例1~3完全能够满足(A and B)作为一个表 达式整体分别取到真值和假值。所以,测试用例4是冗余的。因此得出满足 (A and B)的修正的判定/条件覆盖的测试用例集合如表3-6所示。
图3-1 函数TestExample的流程图
分析:从表面上看,判定/条件覆盖测试了各个判定中的所有条件的取值, 但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的某 些条件将会被其他条件所掩盖。所以,判定/条件覆盖也不一定能够完全检 查出逻辑表达式中的错误。例如,对于第1个判定(x>3)&&(z<10) 来说,必须x>3和z<10这两个条件同时满足才能与确定该判定为真。如果 x>3为假,则编译器将不再检查z<10这个条件,那么即使这个条件有错也 无法被发现。对于第2个判定(x==4)||(y>5)来说,若条件x==4满足, 就认为该判定为真,这时将不会再检查y>5,那么同样也无法发现这个条 件中的错误。
(2)每个判定的所有结果至少出现一次。
(3)每个程序模块的入口点和出口点都至少被调用 一次,且每个条件都能单独地影响判定的结果。即在 其他条件不变的情况下改变这个条件的值,使得判定 结果改变。
测试用例分析:下面以(A and B)这个简单的表达式为例来说明其具体含义 。(A and B)的所有条件组合情况如表3-5所示。要满足判定/条件覆盖,应 该从以下4个测试用例中进行挑选。
以一段简单的C语言代码为例讨论 图3-1所示为一个被测模块流程图
为了达到条件组合覆盖指标, 需列出每个判定中的所有可能 的条件的所有取值,将其组合 列成表格。分析 TestExample1函数中两个判 (x>3&&z<10)以及 (x==4||y>5)的所有条件取 值组合如表3-9所示
图3-1 函数TestExample的流程图