网易首页 > 网易号 > 正文 申请入驻

代码覆盖率的统计指标有哪些?如何合理设置?

0
分享至

本文我们来介绍一下代码覆盖率里面的指标,前面的文章中我们讲到了,代码覆盖率的含义就是哪些代码被跑到了,哪些代码没有被跑到,实际上没有那么简单,它分成了几个维度去考虑代码的覆盖情况,我们先来看第一个纬度,语句的覆盖。

语句覆盖(StatementCoverage)又称行覆盖(LineCoverage),就是度量被测代码中每个可执行语句是否被执行到了。这里说的是“可执行语句”,不会包括头文件声明,代码注释,空行,等等,非常好理解。只统计能够执行的代码被执行了多少行。简单来说,就是这行代码只要被覆盖到了就是1,没有被覆盖到就是2。

我们先来看上面这段代码,这里有价值的语句一共有3条语句:判断语句是一条,return 0是一条,return 1是一条。很多代码覆盖率会认定else不算,因为它就是一个关键字,实际上没有什么语句的价值。
如果每一行都执行到了,行覆盖率就是1,总共3行,3行都执行到了,行覆盖率就是100%。

稍微有点代码常识的人看到这里就能看出问题了,如果这个if语句我确实执行到了,但是它明显地有判断条件。

如果我第一个判断条件执行了,我就能判断出这个语句的真假,后面的判断条件不执行了,我就继续往下走。这个语句确实叫执行了,true false 都没有完全覆盖到而已,所以我们说行覆盖是最弱的代码覆盖。
语句覆盖常常被人指责为“最弱的覆盖”,它只管覆盖代码中的执行语句,却不考虑各种分支的组合等等。

除了行覆盖、语句覆盖之外,第二种覆盖叫做判定覆盖,后面我们有详细的例子,什么叫判定覆盖?

判定覆盖也叫分支覆盖(BranchCoverage),度量程序中每一个判定的分支是否都被测试到了。

这个很好理解,比如我们刚才的例子里有一个if语句,行覆盖就是一行行往下走,判定覆盖是指有分支的语句,每一个语句是否都被走到了。我们再来一起看一下这个例子。

有的同学会说你的这个例子完整地有if有 else,所以说行一旦覆盖成功了,三句都走完了,那么你的分支覆盖肯定也是百分之百走完,也是成功的,因为我的if走了,else也走了。

我们试想一下,如果把下面的else盖住的话,没有这个else,只有if,如果你的语句覆盖里面的if走到了,return走到了,你的行覆盖率是百分之百,这个时候你并没有去测else分支,这个时候行覆盖率是100%,但是else的条件你并没有测到,这个时候只覆盖到了if为true的情况,没有覆盖到else分支,虽然else分支里面没有代码。

这个例子就说明判定覆盖和行覆盖还是有本质区别的。
条件覆盖(ConditionCoverage),它度量判定中的每个子表达式结果true和false是否被测试到了。为了说明判定覆盖和条件覆盖的区别,我们来举一个例子,假如我们的被测代码如下:

在刚才的例子里,如果if、else都走到了,那么你的分支覆盖肯定也是百分之百,但是条件覆盖不一定是百分之百。if整体为true,我确实走到了,if整体为false,也就是else,我确实也走到了,对于if判断语句来说,两个分支确实都走到了。

但这里面还有一个问题,if后面它是有两个判定条件的,咱们稍微有点代码常识的朋友都知道,不管什么语言,都有逻辑判断短路的问题。两个and判断,如果有一个and判断为false了,后面就不会判断了,所以说那个就不走了,不管走不走,你并没有覆盖到两个并列条件,两个子条件都为true或都为false的情况你并没有走到。

整体的判断语句你走到了,但是里面两个具体的分支判断条件分别的true、false你没有走到。这个时候你的分支覆盖率是百分之百了,但是你的条件覆盖率并不是百分之百。

路径覆盖(PathCoverage)它度量了是否函数的每一个分支都被执行了。有多个分支嵌套时,需要对多个分支进行排列组合。

因为现在只有一个if条件,所以不好看路径,我给大家举个例子,比如说两个判定条件,两个if,你只覆盖了第一个if判定条件的true和false以及第二个判定条件的true和false,但是两个并没有分别来走。
比如说第一个是true,第二个是false,或者第一个是false,第二个是true的这种交叉情况。也就是说没有把包含所有的if、else条件的整体当成一个完整的路径去处理,这个路径就有多种组合了。这就是第四个,叫路径覆盖。
所以说最粗略的覆盖是行覆盖,然后是判定覆盖,也叫分支覆盖,第三个是每个分支里面的小条件都被覆盖了叫条件覆盖,第四个是所有代码里面可能会出现的路径组合,判断分支的组合,叫做路径覆盖,由粗到细四个程度。

当然再往下划分还有一个圈复杂度,这个后续的文章中我们再为大家详细讲解。

下面我们再通过一个小例子去详细解说一下。

上面是一个java的语句,一个foo函数,有a、b两个整型,有一个if条件,这个if条件里面有两个小的条件。接下来有一个else分支语句,最后有一个return语句。有一组判断,两个分支,三个语句(不算定义的话)。

TestCaes1: a=5,b=任意数字

当a=5的时候,a<10这个条件成立,对于逻辑或来说,前面的条件为真,后面的条件就不用判断了,必然是为真的。
所以说我给出的第一组测试用例,当a=5,b=任意数字时,它都会走到分支一,我们再给一个值。

TestCaes2: a = 15,b = 15

当a=15时,a<10不成立,进而去判断第二个条件,当b=15,b<10也不成立的时候,会走到else这里,这样也覆盖了分支二。
语句覆盖100%,分支覆盖也是100%,但是里面小条件的true和false并没有很完整地被覆盖。a<10为true、为false和b<10为true、为false的情况没有分别覆盖,因为逻辑短路的原因,所以你不能让它短路。
完全的条件覆盖:

TestCase1: a = 5,b = 任意数字 ture X

TestCase2: a = 15, b = 5 false, true

TestCase2: a = 15, b = 15 false, false

第一条,我先让a=5,b=任意数字,这个时候a<10这个条件为true的情况已经被覆盖。接下来通过a = 15, b = 5和a = 15, b = 15 这两组数据,让a<10这个条件为false时,b<10这个条件的true和false,都覆盖到了。

在这个逻辑或的条件中,每个分支的true和false都覆盖到了,这个时候才完成了我们所说的第3类覆盖,就是我们刚才所说的条件覆盖。对于这一个例子来说,上面所说的几种覆盖率就全部都覆盖到了。
下面我们再一起来看一个例子。

对于这样两个并列的if条件来说,怎么来写语句测试用例以做到语句覆盖率100%、判定覆盖率100%、条件覆盖率100%、路径覆盖率100%。

TestCase a = 5,b = 5 ,nReturn = 11语句覆盖率100%

TestCase1 a = 5,b = 5,nReturn = 11

TestCase2 a = 15, b = 15, nReturn = 0

判定覆盖率100%,条件覆盖率100%

TestCase1 a = 5,b = 5, nReturn = 0

TestCase2 a = 15,b = 5 ,nReturn = 1

TestCase3 a = 5,b = 15,nReturn = 10

TestCase4 a = 15, b = 15 ,nReturn = 11

路径覆盖率100%

从这里可以看出,如果我们想达到路径覆盖率100%的话,我们的测试用例一定是比前三种要多的。所以我们最终得出的结论是:路径覆盖率 > 判定(分支)覆盖 > 语句覆盖。

我们了解到了什么是覆盖率,也了解到了覆盖率的四种统计的维度,接下来的文章将带大家了解一下代码覆盖率工具以及实施方法,欢迎大家继续关注。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
张雪冠军复刻赛车得主“敌敌畏”最新消息:代公司拍下;想付尾款,但联系不上张雪方,目前对方也未主动联系自己

张雪冠军复刻赛车得主“敌敌畏”最新消息:代公司拍下;想付尾款,但联系不上张雪方,目前对方也未主动联系自己

极目新闻
2026-04-11 11:24:30
外媒:印度空军现在还能打赢巴基斯坦,等空警500到货就不一定了

外媒:印度空军现在还能打赢巴基斯坦,等空警500到货就不一定了

有范又有料
2026-04-12 04:38:02
花200元买水果被骂吃死你,怀孕妻子心寒不欲生子,已入冷静期!

花200元买水果被骂吃死你,怀孕妻子心寒不欲生子,已入冷静期!

川渝视觉
2026-04-10 15:59:55
闫闯 被问买问界M6和Model Y哪个好? 被旁边大哥一句话干沉默了

闫闯 被问买问界M6和Model Y哪个好? 被旁边大哥一句话干沉默了

周哥一影视
2026-04-11 03:19:35
大案纪实:沦丧的亲情,变态儿子竟向母亲伸出魔爪

大案纪实:沦丧的亲情,变态儿子竟向母亲伸出魔爪

莫地方
2026-04-04 15:06:36
团灭!太原站国乒女单全军覆没,日乒包揽冠亚军,警钟炸响!

团灭!太原站国乒女单全军覆没,日乒包揽冠亚军,警钟炸响!

刘哥谈体育
2026-04-12 10:13:16
项立刚微博被禁言,易中天获厦大杰出贡献奖

项立刚微博被禁言,易中天获厦大杰出贡献奖

难得君
2026-04-09 16:02:49
油价大暴跌!今天4月11日调整后,全国加油站92、95汽油最新售价

油价大暴跌!今天4月11日调整后,全国加油站92、95汽油最新售价

侃故事的阿庆
2026-04-12 05:34:43
1938年,毛主席与江青结婚,陈伯钧写信反对,毛主席:天塌不下来

1938年,毛主席与江青结婚,陈伯钧写信反对,毛主席:天塌不下来

历史龙元阁
2026-04-11 08:40:19
两岸谈完,郑丽文离开人民大会堂,临走前达成共识,岛内传出杂音

两岸谈完,郑丽文离开人民大会堂,临走前达成共识,岛内传出杂音

阿天爱旅行
2026-04-12 04:15:22
祖国终将统一!1996年台海受辱,2016年南海对峙,2026年正好30年

祖国终将统一!1996年台海受辱,2016年南海对峙,2026年正好30年

现代小青青慕慕
2026-03-14 17:26:27
郑丽文向全岛喊话,必须彻查民进党,没想到对大陆露出了狐狸尾巴

郑丽文向全岛喊话,必须彻查民进党,没想到对大陆露出了狐狸尾巴

看尽人间百态
2026-03-10 08:25:05
外交部公开发声,10字定性郑丽文访问大陆,白岩松的话果真没说错

外交部公开发声,10字定性郑丽文访问大陆,白岩松的话果真没说错

阿纂看事
2026-04-11 15:53:22
夏天神器来了!徕芬首款折叠小风扇官宣 轻松装入口袋

夏天神器来了!徕芬首款折叠小风扇官宣 轻松装入口袋

快科技
2026-04-11 16:55:16
奥迪Q5L价格再下探,优惠11.08万,网友:奔驰这下真急了

奥迪Q5L价格再下探,优惠11.08万,网友:奔驰这下真急了

汽车网评
2026-04-11 21:30:13
千万粉丝网红晒剃光头视频感动全网

千万粉丝网红晒剃光头视频感动全网

新民周刊
2026-04-11 18:14:45
曾志伟追债20多年终获胜!讨回5700万,还债人居然是她,令人意外

曾志伟追债20多年终获胜!讨回5700万,还债人居然是她,令人意外

一盅情怀
2026-04-11 17:12:15
美伊谈判无果 万斯:伊朗“选择不接受” 伊方:美国要求过分 伊朗不急于求成

美伊谈判无果 万斯:伊朗“选择不接受” 伊方:美国要求过分 伊朗不急于求成

新华社
2026-04-12 11:34:23
太突然!风向变了,很多人开始抨击全红婵,又印证了谷爱凌的话!

太突然!风向变了,很多人开始抨击全红婵,又印证了谷爱凌的话!

以茶带书
2026-04-04 15:06:37
前男友向我借了58000,7年没还,我去银行注销旧卡时,柜员看了眼

前男友向我借了58000,7年没还,我去银行注销旧卡时,柜员看了眼

小秋情感说
2026-04-12 09:25:31
2026-04-12 12:12:49
道普云
道普云
深耕软测行业二十年。可帮助企业和组织建立软件测试体系,提供软件测试cnas/cma认证咨询服务。
161文章数 3关注度
往期回顾 全部

科技要闻

理想称遭恶意拉踩,东风日产:尊重同行

头条要闻

美国副总统万斯:美伊谈判未能达成协议 将返回美国

头条要闻

美国副总统万斯:美伊谈判未能达成协议 将返回美国

体育要闻

换帅之后,他们从降级区冲到升级区

娱乐要闻

46岁赵达官宣结婚!曾与殷桃谈婚论嫁

财经要闻

三轮磋商谈至深夜 美伊谈判三大议题仍待解

汽车要闻

焕新极氪007/007GT上市 限时19.39万起

态度原创

教育
时尚
数码
房产
军事航空

教育要闻

谁说中考作文必须写自身经历?

春季穿衣别死气沉沉,看看这27套日常穿搭,活力时尚又减龄

数码要闻

戴尔推出Pro Micro瘦客户机Q9M1260:7瓦功耗,可选1GbE光纤接口

房产要闻

土地供应突然暴跌!2026海口楼市,格局大变!

军事要闻

伊朗议长带四名遇难儿童照片赴美伊谈判

无障碍浏览 进入关怀版