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

news2024/11/26 15:47:53

  

一、覆盖率概念

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

覆盖率=(至少被执行一次的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.coloradmin.cn/o/1070634.html

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

相关文章

2023年DDoS攻击发展趋势的分析和推断

DDoS是一种非常“古老”的网络攻击技术,随着近年来地缘政治冲突对数字经济格局的影响,DDoS攻击数量不断创下新高,其攻击的规模也越来越大。日前,安全网站Latest Hacking News根据DDoS攻击防护服务商Link11的统计数据,对…

解析‘找不到msvcp140.dll无法继续执行代码’这个问题的解决方法

大家好!今天我要和大家分享的主题是“msvcp140.dll丢失的解决方法”。我们都知道,在运行一些软件或游戏时,经常会遇到“msvcp140.dll丢失”的错误提示,这会让我们非常烦恼。那么,这个问题是什么原因引起的呢&#xff1…

爱普生LQ1900KIIH复位方法

爱普生EPSON 1900KIIH是一部通用针式打印机,136列(10cpi下)的打印宽度,缓冲区128KB,打印速度为270字/秒。 打印机类型 打印方式:24针击打式点阵打印、打印方向:双向逻辑查找、安全规格标准&am…

Games104现代游戏引擎笔记高级ai

Hierarchical Task Network 层次任务网络 World State是一个主观的对世界的认知,并不是一个真实世界的描述 Sensors负责从游戏环境中抓取各种状态 HTN Domain 存放层次化的树状结构Task和之间的关联关系1 Planner 根据World State从 Domain 里规划 task Plan Runne…

论文研读|Protecting Intellectual Property of Deep Neural Networks with Watermarking

目录 论文信息文章简介研究动机研究方法水印生成水印嵌入版权验证 实验结果有效性(Effectiveness)高效性(Converge Speed)保真度(Functionality)鲁棒性(Robustness)Anti-剪枝攻击&am…

三十二、【进阶】hash索引结构

1、hash索引结构 (1)简述: hash索引,就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。 (2)图示: 2、hash索引结构…

爬虫编程语言

文章目录 基本数据类型bytes类型python数据类型转换 python运算符python数字数学函数随机数函数三角函数数字常量 python字符串python访问字符串中的值python字符串更新python转义字符python字符串运算符python字符串格式化f-stringUnicode字符串python的字符串内建函数 python…

Unity可视化Shader工具ASE介绍——3、ASE的Shader类型介绍

大家好,我是阿赵。这里继续介绍Unity可视化Shader编辑插件ASE的用法。   上一篇介绍了节点的输入输出节点。这一篇来介绍一下不同的Shader类型的区别。 一、修改Shader类型 之前介绍创建Shader的时候,曾经说过可以选择Shader的类型。 其实这个类型是…

从入门到精通,30天带你学会C++【第七天:for循环和while循环以及数组的学习】(学不会你找我)

目录 Everyday English 前言 数组 数组的概念 数组的定义 数组的下标 for循环 循环是什么 基本格式 多重循环 while循环 do-while循环 总结 Everyday English To shine , not be illuminated. 去发光,而不是被照亮。 前言 好久不见&#xff0c…

Js基础——事件流

引入 当浏览器发展到第四代时( IE4 及 Netscape Communicator 4 ),浏览器开发团队遇到了一个很有意思 的问题:页面的哪一部分会拥有某个特定的事件?要明白这个问题问的是什么,可以想象画在一张纸上的一组…

stable diffusion API接口 + 扩展接口

文章目录 概要流程页面接口调用展示txt2img接口AutoDL设置扩展接口 概要 调研Stable Diffusion二次开发,查看接口文档。 基于AutoDL算力服务器,直接安装部署,非常容易上手,部署教程放下面了。 部署教程 流程 页面接口调用 页面…

1.3.2有理数减法(第一课时)作业设计

【学习目标】 1.理解有理数减法法则,能熟练地进行有理数的减法运算. 2.感受有理数减法与加法对立统一的辨证思想,体会转化的思想方法.

基于Springboot实现社区维修平台管理系统演示【项目源码+论文说明】

基于Springboot的社区维修平台管理系统演示SSM 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识…

c++解压压缩包文件

功能实现需要依赖相关头文件和库文件&#xff0c;我这里的是64位的。需要的可以在这下载&#xff1a;https://download.csdn.net/download/bangtanhui/88403596 参考代码如下&#xff1a; #include <zip.h> #pragma comment(lib,"libzip.lib")//解压压缩包 /…

大数据概述(林子雨慕课课程)

文章目录 1. 大数据概述1.1 大数据概念和影响1.2 大数据的应用1.3 大数据的关键技术1.4 大数据与云计算和物联网的关系云计算物联网 1. 大数据概述 大数据的四大特点&#xff1a;大量化、快速化、多样化、价值密度低 1.1 大数据概念和影响 大数据摩尔定律 大数据由结构化和非…

【unity】制作一个角色的初始状态(左右跳二段跳)【2D横板动作游戏】

前言 hi~ 大家好&#xff01;欢迎大家来到我的全新unity学习记录系列。现在我想在2d横板游戏中&#xff0c;实现一个角色的初始状态-闲置状态、移动状态、空中状态。并且是利用状态机进行实现的。 本系列是跟着视频教程走的&#xff0c;所写也是作者个人的学习记录笔记。如有错…

Decorator

Decorator 动机 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”&#xff0c; 由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff1b; 并且随着子类的增多&#xff08;扩展功能的增多&#xff09;&#xff0c;各种子类的组合&#xff…

Ubuntu右上角不显示网络的图标解决办法

一.line5改为true sudo vim /etc/NetworkManager/NetworkManager.conf 二.重启网卡 sudo service network-manager stop sudo mv /var/lib/NetworkManager/NetworkManager.state /tmp sudo service network-manager start

全网最详细的本地搭建GitLab代码仓库教学

大体的步骤 本地安装VMware虚拟机。然后再虚拟机上安装CentOs7镜像系统。在Linux中安装GitLab-Ce。在Linux中安装GitLab-Runner在自己搭建的GitLab上面创建一个项目&#xff0c;然后拉取到本地然后提交之后实现自动化部署。 步骤一 这一步骤我在之前我的安装Redis文章中有讲解…

关于Jupyter notebook 创建python3 时进去不能重命名问题及不能编程问题

首先写这篇博客时&#xff0c;已经被这个问题折磨了三天&#xff0c;看了很多博客&#xff0c;其实解决这个问题的关键就是要么没有下pyzmq或者等级太高&#xff0c;要么等级太低&#xff0c;首先我会按照我思路来。 问题如图&#xff1a; 1.自动换行 2.不能重命名 我的解决办…