百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

还在担心漏测吗?快来使用jacoco统计下代码覆盖率

ztj100 2025-01-14 19:10 28 浏览 0 评论

每天进步一点点,关注我们哦,每天分享测试技术文章

本文章出自【码同学软件测试】

码同学公众号:自动化软件测试

码同学抖音号:小码哥聊软件测试

大家日常工作过程中,不论是开发还是测试都有可能会被要求写单元测试用例,但是单元测试用例写得好不好如何衡量呢?一般都需要借助工具来统计单元测试用例覆盖了多少业务代码、算法代码,覆盖率高的情况下,比如覆盖率达到70%,交付给功能测试、接口测试、性能测试人员前代码的质量相对高很多,java代码一般可借助统计覆盖率的工具有哪些呢?例如jacoco、Emma,本文拿jacoco来说明写单元测试用例时如何提供覆盖率。


首先我们需要知道jacoco是如何统计单元测试覆盖率的呢?


书籍以及官网中提到很多理论知识,对于初学者来说经常有云深不知处的赶脚,


下面我通过常用的测试思路以及样例的形式给大家展示jacoco在Class%、Method%、Line%、Branch%这四个维度统计的覆盖率和测试用例的对应关系。




环境准备



代码环境准备步骤拆解如下2个步骤。


1,新建maven项目

注意:本人使用如下版本Idea2020.1。其他版本操作步骤可能会有差别。


idea界面中,依次单击菜单项 “File” > “New” > “Project”。


在弹出的“New Project”窗口中,点选左侧“Maven”节点,中部上部区域勾选“Create from archetype”前的勾选框,选取列表中的如下模板“org.apache.maven.archetypes:maven-archetype-quickstart”,读者可以根据自己需求选择其他模板,然后单击【Next】。


然后在弹出的“New Project”新窗口中,在“Name”文本框中输入maven项目名称,在“GroupId”文本框输入项目公司的域名,然后单击【Next】。

然后在弹出的“New Project”新窗口中,在“User settings file”以及“Local repository”分别设置maven配置文件以及本地仓库路径,然后单击【Finish】。

然后等待依赖软件下载完毕。

如下截图是下载完毕后的idea界面截图。


2,准备待测试的代码

使用quickstart模板自动新建的App类,在该类中新建add类,详见如下截图所示,简单的实现了两数相加功能。




测试用例为空的情况下

jacoco覆盖率统计



双击选中App类,然后按组合快捷键(windows环境)【Ctrl+Shift+t】,在弹出小窗口中,单击“Create New Test ”


在弹出的“Create Test”窗口中,在Testing library下拉框中点选“JUnit4”,勾选“setUp/@Before”前的单选框,勾选add方法前的勾选框,单击【OK】


然后自动生成App类的测试类AppTest,单击Add Configurations。


在“Run/Debug Configurations”窗口中,点窗口右侧“Templates”下三角图标按钮,

单击选中JUnit模板,单击"Create configuraion"。


然后Name文本框中给模板设置名称,Test kind设置all in package,Package下拉框指定测试包,Search for tests点选“In whole project”,然后单击“Code Coverage”选项页。Choose coverage runner下拉框选择Jacoco,单击【OK】,至此完成运行调试配置。这样运行测试用例时,覆盖率统计就使用Jacoco了


然后按照如下截图所示,按照覆盖率的方式运行测试类。


通过如下运行结果可见,测试类没有实现测试方法的情况下,统计出来的覆盖率指标均为0。免费领取 码同学软件测试 课程笔记+超多学习资料+完整视频+最新面试题,可以转发文章 + 私信「码同学666」获取资料哦





测试用例只有待测试类对象的情况下

jacoco覆盖率统计



测试用例中只有被测试类对象情况下,统计出来的Class%类覆盖率为100%,

因为当前项目中只有一个类App,该类对应测试类AppTest中测试用例有被测试类定义对象的情况下,因此计算出Class%类覆盖率为100%;

统计出来的Line%类覆盖率为50%,总行数为2行覆盖其中的1行。


总行数2行是如何得来的呢?我们删除App类中的add方法,再次执行覆盖测试。

从运行结果可以得出统计总行数是按照包含字符串的行作为行统计单位,

public class App被统计到总行数中,左右花括号没有被统计到总行数中。

当App被测试类中增加add方法定义后,统计结果如下所示,

这次统计总行数数时包括类名定义,方法名定义这2行,因此总行数变成2行。

当App被测试类增加add方法返回值后,统计结果如下截图所示,

这次统计总行数仍然是2行,包括类名定义,方法名定义这2行,不包括返回值这行。

当App被测试类add方法中增加2行打印输出语句后,统计结果如下截图所示,

这次统计总行数是4行,包括类名定义,方法名定义这2行,以及打印输出这2行,不包括返回值这行。



测试用例调用App类方法的情况下

jacoco覆盖率统计




当测试用例中增加App类方法add方法调用情况下,统计Line覆盖率为100%,Class、Method、Branch覆盖率也是100%。

当App类增加sub方法如下,我们再次执行覆盖测试,这次统计Method总方法数包括App被测试类中的2个方法add、sub,测试用例仅调用了add方法,因此统计出来的Method覆盖率为50%;Branch统计总的分支数为2个,是sub方法中的if分支(虽然没有写else)统计为2个分支;

当测试用例中增加调用App类的sub方法中的一个分支情况时,覆盖测试运行结果如下,这次统计出来的Branch分支覆盖率为覆盖App类的sub方法两个分支中的if分支,因此Branch覆盖率变成50%;

Line%覆盖率为7行中的6行,

是分支语句中的return行都作为行统计到总行数中吗?我们可以再增加sub方法调用else分支的情况来进行验证,从覆盖率运行结果来看,证明分支语句中的return行都作为行统计到总行数,这跟没有分支情况是有区分的。

可见通过jacoco统计单元测试覆盖率时,Class%是按照设定的包所在范围统计该包下的类总个数以及测试用例覆盖类个数的占比;Method%统计的是类方法的总个数以及测试用例调用类方法的占比;Line%统计的是类中代码行数以及测试用例调用类中的类、方法等行数的占比;而Branch统计的是类方法总分支数和测试用例调用分分支个数的占比。

免费领取码同学软件测试课程笔记+超多学习资料+学习完整视频,可以关注我们公众号哦:自动化软件测试

本文著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: