java 单元测试覆盖率调研

这篇具有很好参考价值的文章主要介绍了java 单元测试覆盖率调研。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、覆盖率工具对比

根据网上的资料搜索发现,现在常用的 java 单元测试覆盖率工具主要有:

    • Emma
    • Cobertura
    • Jacoco
    • Clover(商用)
工具 Jacoco Emma Cobertura
原理 使用 ASM 修改字节码 修改 jar 文件,class 文件字节码文件 基于 jcoverage,基于 asm 框架对 class 文件插桩
覆盖粒度 行,类,方法,指令,分支 行,类,方法,基本块,指令,无分支覆盖 项目,包,类,方法的语句覆盖/分支覆盖
插桩 on the fly、offline on the fly、offline offline,把统计代码插入编译好的class文件中
生成结果 在 Tomcat 的 catalina.sh 配置 javaangent 参数,指出需要收集覆盖率的文件,shutdown 时才收集,只能使用 kill 命令关闭 Tomcat,不要使用 kill -9 html、xml、txt,二进制格式报表 html,xml
缺点 需要源代码 1、需要 debug 版本,并打来 build.xml 中的 debug 编译项; 2、需要源代码,且必须与插桩的代码完全一致 1、不能捕获测试用例中未考虑的异常; 2、关闭服务器才能输出覆盖率信息(已有修改源代码的解决方案,定时输出结果;输出结果之前设置了 hook,会与某些服务器的 hook 冲突,web 测试中需要将 cobertura.ser 文件来回 copy
性能 小巧 插入的字节码信息更多
执行方式 maven,ant,命令行 命令行 maven,ant
Jenkins 集成 生成 html 报告,直接与 hudson 集成,展示报告,无趋势图 无法与 hudson 集成 有集成的插件,美观的报告,有趋势图
报告实时性 默认关闭,可以动态从 jvm dump 出数据 可以不关闭服务器 默认是在关闭服务器时才写结果
维护状态 持续更新中 停止维护 停止维护,不支持java1.8的lamda表达式

指令覆盖:Jacoco计算的最小单位就是字节码指令。指令覆盖率表明了在所有的指令中,哪些被指令过以及哪些没有被执行。这项指数完全独立于源码格式并且在任何情况下有效,不需要类文件的调试信息。
行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。

红色背景:无覆盖,该行的所有指令都没有执行
黄色背景:部分覆盖,该行的部分指令被执行
绿色背景:全覆盖,该行的所有指令被执行

类覆盖率:度量计算class类文件是否被执行。
分支覆盖率:度量if和switch语句的分支覆盖情况,并且计算一个方法里的总分支数,确定执行和不执行的分支数量。
其中在有调试信息
 

根据上述对比,本次调研选用 jacoco 来进行单元测试覆盖率的工具

2、jacoco单元测试覆盖率工具使用步骤如下:

1、添加插件

<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.7</version>
                <configuration>
                    <excludes>
                        <!-- 这里配置我们想要排除的包路径-->
                        <exclude>com/tm/test/*</exclude>
                        <!-- 通过通配符来排除指定格式的类-->
                        <exclude>**/*Tests.class</exclude>
                    </excludes>
                </configuration>
                <executions>
                    <execution>
                        <id>prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>report</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>

                        <configuration>
                            <!--定义输出的文件夹-->
                            <outputDirectory>target/jacoco-report</outputDirectory>
                            <!--执行数据的文件-->
                            <dataFile>${project.build.directory}/jacoco.exec</dataFile>
                            <!--要从报告中排除的类文件列表,支持通配符(*和?)。如果未指定则不会排除任何内容-->
                            <!--                            <excludes>**/test/*.class</excludes>-->
                            <!--包含生成报告的文件列表,支持通配符(*和?)。如果未指定则包含所有内容-->
                            <!--                            <includes></includes>-->
                            <!--HTML 报告页面中使用的页脚文本。-->
                            <!--                            <footer></footer>-->
                            <!--生成报告的文件类型,HTML(默认)、XML、CSV-->
                            <formats>HTML</formats>
                            <!--生成报告的编码格式,默认UTF-8-->
                            <outputEncoding>UTF-8</outputEncoding>
                            <!--抑制执行的标签-->
                            <!--                            <skip></skip>-->
                            <!--源文件编码-->
                            <sourceEncoding>UTF-8</sourceEncoding>
                            <!--HTML报告的标题-->
                            <title>${project.name}</title>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

2、对要测试代码编写单元测试用例

要测试代码

public class MessageBuilder {
    public String getMessage(String name) {
        StringBuilder result = new StringBuilder();
        if (name == null || name.trim().length() == 0) {
            result.append("empty");
        } else {
            result.append("Hello+").append(name);
        }
        return result.toString();
    }
}


单元测试用例,写在test/java 目录下

import org.junit.Assert;
import org.junit.Test;

public class MessageBuilderTest {
    MessageBuilder messageBuilder = new MessageBuilder();

    @Test
    public void testGetMessage() throws Exception {
        String result = messageBuilder.getMessage("name");
        Assert.assertEquals("Hello+name", result);
    }

    @Test
    public void testGetMessage2() throws Exception {
        String result = messageBuilder.getMessage("");
        Assert.assertEquals("empty", result);
    }
    
}

3、执行单元测试,获取覆盖率

可以这样

java 单元测试覆盖率调研,覆盖率,jacoco,测试覆盖率

或者直接命令行执行 mvn clean test

执行结果显示在target/jacoco-report 下,可以 使用浏览器打开 index.html查看覆盖率情况

java 单元测试覆盖率调研,覆盖率,jacoco,测试覆盖率

java 单元测试覆盖率调研,覆盖率,jacoco,测试覆盖率

可以看到部分代码未覆盖成功

增加测试用例

@Test
    public void testGetMessage3() {
        String a =null;
        String result = messageBuilder.getMessage(a);
        Assert.assertEquals("empty", result);
    }


重新执行可以看到覆盖率已经达到 100%

java 单元测试覆盖率调研,覆盖率,jacoco,测试覆盖率

此外,jacoco 还可以指定对那些类进行单元测试覆盖,哪些进行排除

java 单元测试覆盖率调研,覆盖率,jacoco,测试覆盖率

当前其他主流代码覆盖率工具

不同语言有不同的代码覆盖率工具,大家在选择的时候最好选择那种社区活跃度高、开源和网上评论好的工具。

java 单元测试覆盖率调研,覆盖率,jacoco,测试覆盖率

另:需要思考的是,需要使用 jacoco 代理方式实现无侵入式的覆盖率统计,增量代码覆盖率等文章来源地址https://www.toymoban.com/news/detail-527130.html

到了这里,关于java 单元测试覆盖率调研的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何有效保证Java代码单元测试覆盖率

    我们在实际项目开发过程中,不同level的童鞋由于专业技能的层次不同,导致在参与实际开发的业务代码中经常会出现各种bug,项目管理中好的pm或许会给充足的时间来让开发童鞋们定位修复这些bug,也有各种客观原因的PM不会在项目中预留这些时间,往往就需要开发自己通过

    2023年04月17日
    浏览(34)
  • maven工程使用jacoco-maven-plugin插件,无法生成覆盖率测试报告问题

    当我们在maven工程中引入maven-surefire-plugin插件执行单元测试代码后,突然发现在集成jacoco-maven-plugin插件生成测试覆盖率报告时,因为插件参数配置问题,发现无法生成测试报告了。 解决方案 此时, 1、我们在jacoco-maven-plugin插件中定于一个属性 propertyNamesurefireArgLine/propertyNam

    2024年02月13日
    浏览(32)
  • 使用 【jacoco】对基于 SpringBoot 和 Dubbo RPC 的项目生成测试覆盖率报告:实践+原理

    基于 Dubbo RPC 的项目中有一个提供者项目backend、一个消费者项目gateway、以及注册中心nacos。本篇文章记录在windows本地对该框架的测试过程,以及介绍jacoco的基本原理 官网下载安装包解压到本地,https://www.jacoco.org/jacoco/ 只需要用到jacoco/lib 文件夹中的 jacocoagent.jar 以及jacococl

    2024年02月09日
    浏览(29)
  • IDFA 单元测试以及单元测试覆盖率步骤

    1、新建java类 随意选择java类文件,新建一个Java类CountVowel,用来统计字符串中元音的个数,代码如下: 2、生成测试类 一)、对写好的类新建测试类,有以下两种方法: 将鼠标光标移动到类名上,使用 Alt+Enter 组合键,如下图,选择 Create Test ,从而新建一个测试类; 右键点

    2024年02月16日
    浏览(29)
  • 如何计算单元测试的覆盖率

    单元测试的覆盖率有:语句覆盖率(即行覆盖率)、分支覆盖率、条件覆盖率、分支条件覆盖率、路径覆盖率等。 语句覆盖率 所谓语句就是那些非分支、非判断的语句。 计算公式:程序执行到的语句总数 / 全部语句的总数 分支覆盖率 有判定语句的地方都会出现2个分支。

    2024年01月21日
    浏览(40)
  • 单元测试——测试代码功能及代码覆盖率

    目录 目录 前言 一、单元测试是什么? 二、前置准备  三、测试代码  四、示例  五:单元测试覆盖率 单元测试的写法不固定,这里以我自己的一种写法为例,算是很简单的一种写法           单元测试其实就是写一些测试函数,测试代码的功能是否正常运行,一般如果

    2024年02月07日
    浏览(28)
  • Sonarqube-8.9版本测试单元测试覆盖率

    junit testNG Spock Jacoco Cobertura SonarQube 不会运行测试或生成报告。要在分析中包含覆盖结果,需要设置第三方覆盖工具来生成报告并配置 SonarQube 以导入这些报告。 生成单元测试覆盖率需要按照以下步骤操作: SonarQube 使用导入的覆盖率报告中的覆盖行和可执行行(或要覆盖的行

    2024年02月02日
    浏览(42)
  • Lombok导致代码单元测试覆盖率崩塌

    Lombok 由于其使用的便利性, 目前流传非常广泛。甚至有呼声希望其能被Java官方引入,成为JDK的一部分。 当然凡事都有两面性,Lombok的引入也是有代价的。一时注释一时爽,结果导致代码在不知不觉中翻了好几倍。 例如以下几个简单的注解,背后是N多个自动生成的方法: @Da

    2024年02月07日
    浏览(26)
  • 13.Springboot整合junit5单元测试与生成单元测试覆盖率

    现在基本大公司都要求单元测试了,保证我们代码得质量,而我司更是要求覆盖率要达到60%以上,所以搞一下。 这里有两个方法: 1.使用maven自带得test,idea右侧maven模块执行项目下得test 2.使用cmd命令,在你的项目pom文件所在目录 ,打开cmd,执行如下: 结果如下:打开site文

    2024年02月16日
    浏览(30)
  • 【Maven】单元测试、统计、覆盖率相关插件使用介绍

    maven-surefire-plugin 是 maven 执行单元测试的插件,不显性配置也可以直接使用。 这个插件的 surefire:test 命令会默认绑定 maven 执行的 test 阶段。 执行结束后,默认在 target/surefire-reports 目录下会生成 txt 和 xml 两种格式的结果,不利于直观展示,需要结合其它插件一起使用。 如果

    2024年02月08日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包