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

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

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.

相关推荐
热点推荐
这5个行业,已经发不出工资了!真的很严重了

这5个行业,已经发不出工资了!真的很严重了

细说职场
2026-04-12 14:35:35
全红婵后续:群主被刑拘只是开始,网传名单已曝光,队友很慌乱?

全红婵后续:群主被刑拘只是开始,网传名单已曝光,队友很慌乱?

眼光很亮
2026-04-11 17:01:04
克尼佩尔拉胯!黄蜂110-96胜尼克斯,鲍尔19+7+6+2,米勒砍19+3+2

克尼佩尔拉胯!黄蜂110-96胜尼克斯,鲍尔19+7+6+2,米勒砍19+3+2

小徐讲八卦
2026-04-13 09:02:40
雷军真诚致歉:小米撑到现在才涨价,真的已经尽力了!

雷军真诚致歉:小米撑到现在才涨价,真的已经尽力了!

大白聊IT
2026-04-12 22:36:25
里弗斯卸任雄鹿主帅:32胜50负无缘季后赛 雄鹿将3年第3次选帅

里弗斯卸任雄鹿主帅:32胜50负无缘季后赛 雄鹿将3年第3次选帅

醉卧浮生
2026-04-13 08:58:25
广东珠海一女神好漂亮, 身高179cm,体重50kg 美的让人移不开眼

广东珠海一女神好漂亮, 身高179cm,体重50kg 美的让人移不开眼

今日搞笑分享
2026-04-06 17:55:16
美中央司令部:4月13日起封锁伊朗港口海上交通

美中央司令部:4月13日起封锁伊朗港口海上交通

大象新闻
2026-04-13 06:29:15
马伊琍官宣喜讯不到24小时,文章高调求复合姚笛才是笑到最后

马伊琍官宣喜讯不到24小时,文章高调求复合姚笛才是笑到最后

智慧生活笔记
2026-04-12 16:43:48
万斯:这是最终方案,也是最优报价

万斯:这是最终方案,也是最优报价

西楼饮月
2026-04-12 21:43:31
赖清德急了!回台湾就被抓?郑丽文和大陆谈完,临走前达成了共识

赖清德急了!回台湾就被抓?郑丽文和大陆谈完,临走前达成了共识

轩逸阿II
2026-04-12 18:34:08
中美两国居民收入差距,正越来越大

中美两国居民收入差距,正越来越大

罗sir财话
2026-04-10 14:54:24
有人用锉刀把MacBook棱角磨圆了,苹果设计师看了沉默

有人用锉刀把MacBook棱角磨圆了,苹果设计师看了沉默

爬虫饲养员
2026-04-12 09:20:43
57岁周立波拄拐杖对空座位演出!从年入6000万到无人问津

57岁周立波拄拐杖对空座位演出!从年入6000万到无人问津

子芫伴你成长
2026-04-12 23:42:24
5月1日起,医疗回扣入刑!

5月1日起,医疗回扣入刑!

中国医疗保险杂志社
2026-04-12 15:50:06
3月销冠还是Model Y:网上没赢过,现实没输过

3月销冠还是Model Y:网上没赢过,现实没输过

小南看车
2026-04-11 07:04:23
“邦迪女将”下课了

“邦迪女将”下课了

中国新闻周刊
2026-04-12 15:42:04
创造历史!柏林联盟任命五大联赛首位女性主教练

创造历史!柏林联盟任命五大联赛首位女性主教练

体坛周报
2026-04-12 19:42:10
上海植物园猥亵惯犯落网!被抓6次,仍嬉皮笑脸毫无羞耻心太可恶

上海植物园猥亵惯犯落网!被抓6次,仍嬉皮笑脸毫无羞耻心太可恶

行者聊官
2026-04-12 15:46:42
1462万!科大讯飞有人中彩票赢麻了!

1462万!科大讯飞有人中彩票赢麻了!

天天开柒
2026-04-12 11:48:28
曝何超蕸乳癌复发去世,何超仪曾说她太好欺负,多位港民曝其人品

曝何超蕸乳癌复发去世,何超仪曾说她太好欺负,多位港民曝其人品

古希腊掌管松饼的神
2026-04-12 17:20:48
2026-04-13 09:16:49
道普云
道普云
深耕软测行业二十年。可帮助企业和组织建立软件测试体系,提供软件测试cnas/cma认证咨询服务。
161文章数 3关注度
往期回顾 全部

科技要闻

李想向黑水军开炮!连发5条朋友圈

头条要闻

张雪回应"张雪机车新手禁令":我认为做得很棒

头条要闻

张雪回应"张雪机车新手禁令":我认为做得很棒

体育要闻

创造历史!五大联赛首位女性主教练诞生

娱乐要闻

赌王女儿何超蕸病逝,常年和乳癌斗争

财经要闻

封锁,还是收费站?

汽车要闻

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

态度原创

手机
艺术
家居
时尚
公开课

手机要闻

折叠屏iPhone Ultra新渲染图!消息称苹果已解决两个关键问题

艺术要闻

朱元璋去拜佛,问方丈:“朕要跪下吗?”方丈答了8个字救了全寺的人

家居要闻

复古风格 自然简约

这些才是普通人借鉴的穿搭!上短下长、上窄下宽,显瘦又舒适

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版