浅谈Java代码覆盖率及实际应用

92 篇文章 7 订阅
订阅专栏

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程大家好!欢迎来到我的网站! 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科… 继续阅读 前言icon-default.png?t=N7T8https://www.captainai.net/

引言

经常有人问这样的问题:“我们在做单元测试,那测试覆盖率要达到多少才行?”。答案其实很简凌单:“作为指标的测试覆盖率都是没有用处的”。

把测试覆盖作为质量目标没有任何意义,而我们应该把它作为一种发现未被测试覆盖的代码的手段。
Alt text

代码覆盖率的意义

  1. 分析未覆盖部分的代码,从而反推在前期测试设计是否充分,没有覆盖到的代码是否是测试设计的盲点,为什么没有考虑到?需求/设计不够清晰,测试设计的理解有误,工程方法应用后造成的策略性放弃等等,之后进行补充测试用例设计。
  2. 检测出程序中的废代码,可以逆向反推在代码设计中的思维混乱点,提醒设计/开发人员理清代码逻辑关系,提升代码质量。
  3. 代码覆盖率高不能说明代码质量高,但是反过来看,代码覆盖率低,代码质量不会高到哪里去,可以作为测试同学自我审视的重要工具之一。

代码覆盖率工具

目前Java常用代码覆盖率工具有Jacoco、Emma和Cobertura

覆盖率工具工作流程

Alt text1. 对Java字节码进行插桩,有On-The-Fly和Offine两种方式。
2. 执行测试用例,收集程序执行轨迹信息,将其dump到内存。
3. 数据处理器结合程序执行轨迹信息和代码结构信息分析生成代码覆盖率报告。
4. 将代码覆盖率报告图形化展示出来,如html、xml等文件格式。

插桩原理

Alt text主流代码覆盖率工具都采用字节码插桩模式,通过钩子的方式来记录代码执行轨迹信息。其中字节码插桩又分为两种模式On-The-Fly和Offine。On-The-Fly模式优点在于无需修改源代码,可以在系统不停机的情况下,实时收集代码覆盖率信息。Offine模式优点在于系统启动不需要额外开启代理,但是只能在系统停机的情况下才能获取代码覆盖率。

On-The-Fly 插桩 Java Agent

  • JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序。
  • 代理程序在每装载一个class文件前判断是否已经转换修改了该文件,如果没有则需要将探针插入class文件中。
  • 代码覆盖率就可以在JVM执行代码的时候实时获取。
  • 典型代表:Jacoco

On-The-Fly 插桩 Class Loader

  • 自定义ClassLoader实现自己的类装载策略,在类加载之前将探针插入class文件中。
  • 典型代表:Emma

Offine 插桩

  • 在测试之前先对文件进行插桩,生成插过桩的class文件或者jar包。执行插过桩的class文件或者jar包之后,会生成覆盖率信息到文件。最后统一对覆盖率信息进行处理,并生成报告。
  • Offline插桩又分为两种:
    • Replace:修改字节码生成新的class文件
    • Inject:在原有字节码文件上进行修改
  • 典型代表:Cobertura

On-The-Fly 和 Offine 比较

  • On-The-Fly模式更加方便的获取代码覆盖率,无需提前进行字节码插桩,可以实时获取代码覆盖率信息
  • Offline模式适用于以下场景:
    • 运行环境不支持java agent
    • 部署环境不允许设置JVM参数
    • 字节码需要被转换成其他虚拟机字节码,如Android Dalvik VM
    • 动态修改字节码过程和其他agent冲突
    • 无法自定义用户加载类

实践应用

单元测试覆盖率

这里我们选取Sonar+Cobertura来获取单元测试覆盖率。 我们将代码覆盖率绑定到代码编译阶段,这样每次代码编译就能够执行单元测试同时获取代码单元测试覆盖率。

<plugin>  
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>cobertura-maven-plugin</artifactId>
    <version>2.7</version>
    <configuration>
        <formats>
            <format>xml</format>
        </formats>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>cobertura</goal>
            </goals>
        </execution>
    </executions>
</plugin>  

生成代码覆盖率文件以后,通过Jenkins SonarQube Scanner或者执行mvn sonar:sonar将该文件上传至Sonar服务器,就可以解析该文件,生成图形化的界面。

集成测试覆盖率

测试人员执行集成测试测试用例时(包括手工执行和自动化执行),我们需要代码覆盖率来发现测试用例设计的遗漏,及时补充用例来覆盖未被测试到的代码。

被测系统在服务启动时,都会通过javaagent的方式做On-The-Fly插桩。

  • 被测服务器启动之后,测试人员手工执行测试用例,Jacoco Agent会实时将代码覆盖率信息传输给Jacoco Prase Server,该服务器保存了被测代码源文件以及编译后的目标文件,服务器会结合源文件、目标文件以及代码覆盖率信息生成图表化的覆盖率文件。
  • 自动化测试用例执行完成之后,获取代码覆盖率信息,通过Jenkins Jacoco插件解析,获取图表化的覆盖率文件。获取代码覆盖率报告之后,结合git获取的本次代码变动信息,得到测试用例覆盖的变动文件测试覆盖率统计信息,来分析是否有由于测试用例设计遗漏导致的代码没有覆盖或者是开发的无效代码导致该代码无法被覆盖。如果是测试用例设计有所遗漏,可以对照的增加相应的用例;如果是无效代码,可以删除。

自动化集成流程

Alt text1. 业务开发完成之后,开发人员做单元测试。单元测试完成之后,保证单元测试全部通过同时单元测试代码覆盖率达到一定程度(这个需要开发和测试约定,理论上越高越好),开发提测。
2. 测试人员根据测试用例进行测试(包括手工测试和自动化测试),结合git获取本次变动代码的覆盖率信息。行覆盖率需达到100%,分支覆盖率需达到50%以上,这个需要具体场景具体分析。
3. 测试通过之后,代码合并至主干,进行自动化测试回归。
4. 回归测试通过之后,代码可以上线。

基于这套流程,我们可以将单元测试代码覆盖率和集成测试代码覆盖率整合到持续集成流程中。如果代码覆盖率达不到我们设置的某个值时,可以终止流程继续下去;或者需要人工确认之后,继续流程。

总结

本文主要介绍了Java代码覆盖率统计原理以及结合工程实践介绍了代码覆盖率该如何应用到实际测试中。不管是白盒测试还是黑盒测试,代码覆盖率统计都是必不可少的一环,它可以直接反映本次测试的遗漏点(不是100%反映)。结合到自动发布场景也是一个较好的衡量指标。

最后再重申一下本文开篇的观点:

  • 代码覆盖率统计是用来发现没有被测试覆盖到的代码
  • 代码覆盖率统计不能完全用来衡量代码质量
Java单元测试代码覆盖率-JaCoCo
08-03
NULL 博文链接:https://rensanning.iteye.com/blog/2002371
【腾讯TMQ】JAVA代码覆盖率工具JaCoCo-原理篇
热门推荐
TMQ1225的博客
08-16 1万+
如果你的项目是JAVA的,相信我~,覆盖率工具选择JaCoCo是一个非常明智的选择。
软件测试基础 - 测试覆盖率
测试界的彭于晏的博客
09-26 1万+
一、覆盖率概念 覆盖率是用来度量测试完整性的一个手段,是测试技术有效性的一个度量。分为:白盒覆盖、灰盒覆盖和黑盒覆盖;测试用例设计不能一味追求覆盖率,因为测试成本随覆盖率的增加而增加。 覆盖率=(至少被执行一次的item数)/item的总数 二、白盒覆盖率*** 白盒测试时基于程序结构的逻辑驱动测试,白盒覆盖中最常见的是逻辑覆盖(也叫代码覆盖或结构化覆盖),逻辑覆盖包括:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。 1.语句覆盖(Statement Coverage) 指在测试时运
java覆盖是指什么_测试覆盖(率)到底有什么用?
weixin_36221113的博客
03-02 635
引言经常有人问我这样的问题:“我们在做单元测试,那测试覆盖率要到多少才行?”。而我的答案很简单,“作为指标的测试覆盖率都是没有用处的。”Martin Fowler(重构那本书的作者)曾经写过一篇博客来讨论这个问题,他指出:把测试覆盖作为质量目标没有任何意义,而我们应该把它作为一种发现未被测试覆盖的代码的手段。Brian Marick(敏捷宣言最早的17个签署人之一)也说过,作为一名程序员,我当然期...
Java代码覆盖率是什么意思?什么是JIT编译器,它是如何工作的?
最新发布
WangYaolove1314的博客
01-25 804
在静态代理中,我们需要手动编写一个代理类,该类实现与原始对象相同的接口,并在其方法内部调用真实对象的方法,同时可以在前后添加额外的操作。Java代码覆盖率是指在执行了一组测试用例之后,这些测试用例对程序源代码的不同方面(如类、方法、语句、条件分支等)的执行情况的一种量化度量。代码覆盖率是一个非常有用的工具,因为它可以帮助开发者评估测试套件的质量,确保尽可能多的代码路径都经过了验证,从而提高软件的质量和可靠性。总之,JIT编译器的目标是在程序运行时找到并优化最耗时的部分,从而达到改善整体性能的目的。
代码覆盖率
我的E家
08-07 1万+
用途 测试覆盖率评价的是测试代码的质量,并不是产品代码的质量 代码覆盖率是一种白盒测试,因为测试覆盖率是评价产品代码类内部的指标,而不是评价系统接口或规约。测试覆盖率尤其用于评价测试代码是否已经覆盖了产品代码所有的路径。 分类 类的覆盖率:类覆盖描熟了项目中多少类已被测试套件访问。   方法覆盖率:方法覆盖率是被访问的方法的百分比。  语句覆盖率:语句覆盖率追踪单条源代
浅谈代码覆盖率
测试蜗牛,一步一个脚印
02-21 1万+
原文   http://tech.youzan.com/code-coverage 引言 经常有人问这样的问题:“我们在做单元测试,那测试覆盖率要到多少才行?”。答案其实很简答,“作为指标的测试覆盖率都是没有用处的。” Martin Fowler(重构那本书的作者)曾经写过一篇博客来讨论这个问题,他指出:把测试覆盖作为质量目标没有任何意义,而我们应该把它作为
什么叫代码覆盖率
Kesa_Kong的专栏
06-14 7337
什么叫代码覆盖率什麼叫代碼覆蓋率?它的作用是什麼?在測試流程過程中,它什麼時候做?另外,有什麼工具可以實現該功能?它與開發代碼中的代碼覆蓋率有什麼區別沒?在測試中的代碼覆蓋率是指,你运行测试用例后,走过了多少句代码,拿这个走到过的代码除以你这个测试对象的代码行数,就是你这次测试代码覆盖率了.比如说,你测试的对象是一个函数,这个函数有100行代码,你所有的测试用例执行完后,走过了60行的代
java 代码覆盖率_代码覆盖率统计
weixin_30990711的博客
02-12 1381
不管是否在项目中起着持续、有效的作用代码覆盖率统计已经成为各产品组必备的工具。凭借丰富的覆盖率度量维度、灵活的数据管理与报告过滤方案和良好的工具支持,Jacoco成为部门内部技术成熟,使用广泛的工具。Jacoco可以嵌入到Ant、Maven中,提供了EclEmma Eclipse插件,也可以使用Java Agent技术监控Java程序;另外还有很多第三方工具支持Jacoco集成,如sonar、J...
代码覆盖率价值的初步认识
大森林的专栏(Jack Wu)
10-28 642
关于代码覆盖率,之前6年的工作经历中,只是依稀听闻过。之前的组织里,从未关注过这个指标,只是有一段时间用NUnit做了单元测试,主要是测试一些关键类关键方法是否正常,对代码覆盖率的印象就真的一直是停留在听闻的程度。汗一个!前些时日,关于自动测试的讨论中有人提及到代码覆盖率,激发了我的好奇,到底什么是代码覆盖率?最重要的是于测试工作而言有怎样的价值呢?今天花了一点时间查了一下,有了初步的认识。大
代码覆盖率工具
11-26
Java单元测试覆盖率工具,该工具包为eclipse插件包,可以很方便的跟eclipse或myeclipse集成,配合junit测试代码覆盖率
java代码覆盖率 jacoco 原理解析
06-13
?????? 有人了解些jacoco的原理,也能够进行些实操,但不能将原理与实操联系起来。为了解决这一问题特为大家输出本课程,以便更好地理解jacoco且在实战中能够得心应手,遇到问题后也能举一反三。同时也希望能够给大家提供一份比较全面的原理文档,尽量方便学者能够快速地入门,以防止花费不必要的时间在网上到处进行搜索、筛选。。。 ?????? 本课程主要针对jacoco的报告、字节码、On-the-fly / Offline 进行重点解析,并通过实操进行演示。能够很好地讲原理与实战联系起来。
Java测试覆盖率工具cobertura1.9
09-08
代码测试覆盖率工具,该工具与ant执行集成,快速简单有效的测试代码的覆盖率,内附测试用例
代码覆盖率浅谈
01-31
在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。于是乎,测试人员费尽心思设计案例覆盖代码。用代码覆盖率来衡量...
浅谈机械制造自动化发展及应用.doc
11-29
浅谈机械制造自动化发展及应用.doc
浅谈物联网技术及应用
01-19
摘要: 介绍了物联网的概念、发展与应用前景。以物联网的关键技术为基础, 阐述物联网在人们生产生活等领域的典型应用, 探究物联网的发展方向。  1 物联网的概念  物联网是在计算机互联网的基础上, 利用射频...
浅谈LED景观照明智能控制及应用
01-19
 LED以其节能环保、寿命长、可靠性高、色彩丰富、易控制(响应迅速、便于非标设计及超长跨距控制)等特点,在我国各大中城市景观照明中得到了广泛应用。在北京奥林匹克公园,夜晚的“水立方”(国家游泳中心)...
单元测试——覆盖率测试
迷路的小绅士之家
10-05 3226
一、语句覆盖率 计算方式:被测语句/全部语句 全部语句要求:非分支,非判断 num = int(input("请输入数字:")) #① if num>0: num+=1 #② else: num-=1 #③ 二、分支覆盖率 计算方式:被测分支/全部分支 任意输入一个数,不能能分支故覆盖100% 三、条件覆盖率 什么是条件:结果为true或false # 请输入用户名和密码...
浅谈电子地图的应用现状及发展前景
06-09
电子地图在现代社会中已经得到广泛的应用,随着技术的不断发展,其应用前景也越来越广阔。 目前,电子地图主要应用于以下几个方面: 1.导航和定位服务:如百度地图、高德地图等,提供实时的交通路况和导航服务。 2.旅游和出行指南:如谷歌地图、携程旅游等,提供周边景点、餐饮、住宿等信息。 3.物流和快递配送:如顺丰快递、菜鸟物流等,通过电子地图实现快递的实时跟踪和配送路径规划。 4.城市规划和管理:如城市地理信息系统(GIS),通过电子地图对城市进行规划、管理和监测。 未来,随着5G、人工智能等技术的不断发展,电子地图将在以下几个方面得到进一步的应用: 1.智能化导航:基于人工智能技术,实现更加智能、便捷、精准的导航服务。 2.增强现实应用:基于AR技术,将电子地图与实际场景进行结合,实现更加直观、生动的地图应用。 3.智慧城市建设:通过电子地图,实现城市管理的智能化、精细化、高效化。 总的来说,电子地图的应用前景十分广阔,其在各个领域都有着重要的作用和不可替代的地位。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 浏览器输入URL后发生了什么? 77847
  • 程序设计-求N个数的中位数(C++) 75726
  • 算法 - 折半查找(C#) 72342
  • 算法 - 快速排序(C#) 70907
  • 算法 - 插入排序(C#) 70032

分类专栏

  • Yuuuuuue 7篇
  • Design Pattern 28篇
  • Programming Design 35篇
  • Coding Interview Guide 264篇
  • Sword To Offer 80篇
  • Data Structure & Algorithm
  • Data Structure 46篇
  • Algorithm 44篇
  • Programming Language
  • Java 274篇
  • Python 49篇
  • C 51篇
  • C# 6篇
  • C++ 21篇
  • JavaScript 1篇
  • R&D 25篇
  • Test 92篇
  • Web 12篇
  • Data 74篇
  • OS 10篇
  • Product 8篇
  • Operation 48篇
  • Brain Teaser 2篇

最新评论

  • 设计模式 - 创建型设计模式 - 原型模式(Java)

    敲键盘的小夜猫: 这篇博客真是写得太棒了!让读者能够从中获取丰富的知识和灵感。 【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 设计模式 - 结构型设计模式 - 享元模式(Java)

    敲键盘的小夜猫: 这篇博客真是写得太棒了!作者对技术领域的了解和热情让人感到钦佩。文章内容丰富详实,探讨了一个热门话题,不仅解释了技术原理,还提供了实用的应用案例和解决方案,让读者能够从中获取丰富的知识和灵感。 【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • Cron表达式详解

    做人,最重要的就是开心嘛: 是我写错了,文章已修正,感谢您的细心指出表情包表情包

  • Cron表达式详解

    Starry-Lin: 老师,第三个例子少了一个月 表示2002-2006年的每个月的最后一个星期五上午10:15执行是不是0 15 10 ? * 6L 2002-2006

  • 浏览器输入URL后发生了什么?

    我是不会赢的dhdhdvdg: 写的非常清晰

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Linux安装JDK8
  • MobaXterm使用Lrzsz上传下载文件(rzsz)
  • 树中两个结点的最低公共祖先-C++
2024
04月 2篇
03月 3篇
02月 78篇
2023年140篇
2022年248篇
2021年184篇
2020年59篇
2019年393篇
2018年15篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

聚圣源培训发展起名罗生门就这样恋着你医药股票龙头股爱乐透万博门户新世界电视剧在线观看铁姓男孩起名穿到六零当姑奶奶姚姓男宝起名字大全软著名称怎么起巴塞尔委员会清梦压星河po饭店起名小饭店曹起名大全男名字武汉建材批发市场肉夹馍门店起名字大全绝对英雄改造计划谌氏起名大全男孩起名字姓苏个独起名丁字裤啦养殖场起名网免费取名医疗器械公司起名字好听起一个比较古风的名字根据父母名字起名软件松字起名陈姓起名字女孩名字易经专业八字起名起名 笔划WIN11安装助手淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化