软件测试基础 - 测试覆盖率

  

一、覆盖率概念

     覆盖率是用来度量测试完整性的一个手段,是测试技术有效性的一个度量。分为:白盒覆盖、灰盒覆盖和黑盒覆盖;测试用例设计不能一味追求覆盖率,因为测试成本随覆盖率的增加而增加。

覆盖率=(至少被执行一次的item数)/item的总数

二、白盒覆盖率***

    白盒测试时基于程序结构的逻辑驱动测试,白盒覆盖中最常见的是逻辑覆盖(也叫代码覆盖或结构化覆盖),逻辑覆盖包括:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。

1.语句覆盖(Statement Coverage)

       指在测试时运行被测程序后,程序中被执行到的可执行语句的比率:

语句覆盖率=(至少被执行一次的语句数量)/(可执行的语句总数)

例:

case1:(2,0,3)   语句覆盖率=?
case2:(2,1,3)   语句覆盖率=?

分析:案例中可执行的语句总数有2条:X=X/A和X=X+1;
        case1走ace路线,2条语句都被执行了,所以语句覆盖率为2/2,即100%;
        case1走abe路线,只执行了1条语句,所以语句覆盖率为1/2,即50%;

总结:case1中语句覆盖率达到了100%,看似很完美,但是并不能百分百的发现bug,若上例中两个被测程序段逻辑有问题,条件语句写成:

会发现语句覆盖率依然为100%,但是发现不了逻辑运算中出现的错误;即使语句覆盖率达到百分百也有缺陷发现不了,所以覆盖率只是我们度量的手段。

2.判定覆盖率(Decision Coverage)

判定覆盖,也叫分支覆盖(Branch Coverage),是指在测试时运行被测试程序后,程序中所有判断语句的取真和取假分支被执行到的比率:

判定覆盖率=(判定结果被评价的次数)/(判定结果的总数)

例:

case1:(2,0,3)   判定覆盖率=?
case2:(1,0,1)   判定覆盖率=?

分析:案例中判断语句的取真和取假分支共有4个:T1\F1\T2\F2

 case1走T1-T2路线,2个判断分支被执行,所以判定覆盖率为2/4,即50%;
 case1走F1-F2路线,2个判断分支被执行,所以判定覆盖率为2/4,即50%;

总结:case1和case2加起来刚好可以达到判定覆盖率100%,但是同样地,依然会有缺陷发现不了,例如将源程序改为:

3.条件覆盖(Condition Coverage)

    指在测试时运行被测程序后,所有判断语句中每个条件的可能取值(真值和假值)出现过的比率:

条件覆盖率=(条件操作数值至少被评价一次的数量)/(条件操作数值的总数)

分析:案例中有两条判断语句,每个语句有两个条件,即4个条件,每个条件有两个取值,所以条件操作数值的总数为8个,测试用例如下:

总结: 每个case的覆盖率为4/8,50%,三个用例加起来刚好实现条件覆盖率100%。但是下面两条用例也可以实现100%覆盖,但是却没有覆盖所有分支,所以说条件覆盖也会有缺陷发现不了。

4.判定-条件覆盖(Decision Condition Coverage)

      是指设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断本身的所有可能判断结果至少执行一次,也即要求各个判断的所有可能的条件取值组合至少执行一次,也叫分支条件覆盖;实际上就是判定覆盖率和条件覆盖率的组合。

 判定条件覆盖率=(条件操作数值或判定结果至少被评价一次的数量)/(条件操作数值总数+判定结果总数)

分析:从表面上看,判定条件覆盖测试了所有的条件的取值,但是事实并非如此。因为往往某些条件掩盖了另一些条件,对于条件表达式(A>1)and(B=0)来说,若(A>1)的测试结果为真,则还要测试(B=0),才能决定表达式的值;而若条件表达式(A>1)的测试结过果为假时,可以立刻确定表达式的结果为假。这是,往往不再测试条件表达式(B=0)的取值了,这样的话条件B就没有检查,对于(A=2)or(X>1)来说也是同样的道理。因此,词用判定-条件覆盖,逻辑表达式中的错误不一定能够查出来。

总结: 为了能够防止某些条件掩盖另一些条件,必须将逻辑表达式分解为单个条件,转换成如下图所示的单一条件的嵌套条件结构,这样可以针对每一条件和判定设计测试用例,防止测试中队某些条件的侧漏。

5.条件组合覆盖(Multiple Condition Coverage)

    基本思想是,设计足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。

条件组合覆盖率=(条件组合至少被评价一次的数量)/(条件组合总数)

分析:每个判定中条件的各种可能组合如下,条件组合总数为8中。

总结:上面测试用例达到了100%的条件组合覆盖,但是它所走的路径只有3条,没有达到100%的路径覆盖,所以条件组合覆盖也不是十全十美的。

6.路径覆盖 (Path Coverage)

      指在测试时运行被测程序后,程序中所有可能的路径被执行过的比率:

路径覆盖率=(至少被执行一次的路径数)/(总的路径数)

分析:案例中总的路径为4条,分别为ace,abd,abc,acd,下面4条例子实现了100%的路径覆盖。

case1:(2,0,3) 覆盖路径ace
case2:(1,0,1) 覆盖路径abd
case3:(1,0,3) 覆盖路径abc
case4:(3,0,1) 覆盖路径acd

总结:对于这组测试用例,路径覆盖达到了100%,但是很明显没有达到100%条件覆盖(B!=0未取到) ,所以说路径覆盖也不是零缺陷的,进一步说明了覆盖率只是我们度量的手段。

7.其他覆盖

a.指令块覆盖(Instruction Blocks Coverage,IB Coverage)

    是语句覆盖的一个变体,其唯一的区别是计算方式的不同,在这里指令块表示函数内部的一个序列语句,在这一个序列语句中不存在控制语句(会引起分支)

指令块覆盖=(至少被执行一次的指令块数量)/(系统中指令块总数)

例:一次测试中,在第一个控制点走了3条指令的分支,在第二个控制点走了空指令分支,那么其指令块覆盖式2/4,即50%;其语句覆盖式(5+3)/15,即53.33%;

b.判定路径覆盖(Decision-to-Decision paths Coverage,DDP Coverage)

      是判定覆盖的一个变体,这里的判定指的是一个序列语句,其起始位置是函数入口或一个判定(如If,while,switch等)的开始,结束位置是下一个判定的开始。具体如下图:

 

 
    通过计算哪些判定路径已经走过,哪些没走过,我们就可以得到DDP覆盖率了,公式如下:

DDP 覆盖=(至少被执行到一次的判定路径数量)/(系统中判定路径总数)

三、灰盒覆盖率

1.接口覆盖(Interface Coverage)

      接口覆盖,又称入口点覆盖,要求通过设计一定的用例使得系统的每个接口被测试到。

接口覆盖=(至少被执行一次的接口数量)/(系统中接口的总数)

2.函数覆盖(True Coverage)

      函数覆盖是针对系统或一个子系统的测试的,它表示在该测试中,有哪些函数被测试到了,其被测试到的频率有多大,这些函数在系统所有函数中占的比例有多大,函数覆盖是一个比较容易自动化的技术,同时也易于理解。其公式如下:

函数覆盖=(至少被执行一次的函数数量)/(系统中函数的总数)

四、黑盒覆盖率

     在实际测试中,与黑盒相关的覆盖率比较少,主要是功能覆盖率(Functional  Coverage),功能覆盖中最常见的是需求覆盖(Requirement Coverage),其含义是通过设计一定的测试用例,要求每个需求点都被测试到。

需求覆盖=(被验证到的需求数量)/(总的需求数量)

五、面向对象的覆盖率

1.继承上下文覆盖

2.基于状态的上下文覆盖

3.基于线程的上下文覆盖

六、案例

      为以下所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖和路径覆盖,并画出相应的程序流程图。

思路:  首先根据程序代码画出程序流程图 ,然后根据程序流程图分别列出各种覆盖率的条件,然后设计测试用例,设计完一个用例标记下覆盖了多少条件,依次往下,直到覆盖了所有的条件。

用例: 

七、重点 

1.需要掌握:一个测试用例的各种覆盖率为多少?
                 覆盖率100%的情况下需要设计多少用例?

2.各种测试覆盖率之间的关系


如果你想学习自动化测试,那么下面这套视频应该会帮到你很多 

如何逼自己1个月学完自动化测试,学完即就业,小白也能信手拈来,拿走不谢,允许白嫖....

最后我这里给你们分享一下我所积累和整理的一些文档和学习资料,有需要直接领取就可以了

以上内容,对于软件测试的朋友来说应该是最全面最完整的备战仓库了,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。

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

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

相关文章

stm32的时钟、中断的配置(针对寄存器),一些基础知识

一、学习参考资料 (1)正点原子的寄存器源码。 (2)STM32F103最小系统板开发指南-寄存器版本_V1.1(正点) (3)STM32F103最小系统板开发指南-库函数版本_V1.1(正点&#xff0…

C++基础——基础语法

1 注释 C支持单行注释和多行注释。 单行注释 // 注释内容单行注释直到改行末尾,可以与代码放在同一行,在代码后面注释 多行注释 /* 注释内容 */包含在其中的都会被注释 2 变量 变量的作用是给指定的内存空间起名,方便操作这段内存。变…

哈希应用之位图

文章目录 1.位图概念2.面试题引入3.代码解决[配注释]4.位图应用4.1找到100亿个整数里只出现一次的整数4.2找两个分别有100亿个整数的文件的交集[只有1G内存]1.法一[使用于数据量<42亿]2.法二[适用于数据量大>42亿]3.在一个有100亿个int的文件中找到出现次数不超过2次的所…

AI伦理:如何确保人工智能的公平与透明

文章目录 什么是AI伦理&#xff1f;AI公平性AI透明性 为什么AI公平性和透明性重要&#xff1f;确保AI公平性的方法1. 数据收集和准备2. 算法和模型3. 解释和可解释性4. 持续监测 确保AI透明性的方法1. 记录决策2. 可解释性工具3. 用户教育 AI伦理的挑战和未来结论 &#x1f389…

STM32MP157汇编流水灯

.text .global _start _start: /* 使能GPIOE、GPIOF寄存器 RCC_MP_AHB4ENSETR * 基地址: 0x50000000 偏移地址: 0xA28 0x50000A28* RCC_MP_AHB4ENSETR[4]->1 RCC_MP_AHB4ENSETR[5]->1*/ LDR R0,0x50000A28LDR R1,[R0]ORR R1,R1,#(0x1<<4)STR R1,[R0]LDR R0,0x…

C++ 学习系列 -- std::list

一 std::list 介绍 list 是 c 中的序列式容器&#xff0c;其实现是双向链表&#xff0c;每个元素都有两个指针&#xff0c;分别指向前一个节点与后一个节点 链表与数组都是计算机常用的内存数据结构&#xff0c;与数组连续内存空间不一样的地方在于&#xff0c;链表的空间是不…

【Java 进阶篇】HTML块级元素详解

HTML&#xff08;Hypertext Markup Language&#xff09;是用于创建网页的标记语言。在HTML中&#xff0c;元素被分为块级元素和内联元素两种主要类型。块级元素通常用于构建网页的结构&#xff0c;而内联元素则嵌套在块级元素内&#xff0c;用于添加文本和其他内容。本文将重点…

异常:找不到匹配的key exchange算法

目录 问题描述原因分析解决方案 问题描述 PC 操作系统&#xff1a;Windows 10 企业版 LTSC PC 异常软件&#xff1a;XshellPortable 4(Build 0127) PC 正常软件&#xff1a;PuTTY Release 0.74、MobaXterm_Personal_23.1 服务器操作系统&#xff1a;OpenEuler 22.03 (LTS-SP2)…

Ubuntu 22.04 安装系统 手动分区 针对只有一块硬盘 lvm 单独分出/home

自动安装的信息 参考自动安装时产生的分区信息 rootyeqiang-MS-7B23:~# fdisk /dev/sdb -l Disk /dev/sdb&#xff1a;894.25 GiB&#xff0c;960197124096 字节&#xff0c;1875385008 个扇区 Disk model: INTEL SSDSC2KB96 单元&#xff1a;扇区 / 1 * 512 512 字节 扇区大…

phpstudy本地域名伪静态

环境&#xff1a;WNMP(Windows10 Nginx1.15.11 MySQL5.7.26 【PHP 7.4.3 (cli) (built: Feb 18 2020 17:29:57) ( NTS Visual C 2017 x64 ) 】) 使用PhpStudy配置本地域名后&#xff0c;设置伪静态&#xff0c;这样在Web端打开网站就不需要输入index.php了&#xff0c;很简单…

架构方法、模型、范式、治理

从架构方法、模型、范式、治理等四个方面介绍架构的概念和方法论、典型业务场景下的架构范式、不同架构的治理特点这3个方面的内容

Pycharm操作git仓库 合并等

菜单 Git CommitPushUpdate ProjectPullFetchMergreRebase 查询 查询分支 查询本地所有分支 # 查询本地分支 git branch# 查询远程分支 git branch -rPycharm查看当前分支 步骤&#xff1a; Git->Branches 哈喽&#xff0c;大家好&#xff0c;我是[有勇气的牛排]&…

ELK集群 日志中心集群

ES&#xff1a;用来日志存储 Logstash:用来日志的搜集&#xff0c;进行日志格式转换并且传送给别人&#xff08;转发&#xff09; Kibana:主要用于日志的展示和分析 kafka Filebeat:搜集文件数据 es-1 本地解析 vi /etc/hosts scp /etc/hosts es-2:/etc/hosts scp /etc…

视频转GIF:快速生成有趣的动态图片

随着社交媒体的快速发展&#xff0c;GIF动态图片已经成为了人们表达情感、分享生活片段的重要方式。将视频片段转换成GIF动态图片&#xff0c;可以让人们更好地分享和表达自己的情感&#xff0c;也可以让一些有趣的瞬间变得更加生动有趣。本文将介绍如何将视频快速转换成GIF动态…

微信小程序wxs标签 在wxml文件中编写JavaScript逻辑

PC端开发 可以在界面中编写JavaScript脚本 vue/react这些框架更是形成了一种常态 因为模板引擎和jsx语法本身就都是在js中的 我们小程序中其实也有类似的奇妙写法 不过先声明 这东西不是很强大 我们可以先写一个案例代码 wxml代码参考 <view><wxs module"wordSt…

Mac 点击桌面 出现黑边框 解决

1、桌面黑框效果 2、解决&#xff1a;设置为 仅在台前调度中

数据结构-顺序存储二叉树

文章目录 目录 文章目录 前言 一 . 什么是顺序存储二叉树 二 . 模拟实现 前序遍历 总结 前言 大家好,今天给大家讲一下顺序存储二叉树 一 . 什么是顺序存储二叉树 顺序存储二叉树是一种将二叉树的节点按照从上到下、从左到右的顺序存储在数组中的方法。具体来说&#xff0c;顺…

文件操作 和 IO - 详解

一&#xff0c;认识文件 1.1 树形结构组织和目录 文件是对于"硬盘"数据的一种抽象&#xff0c;在一台计算机上&#xff0c;有非常多的文件&#xff0c;这些文件是通过 "文件系统" 来进行组织的&#xff0c;本质上就是通过 "目录"(文件夹) 这样…

WebGoat 靶场 JWT tokens 四 五 七关通关教程

文章目录 webGoat靶场第 四 关 修改投票数第五关第七关 你购买书&#xff0c;让Tom用户付钱 webGoat靶场 越权漏洞 将webgoat-server-8.1.0.jar复制到kali虚拟机中 sudo java -jar webgoat-server-8.1.0.jar --server.port8888解释&#xff1a; java&#xff1a;这是用于执行…

MySQL命令行中文乱码问题

MySQL命令行中文乱码问题&#xff1a; 命令行界面默认字符集是gbk&#xff0c;若字符集不匹配会中文乱码或无法插入中文。 解决办法&#xff1a;执行set names gbk; 验证&#xff1a; 执行命令show variables like ‘char%’;查看默认字符集。 创建数据库设置字符集utf8&…