还在担心漏测吗?快来使用jacoco统计下代码覆盖率
ztj100 2025-01-14 19:10 24 浏览 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统计的是类方法总分支数和测试用例调用分分支个数的占比。
免费领取码同学软件测试课程笔记+超多学习资料+学习完整视频,可以关注我们公众号哦:自动化软件测试
本文著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
相关推荐
- 使用Python编写Ping监测程序(python 测验)
-
Ping是一种常用的网络诊断工具,它可以测试两台计算机之间的连通性;如果您需要监测某个IP地址的连通情况,可以使用Python编写一个Ping监测程序;本文将介绍如何使用Python编写Ping监测程...
- 批量ping!有了这个小工具,python再也香不了一点
-
号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部下午好,我的网工朋友。在咱们网工的日常工作中,经常需要检测多个IP地址的连通性。不知道你是否也有这样的经历:对着电脑屏...
- python之ping主机(python获取ping结果)
-
#coding=utf-8frompythonpingimportpingforiinrange(100,255):ip='192.168.1.'+...
- 网站安全提速秘籍!Nginx配置HTTPS+反向代理实战指南
-
太好了,你直接问到重点场景了:Nginx+HTTPS+反向代理,这个组合是现代Web架构中最常见的一种部署方式。咱们就从理论原理→实操配置→常见问题排查→高级玩法一层层剖开说,...
- Vue开发中使用iframe(vue 使用iframe)
-
内容:iframe全屏显示...
- Vue3项目实践-第五篇(改造登录页-Axios模拟请求数据)
-
本文将介绍以下内容:项目中的public目录和访问静态资源文件的方法使用json文件代替http模拟请求使用Axios直接访问json文件改造登录页,配合Axios进行登录请求,并...
- Vue基础四——Vue-router配置子路由
-
我们上节课初步了解Vue-router的初步知识,也学会了基本的跳转,那我们这节课学习一下子菜单的路由方式,也叫子路由。子路由的情况一般用在一个页面有他的基础模版,然后它下面的页面都隶属于这个模版,只...
- Vue3.0权限管理实现流程【实践】(vue权限管理系统教程)
-
作者:lxcan转发链接:https://segmentfault.com/a/1190000022431839一、整体思路...
- swiper在vue中正确的使用方法(vue中如何使用swiper)
-
swiper是网页中非常强大的一款轮播插件,说是轮播插件都不恰当,因为它能做的事情太多了,swiper在vue下也是能用的,需要依赖专门的vue-swiper插件,因为vue是没有操作dom的逻辑的,...
- Vue怎么实现权限管理?控制到按钮级别的权限怎么做?
-
在Vue项目中实现权限管理,尤其是控制到按钮级别的权限控制,通常包括以下几个方面:一、权限管理的层级划分...
- 【Vue3】保姆级毫无废话的进阶到实战教程 - 01
-
作为一个React、Vue双修选手,在Vue3逐渐稳定下来之后,是时候摸摸Vue3了。Vue3的变化不可谓不大,所以,本系列主要通过对Vue3中的一些BigChanges做...
- Vue3开发极简入门(13):编程式导航路由
-
前面几节文章,写的都是配置路由。但是在实际项目中,下面这种路由导航的写法才是最常用的:比如登录页面,服务端校验成功后,跳转至系统功能页面;通过浏览器输入URL直接进入系统功能页面后,读取本地存储的To...
- vue路由同页面重定向(vue路由重定向到外部url)
-
在Vue中,可以使用路由的重定向功能来实现同页面的重定向。首先,在路由配置文件(通常是`router/index.js`)中,定义一个新的路由,用于重定向到同一个页面。例如,我们可以定义一个名为`Re...
- 那个 Vue 的路由,路由是干什么用的?
-
在Vue里,路由就像“页面导航的指挥官”,专门负责管理页面(组件)的切换和显示逻辑。简单来说,它能让单页应用(SPA)像多页应用一样实现“不同URL对应不同页面”的效果,但整个过程不会刷新网页。一、路...
- Vue3项目投屏功能开发!(vue投票功能)
-
最近接了个大屏项目,产品想在不同的显示器上展示大屏项目不同的页面,做出来的效果图大概长这样...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)