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

 🔥 交流讨论:欢迎加入我们一起学习!

🔥 资源分享耗时200+小时精选的「软件测试」资料包

🔥 教程推荐:火遍全网的《软件测试》教程  

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

大家日常工作过程中,不论是开发还是测试都有可能会被要求写单元测试用例,但是单元测试用例写得好不好如何衡量呢?一般都需要借助工具来统计单元测试用例覆盖了多少业务代码、算法代码,覆盖率高的情况下,比如覆盖率达到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。

图片

测试用例只有待测试类对象的情况下
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统计的是类方法总分支数和测试用例调用分分支个数的占比。

最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值