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

news2024/11/24 5:48:02

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)
     {
         return33;
     }
     
     if (n == 1)
     {
         return66;
     }
     
     if (n > 1)
     {
         return func(n - 1) + func(n - 2) + func(n - 3) ;
     }
     else
     {
         return99;
     }
 }

分析:

此程序中,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))
    {
        returntrue;
    }
    
    returnfalse;
}

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

图片

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

  • 首先需要先进行条件组合,本例中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.coloradmin.cn/o/1431799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaEE spring】SpringBoot 统一功能处理

SpringBoot 统一功能处理 1. 拦截器1.1 拦截器快速⼊⻔1.2 拦截器详解1.2.1 拦截路径1.2.2 拦截器执⾏流程 1.3 登录校验1.3.1 定义拦截器1.3.2 注册配置拦截器 2. 统⼀数据返回格式2.1 快速⼊⻔2.2 存在问题2.3 案例代码修改2.4 优点 3. 统⼀异常处理 1. 拦截器 后端程序根据…

浅谈——开源软件的影响力

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨特色专栏&#xff1a…

立式台灯什么牌子好?立式护眼台灯品牌推荐

经常关灯看小说、凌晨加班的朋友都知道&#xff0c;眼睛很容易出现红血丝酸痛的症状&#xff0c;也有一些学生朋友夜间学习导致眼睛视力模糊。 这一系列的情况归根到底都来源于光线&#xff0c;不良的光线会不断给眼睛造成压力&#xff0c;久而久之出现用眼疲劳引起近视的风险…

C#入门详解_01_课程简介、C#语言简介、开发环境和学习资料的准备

文章目录 1. 课程简介2. C#语言简介3.开发环境与学习资料 1. 课程简介 开设本课程的目的 传播C#开发的知识&#xff0c;让更多的人有机会接触到软件开发行业引导有兴趣或者想转行的朋友进入软件开发行业 课程内容 完整讲述C#语言在实际软件开发中的应用采用知识讲述加实例程序…

Easy Excel导出一个表格多个Sheet

步骤&#xff1a; 1.查找官方API文档理解实现 2.实现融入到代码里面 一&#xff1a;Easy Excel重复多次写入(写到单个或者多个Sheet) 重复多次写入(写到单个或者多个Sheet) 理解重点&#xff1a; // 每次都要创建writeSheet 这里注意必须指定sheetNo 第几个sheetNo 而且sh…

WPF图表库LiveChart异常问题处理-System.ArgumentOutOfRangeException:指定的参数超出了有效值的范围

问题&#xff1a; 在使用liveChart处理一个以时间为X轴的曲线时&#xff0c;遇到一个报错&#xff1a;指定的参数超出了有效值的范围System.ArgumentOutOfRangeException:“Specified argument was out of the range of valid values. Arg_ParamName_Name” 指定的参数超出了有…

PAT-Apat甲级题1007(python和c++实现)

PTA | 1007 Maximum Subsequence Sum 1007 Maximum Subsequence Sum 作者 CHEN, Yue 单位 浙江大学 Given a sequence of K integers { N1​, N2​, ..., NK​ }. A continuous subsequence is defined to be { Ni​, Ni1​, ..., Nj​ } where 1≤i≤j≤K. The Maximum Su…

Empowering Multimodal LLMs with Foresight Minds(Merlin)论文精读

paper&#xff1a;https://arxiv.org/pdf/2312.00589.pdfcode&#xff1a;https://ahnsun.github.io/merlin/ 0 Abstract 根据观测预测未知是人类的一个能力&#xff0c;对MLLM进行“future modeling”可以更好地激发其潜能&#xff1b;物体轨迹是一种连续帧间高度结构化的表…

计算机毕业设计 | vue+springboot 教务管理系统(附源码)

1&#xff0c;项目背景 随着我国高等教育的发展&#xff0c;数字化校园将成为一种必然的趋势&#xff0c;国内高校迫切需要提高教育工作的质量与效率&#xff0c;学生成绩管理工作是高校信息管理工作的重要组成部分&#xff0c;与国外高校不同&#xff0c;他们一般具有较大规模…

c#矩阵行列式计算//线程同步

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 实现矩阵行列式计算 {internal class Program{static void Main(string[] args){//定义矩阵Console.WriteLine("矩阵是&#xff1a;&quo…

ICV报告:最新排名!北京下降至第三位

2日&#xff0c;面向前沿科技领域的全球咨询机构ICV发布了《GFII-2023 报告》&#xff0c;其中在“2023年全球产业未来评估:未来20个城市”排名中显示&#xff0c;北京排名居世界第三。进入前十名的其他未来产业城市分别是旧金山-圣何塞、伦敦、慕尼黑、波士顿、纽约、东京横滨…

自然语言开发AI应用,利用云雀大模型打造自己的专属AI机器人

如今&#xff0c;大模型层出不穷&#xff0c;这为自然语言处理、计算机视觉、语音识别和其他领域的人工智能任务带来了重大的突破和进展。大模型通常指那些参数量庞大、层数深、拥有巨大的计算能力和数据训练集的模型。 但不能不承认的是&#xff0c;普通人使用大模型还是有一定…

前端工程化之:webpack2-2(内置插件)

目录 一、内置插件 1.DefinePlugin 2.BannerPlugin 3.ProvidePlugin 一、内置插件 所有的 webpack 内置插件都作为 webpack 的静态属性存在的&#xff0c;使用下面的方式即可创建一个插件对象&#xff1a; const webpack require("webpack")new webpack.插件…

【JVM调优及常见的JVM调优参数以及作用】

JVM调优及常见的JVM调优参数以及作用 JVM调优通常涉及以下几个方面&#xff1a;1. 堆内存调优&#xff1a;2. 垃圾回收调优&#xff1a;3. 线程调优&#xff1a;4. 类加载调优&#xff1a;JVM的优化配置可以通过设置JVM的启动参数来实现。以下是一些常用的JVM优化配置参数及其示…

steam搬砖项目赚钱吗?操作流程看这一篇就够了

很多人应该听说过steam&#xff0c;它是国外一款知名的游戏社交平台&#xff0c;也是目前世界上最大的游戏平台之一。而steam搬砖项目&#xff0c;关键就是靠信息差。我们要做的就是在steam以低价买入道具装备&#xff0c;然后上架到网易buff卖出&#xff0c;赚取差价。 什么人…

新年心愿清单怎么写 用这个软件列心愿清单更方便

新年的钟声在耳畔回荡&#xff0c;我站在窗前&#xff0c;看着外面熙熙攘攘的人群&#xff0c;心中充满了期待。新的一年&#xff0c;新的开始&#xff0c;我有很多心愿想要实现。于是&#xff0c;我决定写下一份心愿清单&#xff0c;给来年定下奋斗的方向。 但是&#xff0c;…

React实例之完善布局菜单(一)

今天我们来用所学的知识来做一个布局菜单的组件, 针对这个组件我之前写过一个教程 React之布局菜单-CSDN博客&#xff0c;那个呢比较基础&#xff0c;这节课算是对那个教程的一个扩展和补充。这个实例讲完&#xff0c;这个系列就算告一段落了。先看效果 这个教程要求对React知识…

uniapp使用u-popup组件弹窗出现页面还可滑动

*1、问题所在&#xff1a; 弹窗遮罩层出现了页面依旧可以上下滑动 2、要求: 为了用户更好交互体验&#xff0c;弹窗出现后应禁止页面往下滑动 3、实现思路&#xff1a; 在弹窗盒子外层添加个阻止触摸冒泡事件&#xff0c;使用touchmove.stop.prevent 4、代码如下&#xff…

Android简单支持项目符号的EditText

一、背景及样式效果 因项目需要&#xff0c;需要文本编辑时&#xff0c;支持项目符号&#xff08;无序列表&#xff09;尝试了BulletSpan&#xff0c;但不是很理想&#xff0c;并且考虑到影响老版本回显等因素&#xff0c;最终决定自定义一个BulletEditText。 先看效果&…

【深度学习】讲透深度学习第3篇:TensorFlow张量操作(代码文档已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归&#xff08;含代码&#xff09;&#xff0c;熟练掌握numpy,pandas,sklearn等框架使用。在算法上&#xff0c;掌握神经网络的数学原理&#xff0c;手动实…