嵌入式基础知识-逻辑覆盖测试用例设计

上篇文章,介绍了软件测试相关的基础概念,其中白盒测试中的逻辑覆盖率知识点比较复杂,本篇通过实例来讲解各种覆盖率的测试用例该如何设计。

1 基础示例

1.1 例题一

有如下程序,设计分别满足语句覆盖分支覆盖的最有效力的测试用例。

int x = 0;
int y = 0;if (x > 0 && y > 0)
{y = y/x;
}if (x > 1 || y > 1)
{y = y + 1;
}x = x + y;

分析:

语句覆盖只需要所有的语句都被执行过即可,针对此程序,只需要使两个if语句都为true即可,例如x=2,y=0。

分支覆盖,也叫判定覆盖,只需要所有的判断都能取到所有可能的值即可,针对此程序,只需要使两个if语句各自都取到true和false即可,例如x=2,y=0(两个if都是true); x=0,y=0(两个if都是false)需要两条用例。

1.2 例题二

有如下程序,变量i取什么值能效力最高的满足判断覆盖?

void main()
{int i = 0;int sum = 0;scanf("%d", &i);while(i <= 10){sum += i;i++;}printf("%d\n", sum);
}

分析:

此程序中,while语句是路径分支。效力最高的满足判断覆盖,即在最小的循环执行次数下,判断可以取到true和false。因此,取i=10,满足true,下一轮循环i变为了11,满足false。

1.3 例题三

有如下程序,满足判定覆盖至少需要几条测试用例?

 int func(int n){if (n == 0){return 33;}if (n == 1){return 66;}if (n > 1){return func(n - 1) + func(n - 2) + func(n - 3) ;}else{return 99;}}

分析:

此程序中,2个if和1个if-else组成了所有的判断,满足判定覆盖,即需要让所有的判定各取true和false。最简单直观的是用4条用例n=0; n=1; n=2; n=-1即可满足,注意到程序里有递归调用,实际上取n=2,会调用return func(1) + func(0) + func(-1) ;即可满足。

2 进阶示例

有如下程序,设计各种逻辑覆盖的测试用例:

int test (int x, int y)
{int ret = 0;if (x > 0 && y > 0){ret = x + y + 10; //语句块1}else{ret = x + y - 10; //语句块2}if (ret < 0){ret = 0; //语句块3}return ret; //语句块4
}

分析:根据程序,先画出流程图:

2.1 语句覆盖SC

设计满足语句覆盖(SC)的测试用例,即运行完测试用例,能将程序中每条可执行语句至少被执行一次。

本例中,就是要把语句块1~语句块4都执行一遍。

用例数据语句块1语句块2语句块3语句块4
{x=3, y=3}-abef
{x=-3, y=0}False

2.2 判定覆盖DC

设计满足判定覆盖(DC)的测试用例,即运行完测试用例,使得程序中每个判断的True和False分支至少被执行一次。

判定覆盖,也叫分支覆盖

用例数据P1(x>0&&y>0)P2(ret<0)
{x=3, y=3}TrueFalse
{x=-3, y=0}FalseTrue

2.3 条件覆盖CC

设计满足条件覆盖(CC)的测试用例,即运行完测试用例,使得程序中每个逻辑条件的可能值至少被满足一次。

用例数据C1(x>0)C2(y>0)C3(ret<0)P1(x>0&&y>0)P2(ret<0)
{x=3, y=0}TrueFalseTrueFalseTrue
{x=-3, y=15}FalseTrueFalseFalseFalse

2.4 条件判定覆盖C/DC

设计满足条件判定覆盖(C/DC)的测试用例,即运行完测试用例,使得程序中每个判断的True和False分支至少被执行一次,同时,使得程序中每个逻辑条件的可能值至少被满足一次。

用例数据C1(x>0)C2(y>0)C3(ret<0)P1(x>0&&y>0)P2(ret<0)
{x=3, y=3}TrueTrueFalseTrueFalse
{x=-3, y=0}FalseFalseTrueFalseTrue

2.5 条件组合覆盖MCC

设计满足组合覆盖(MCC)的测试用例,即运行完测试用例,使得程序中每个判断的所有可能条件取值的组合至少被满足一次。

注意几点:

  • 条件组合只针对同一个判断语句内存在多个条件的情况
  • 不同的判断语句内的条件直接无需组合
  • 对于单条件的判断语句,只需满足自己的所有取值即可
用例数据C1(x>0)C2(y>0)C3(ret<0)P1(x>0&&y>0)P2(ret<0)路径
{x=-3, y=0}FalseFalseTrueFalseTrueacdf
{x=-3, y=2}FalseTrueTrueFalseTrueacdf
{x=3, y=0}TrueFalseTrueFalseTrueacdf
{x=3, y=3}TrueTrueFalseTrueFalseabef

2.6 路径覆盖PC

设计满足路径覆盖(PC)的测试用例,即运行完测试用例,使得程序中每条路径至少被覆盖一次。

用例数据C1(x>0)C2(y>0)C3(ret<0)P1(x>0&&y>0)P2(ret<0)路径
不可能路径-----abdf
{x=0, y=2}FalseTrueTrueFalseTrueacdf
{x=3, y=5}TrueTrueTrueTrueTrueabef
{x=-10, y=30}FalseTrueFalseFalseFalseacef

3 修正的条件判定覆盖MC/DC

修正的条件判定覆盖MC/DC,这里再描述一下含义:

MC/DC要求设计适当数量的测试用例,满足以下条件:

  • 保证在一个程序中每一种输入输出至少出现一次
  • 在程序中的每一个条件必须产生所有可能的输出结果至少一次
  • 并且每个判断中的每个条件必须能独立影响一个判断的输出(即在其它条件不变的前提下,仅改变这个条件的值,而使判断结果改变)

有如下程序,若要满足修正的条件判定覆盖,最少的测试用例需要几条:

bool func(bool x, bool y, bool z)
{if (x && (y || z)){return true;}return false;
}

先画出流程图,这里给出两种画法:

对于修正的条件判定覆盖:

  • 首先需要先进行条件组合,本例中P1判定内包含3个布尔值的条件x、y、z,对其组合有8种情况
  • 然后再分别对每个条件的用例进行计算,规则为:
    • 条件Cx所在的判定内(本例即P1),除条件Cx外,其它条件的取值完全相同(例如对于C1,就是找到与x的值相反,y和z相同的用例 )
    • 判定的结果与之相反(例如对于C1,用例2和用例6的判定结果就是相反的)

按照以上规则,可以得到如下表:
在这里插入图片描述

观察表格:

  • 对于条件z,需要选用用例5和6
  • 对于条件y,需要选用用例5和7
  • 对于条件x,需要选用用例2和6,或用例3和7,或用例2和8

为了实现最少的用例能满足MC/DC,可选的用例组合为:

  • 组合1:用例2、用例5、用例6、用例7
  • 组合2:用例3、用例5、用例6、用例7

即最少需要4条用例才能满足MC/DC。

例如选择组合1,将冗余的用例去除,得到如下表:
在这里插入图片描述

再来分析一次:

  • 对于条件x,使用用例2和6来测试,y和z的值相同(y=0,z=1),P1判定结果刚好是不同值(0和1)
  • 对于条件y,使用用例5和7来测试,x和z的值相同(x=1,z=0),P1判定结果刚好是不同值(0和1)
  • 对于条件z,使用用例5和6来测试,x和y的值相同(x=1,y=0),P1判定结果刚好是不同值(0和1)

最后,再来通过在流程图上标注来对比看下,加深理解:

4 总结

本篇介绍了软件测试中,白盒测试中逻辑覆盖的各种实例情况,包括语句覆盖SC、判定覆盖DC、条件覆盖CC、条件判定覆盖C/DC、条件组合覆盖MCC、路径覆盖PC、修正的条件判定覆盖MC/DC的实例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/438496.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3使用setup-extend简化组件名写法

如果我们在Vue3中要使用setup的语法糖&#xff0c;就需要使用两个script标签&#xff0c;一个用于设置组件的name属性&#xff0c;一个用于编写setup中的代码。如下&#xff1a; 但是我们有觉得光是因为一个name属性就多写一个script标签有点麻烦了。 因此我们可以使用插件来进…

【VS Code+Verilog+Vivado使用】(2)基本设置

文章目录 2 基本设置2.1 字体大小2.2 Tab大小2.3 选中高亮2.4 文件编码 2 基本设置 2.1 字体大小 方法1&#xff1a;VS Code左下角 > 管理 > 设置&#xff0c;搜索"font size"&#xff0c;点击左侧"字体"&#xff0c;根据需要设置"editor.fon…

2024年【N1叉车司机】考试内容及N1叉车司机复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机考试内容是安全生产模拟考试一点通生成的&#xff0c;N1叉车司机证模拟考试题库是根据N1叉车司机最新版教材汇编出N1叉车司机仿真模拟考试。2024年【N1叉车司机】考试内容及N1叉车司机复审考试 1、【多选题…

扫雷游戏(C语言)

目录 一、前言&#xff1a; 二、游戏规则&#xff1a; 三、游戏前准备 四、游戏实现 1、打印菜单 2、初始化棋盘 3、打印棋盘 4、布置雷 5、排雷 五、完整代码 一、前言&#xff1a; 用C语言完成扫雷游戏对于初学者来说&#xff0c;难度并不是很大&#xff0c;而且通…

阿里云服务器价格参考,2024最新收费标准与活动价格参考

不同时期阿里云服务器的租用价格不同&#xff0c;进入2024年&#xff0c;阿里云服务器的活动价格也有所变动&#xff0c;经济型e云服务器2核2G只要99元1年&#xff0c;独享型通用算力型u1云服务器2核4G只要199元1年&#xff0c;而轻量应用服务器2核2G只要61元1年&#xff1b;2核…

指针的深入理解(一)

这一节主要复习数组指针&#xff0c;int (* )[ ] 就是数组指针类型的标志。 因为有&#xff08;&#xff09;将*括起来&#xff0c;所以&#xff08;*&#xff09;表示一个指针。[ ] 表示数组&#xff0c;所以&#xff08;*&#xff09;[ ]就表示一个指向数组的指针&#xff…

ARP 地址解析协议

目录 ARP&#xff08;Address Resolution Protocol&#xff09; 地址解析协议 ARP 的作用 ARP 高速缓存 (ARP cache) ARP 工作过程 ARP 查找 IP 地址对应的 MAC地址 ARP 高速缓存的作用 不在同一局域网的两个主机运行ARP协议 使用 ARP 的四种典型情况 为什么要使用两种…

非遗拓印为山区老人送去爱的礼物

非遗年画是中国的传统艺术&#xff0c;年画反映了中国自古以来的风俗和信仰&#xff0c;寄托着人们对未来的希望&#xff0c;2024年1月27日&#xff0c;100位志愿者齐聚大坪大融城&#xff0c;学习制作非遗年画&#xff0c;为给山区老人捐赠新年“爱的礼物”。 本次活动由大坪…

项目实现网页分享QQ空间功能

文章目录 &#x1f412;个人主页&#x1f3c5;Vue项目常用组件模板仓库&#x1f4d6;前言&#xff1a;&#x1f380;源码如下&#xff1a; &#x1f412;个人主页 &#x1f3c5;Vue项目常用组件模板仓库 &#x1f4d6;前言&#xff1a; 本篇博客主要提供“点击转发按钮&#x…

【qt】switchBtn

方法1 在qtdesigner中设置按钮图标的三个属性&#xff0c;normal off 、normal on和checkabletrue。 from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5 import uic from switchBtn import Ui_Dialogclass Test(QDialog, Ui_…

Deepin基本环境查看(七)【任务管理器和进程管理】

Deepin基本环境查看 - 目录Deepin基本环境查看&#xff08;一&#xff09;【基本信息】Deepin基本环境查看&#xff08;二&#xff09;【内存】Deepin基本环境查看&#xff08;三&#xff09;【网络信息】Deepin基本环境查看&#xff08;四&#xff09;【硬盘/分区、文件系统、…

数据脱敏实现:“想在哪脱就在哪脱,想脱谁就脱谁! ! !“

1.背景 在当下互联网高速发展的时代下&#xff0c;涉及到用户的隐私数据安全越发重要&#xff0c;一旦泄露将造成不可估量的后果。所以现在的业务系统开发中都会对用户隐私数据加密之后存储落库&#xff0c;同时还要求后端返回数据给前台之前进行数据脱敏。所谓脱敏处理其实就…