改进的判定条件覆盖讲解和真值表书写
即Modified Condition/Decision Coverage,缩写为MC/DC。
其中判定是指决定if或者循环语句是否执行的那个逻辑表达式。
基本思路。逻辑与表达式测试所有条件为真的情况,然后分别测试每个条件为假,其他条件都为真的情况。逻辑或表达式测试所有条件为假的情况,然后分别测试每个条件为真,其他条件为假的情况。
MC/DC效果和多重条件覆盖效力相同,但是用例数显著减少。
有n个条件的逻辑表达式时,多重条件覆盖需要2的n次方个用例,MC/DC覆盖只需要n+1个测试用例。
对于每一个原子条件X,至少在一个测试中,判定结果会随着原子条件X是否为真而改变;同时,至少在一个测试中,判定结果会随着原子条件X是否为假而改变。原子条件X是这种组合中的关键因素,这个时候可以说原子条件X是有效为真或者有效为假。
例1:
(condition1 && condition2) || (condition3 && condition4)
多重条件覆盖需要16个测试用例。
MC/DC分析:
第一层
condition1 && condition2和condition3 && condition4都为假。
只有Condition1 && condition2 为真。
只有Condition3 && condition4为真。
总共3种情况
第二层
condition1 && condition2为真时,只有condition1和condition2都为真这一种情况。不用增加用例。
condition1 && condition2为假时,需要覆盖只有condition1为假和只有condition2为假两种情况。condition1 && condition2作为关键因素为假的情况在第一层中只有一种。所以要增加1个用例。
condition3 && condition4道理相同,需要增加1个用例。
所以总共就只需要5个测试用例。
例2:
(condition1 || condition2) && (condition3 || condition4)
多重条件覆盖需要16个测试用例。
MC/DC分析:
第一层
condition1 || condition2和condition3 || condition4都为真。
只有condition1 || condition2为假。
只有condition3 || condition4为假。
三种情况。
第二层
condition1 || condition2为假时,只有condition1和condition2都为假这一种情况。不用增加用例。
condition1 || condition2为真时,需要分别覆盖只有condition1为真和只有condition2为真两种情况。condition1 || condition2作为关键因素为真的情况,第一层中只有一种,所以要增加一个用例。
condition3 || condition4同理,需要增加1个用例。
所以总共就只需要5个测试用例。
实际中的复杂例子:
Quagga0.9.18 BGP_route.c line 2200 bgp_update_main()中
(afi == AFI_IP || afi == AFI_IP6) && safi == SAFI_UNICAST
&& (peer_sort (peer) == BGP_PEER_IBGP || peer_sort (peer) == BGP_PEER_CONFED
|| (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
|| CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
条件为真时检查下一跳的可达性。
总共有8个原子条件。多重条件覆盖需要256个测试用例。
逻辑表达式分析:
第一层是逻辑与。三个子表达式依次称为part1、part2、part3。
part1的两个子表达式依次称为part11、part12
part3又分为两层。其中第一层逻辑或表达式的四个子表达式依次称为part31、part32、part33、part34。part33下面又有一层逻辑与表达式,两个子表达式依次称为part331、part332。
所以上面的逻辑表达式符号化为:
(part11 || part12) && part2 && (part31 || part32 || (part331 && part332) || part34)
MC/DC分析:
第一层:
part1、part2、part3都为真。
part1、part2、part3依次为假,其它条件为真。
这是4个用例。
第二层:
part1为假时,只有part11、part12都为假这一种情况,不用增加用例。
part1为真时,要测试只有part11为真和只有part12为真两种情况,第一层中part1有效为真只有1个用例,所以需要增加1个用例。
part3为假时,只有part31、part32、part33、part34都为假这一种情况,不用增加测试用例。
part3为真时,要测试part31为真、或者part32为真、或者part33为真、或者part34为真,其它都为假,这四种情况。第一层中part3作为关键因素为为真的情况,只有一种。所以要增加3个用例。
第三层:
part33为真时,只有part331和part332一种情况。不用增加用例。
part33为假时,需要测试只有part331为假和只有part332为假两种情况。第二层的用例中part33作为关键因素为假情况,只有一种。所以需要增加1个用例。
所以至多9个测试用例。
从上面的分析来看,即使是比较复杂的表达式,要满足更改的判定条件覆盖,案例数也是非常有限的。
规律:每多出一个part。外层就需要增加一个测试用例。如果这个part需要拆分。子层需要n+1个用例。因为子层能且只能和part合并一种真的情况和一种假的情况。所以要增加1+(n+1)-2=n个用例。比如多出一个有3个条件组成的part。则需要增加3个用例。
所以不管逻辑表达式如何嵌套,用例总数总是等于条件数+1。
列出上面最后一个例子的真值表
首先列出所有简单逻辑表达式的真值表。然后用内层真值表中的列替换外层的真值表中相应的关键因素,达到合并的效果。注意,非关键因为不能替换。内层未能替换合并的列,扩展外层关键因素。
对于非关键因素的part进行合并。使表更易读。执行用例时尽量使用不同的组合。
表中:灰色表示非关键因素。为了方便读者跟踪变换过程,我尽量保持列的位置不变。
第一步:分别列出所有part分别满足MC/MD时的真值表 |
|||||||||||||||
part11 |
|
|
|
|
|
|
|
|
F |
T |
F |
T |
F |
T |
T |
part12 |
|
|
|
|
|
|
|
|
F |
F |
T |
||||
part2 |
|
|
|
|
|
|
|
|
|
|
|
T |
T |
F |
T |
part31 |
|
|
|
F |
T |
F |
F |
F |
|
|
|
T |
T |
T |
F |
part32 |
|
|
|
F |
F |
T |
F |
F |
|
|
|
||||
part331 |
T |
F |
T |
F |
F |
F |
T |
F |
|
|
|
||||
part332 |
T |
T |
F |
|
|
|
|||||||||
part34 |
|
|
|
F |
F |
F |
F |
T |
|
|
|
||||
result |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
第二步:将part33合并进part3,将part1合并进最外层后 |
|||||||||||||||
part11 |
|
|
|
|
|
|
|
|
|
|
F |
T |
F |
T |
T |
part12 |
|
|
|
|
|
|
|
|
|
|
T |
F |
F |
||
part2 |
|
|
|
|
|
|
|
|
|
|
T |
T |
T |
F |
T |
part31 |
|
|
F |
F |
T |
F |
F |
F |
|
|
T |
T |
T |
T |
F |
part32 |
|
|
F |
F |
F |
T |
F |
F |
|
|
|||||
part331 |
|
|
T |
F |
F |
F |
T |
F |
|
|
|||||
part332 |
|
|
F |
T |
T |
|
|
||||||||
part34 |
|
|
F |
F |
F |
F |
F |
T |
|
|
|||||
result |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
第三步:将part3合并进最外层,得到最终的真值表。 |
|||||||||||||||
part11 |
|
|
|
T |
|
|
T |
T |
|
|
F |
T |
F |
T |
T |
part12 |
|
|
|
|
|
|
|
T |
F |
F |
|||||
part2 |
|
|
|
T |
|
|
T |
T |
|
|
T |
T |
T |
F |
T |
part31 |
|
|
|
F |
|
|
F |
F |
|
|
T |
F |
T |
T |
F |
part32 |
|
|
|
F |
|
|
F |
F |
|
|
F |
T |
F |
||
part331 |
|
|
|
F |
|
|
T |
F |
|
|
F |
F |
T |
||
part332 |
|
|
|
T |
|
|
T |
|
|
F |
|||||
part34 |
|
|
|
F |
|
|
F |
T |
|
|
F |
F |
F |
||
result |
|
|
|
F |
|
|
T |
T |
|
|
T |
T |
F |
F |
F |
列出真值表后,发现可以合并成8种情况。比上面分析的结果,还少了一种。因为存在一处3重合并(从右边数第四列)。而上面分析时,只考虑了两重合并。
改进的判定条件覆盖讲解和真值表书写相关推荐
- 详解软件测试中白盒测试基本概念及四种白盒测试方法以及六种逻辑覆盖法(语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖)
在这篇文章中,我们将讲解白盒测试的基本概念,以及四大常用的白盒测试方法. 一.白盒测试基本概念 1.白盒测试的定义 白盒测试又称为结构测试或逻辑驱动测试,它是把测试对象看成一个透明的盒子,它允许测试人 ...
- 逻辑覆盖测试(四)判定/条件覆盖
判定/条件覆盖:测试用例的设计应满足判定节点的取真和取假分支至少执行一次,且每个简单判定条件的取真和取假情况也至少执行一次. 简单来说,就是判定覆盖和条件覆盖取交集. 例子: 流程图: 当判定覆盖和条 ...
- 第三次软工作业——实现最大字段和算法并进行判定条件覆盖
第三次软工作业 实现最大子段和的算法并进行条件组合覆盖测试 (一)什么是最大子段和? 我自己的理解: 一个数组可以若干个子数组,包含自身.每一个字数组都有一个数组元素之和,求这些和之间的最大值. 最朴 ...
- 软件测试课堂笔记之语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,在eclipse上新建测试用例
根据测试覆盖目标的不同,以及覆盖源程序的详尽程度分析由高到低排序,逻辑测试可依次分为:语句覆盖:设计测试用例时应保证程序中的每一条可执行语句至少执行一次.它以程序中的每条可执行语句是否都执行到为测试终 ...
- 判定的测试,语句覆盖,判定覆盖,条件覆盖,判定条件覆盖,组合覆盖,修正的判定条件覆盖
下面只是个人理解,可能有不准确之处! 1 语句覆盖 2 判定覆盖(分支覆盖) 3 条件覆盖 4 判定/条件覆盖 5 组合覆盖 6 修正的判定/条件覆盖 1 语句覆盖 每个可执行语句都走一遍,即测试用例 ...
- 设计测试用例实现语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,条件组合覆盖,路径覆盖.
第一题: 设计测试用例实现语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,条件组合覆盖,路径覆盖. [1]语句覆盖(设计若干个测试用例,使程序中的每个可执行语句至少执行一次) (x>3)& ...
- python多个条件组合覆盖_白盒测试 语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖...
·昂贵 ·无法检测代码中遗漏的路径和数据敏感性错误 ·不验证规格的正确性 六种覆盖方法 首先为了下文的举例描述方便,这里先给出一张程序流程图.(本文以1995年软件设计师考试的一道考试题目为例,图中红 ...
- 修正的判定条件覆盖例题_硬核:嵌入式代码覆盖率统计方法和经验
代码覆盖率是衡量软件测试完成情况的指标,通常基于测试过程中已检查的程序源代码比例计算得出.代码覆盖率可以有效避免包含未测试代码的程序被发布. 1. 问题背景 代码覆盖(Code coverage)是软 ...
- python调用程序call_call在Python中改进数列的实例讲解
我们都有过函数调用的经历,那么call调用类实例的过程就跟函数很相似.类的用法很多人都知道了,类实例又是什么呢?可以把类看成一个设计图,类实例就是设计出的成品.现在我们弄清楚了call调用对象的概念, ...
最新文章
- com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
- oracle合并查询
- SQL的top 100 percent用法
- php 正则图片相对路径替换成绝对路径_相对路径的优缺点
- 【PAT甲级 素数判断 进制转换】1015 Reversible Primes (20 分) Java版 4/4通过
- 爱的十个秘密--2.思想的力量
- 非阻塞模式(ioctlsocket)
- 解析OA技术,规避使用风险
- DDD实战成绩管理---用户故事
- IoT:MQTT协议详解
- 大数据平台由哪些分析功能
- iis6xp_xp安装iis6步骤方法
- DS18B20温度传感器学习笔记
- 计算机经常无法打印机,电脑打印机无法打印怎么办
- 惠普服务器文档,惠普服务器详细整理参数
- 【C语言】计算一元二次方程的解
- Java json字符串转json对象
- 中国自动化学科发展及控制界名人简介
- 多少秒算长镜头_长镜头的作用
- appium 报错:Original error:Could not proxy command to remote server. Original error:socket hang up