还在担心漏测吗?快来使用jacoco统计下代码覆盖率
每天进步一点点,关注我们哦,每天分享测试技术文章
本文章出自【码同学软件测试】
码同学公众号:自动化软件测试,领取资料可加:magetest
码同学抖音号:小码哥聊软件测试
大家日常工作过程中,不论是开发还是测试都有可能会被要求写单元测试用例,但是单元测试用例写得好不好如何衡量呢?一般都需要借助工具来统计单元测试用例覆盖了多少业务代码、算法代码,覆盖率高的情况下,比如覆盖率达到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】。
免费领取码同学软件测试课程笔记+超多学习资料+完整视频+面试题,可加微信:magetest
然后在弹出的“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统计的是类方法总分支数和测试用例调用分分支个数的占比。
免费领取码同学软件测试课程笔记+超多学习资料+学习完整视频 ☞ 可加:magetest/关注码同学公众号:自动化软件测试
本文著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。