百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

JaCoCo入门

liuian 2025-01-13 15:28 42 浏览

概述

代码覆盖率是一种指标度量自动化用例测试执行时,有多少行代码被覆盖到。

这篇文章将带大家漫步JaCoCo使用的常用知识点--生成一个Java项目的代码覆盖率报告。


Maven配置

为了用JaCoCo执行,我们需要在pom.xml中声明Maven JaCoCo插件


<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.7.201606060606</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

最新版:https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.jacoco%22%20AND%20a%3A%22jacoco-maven-plugin%22

代码覆盖率报告

在我们开始学习JaCoCo之前,我们需要准备一段待测代码。这里准备一个简单函数用来检验字串是不是回文(不论是从左向右顺读,还是从右向左倒读,结果都是一样)。


public boolean isPalindrome(String inputString) {
    if (inputString.length() == 0) {
        return true;
    } else {
        char firstChar = inputString.charAt(0);
        char lastChar = inputString.charAt(inputString.length() - 1);
        String mid = inputString.substring(1, inputString.length() - 1);
        return (firstChar == lastChar) && isPalindrome(mid);
    }
}

现在我再准备一个简单的JUnit测试用例:

@Test
public void whenEmptyString_thenAccept() {
    Palindrome palindromeTester = new Palindrome();
    assertTrue(palindromeTester.isPalindrome(""));
}

mvn clean install执行测试用例,将自动启动JaCoCo agent。将会在target目录下生成二进制覆盖率报告-- target/jacoco.exec

如果你使用IDEA你就可以直接看到HTML报告,

target/site/jacoco/index.html

报告样子如下:

点击链接,可以查看详细报告:

如果你用的是Eclipse,你要安装EclEmma Eclipse plugin。

报告分析

我的报告显示指令覆盖率为21%,分支覆盖率为17%,3/5为圈复杂度等等。

报告中显示38条指令是字节码指令而不是Java代码指令。JaCoCo报告用钻石图标和代码背景色帮助更好地理解覆盖率。

  • 红色钻石代表没有没有分支被执行到
  • 黄色钻石代表仅部分分支被执行到
  • 绿色钻石代表所有分支都有执行到

JaCoCo提供了以下三种重要指标:

  • 行覆盖率
  • 分支覆盖率
  • 圈复杂度 根据由McCabe1996圈复杂度的定义是,在(线性)组合中,计算在一个方法里面所有可能路径的最小数目。 举个例子,如果没有if或者switch圈复杂度为1.我们只要一条路径就可以覆盖代码换句话说圈复杂度是覆盖所有代码的最小用例数。

原理

JaCoCo以Java agent的形式运行,当执行用例时负责调试字节码,跟踪每个指令,显示那些代码行被执行过。

为了采集覆盖率数据,JaCoCo在on the fly模式下,用ASM来调试代码,接收JVM Tools Interface来的事件。

JaCoCo除了on the fly模式还有offline模式。 这里就不解了。


代码覆盖率
现在我们对JaCoCo原理有了那么一点儿理解,我们现在提高代码覆盖率。

为了达到100%,我们要增加以下用例:


@Test
public void whenPalindrom_thenAccept() {
    Palindrome palindromeTester = new Palindrome();
    assertTrue(palindromeTester.isPalindrome("noon"));
}
    
@Test
public void whenNearPalindrom_thanReject(){
    Palindrome palindromeTester = new Palindrome();
    assertFalse(palindromeTester.isPalindrome("neon"));
}


我们再执行一次mvn clean install确保覆盖率达到了100%。

看行、分支、路径都完全覆盖了。

在真实的项目中覆盖率不可能做到100%,我们通常会设置一个最低的标准,达不到构建就会失败。

在pom.xml中增加 check goal

<execution>
    <id>jacoco-check</id>
    <goals>
        <goal>check</goal>
    </goals>
    <configuration>
        <rules>
            <rule>
                <element>PACKAGE</element>
                <limits>
                    <limit>
                        <counter>LINE</counter>
                        <value>COVEREDRATIO</value>
                        <minimum>0.50</minimum>
                    </limit>
                </limits>
            </rule>
        </rules>
    </configuration>
</execution>

我们设置的最低覆盖率为50%。执行

 mvn clean verify

验证是否生效。

总结

通过学习,我们学会了怎么用JaCoCo生成代码覆盖率报告。切记在项目中100%覆盖率不是必须的。

示例代码:

https://github.com/eugenp/tutorials/tree/master/testing-modules/testing-libraries

相关推荐

无法连接到这个网络是怎么回事

有可能是网络本身有问题,需要联系运营商解决。也有可能是因为网卡驱动问题,首先鼠标右击开始按钮,然后点击设备管理器,双击网络适配器,最后查看网卡驱动有没有出现黄色的感叹号,如果有的话,右击选择更新驱动程...

刷机精灵怎么解除锁屏密码(刷机精灵怎么解除锁屏密码设置)

刷机精灵解锁手机锁屏密码方法:下载好刷机精灵。打开链接手机,之后在刷机精灵页面里能看到“实用工具”的选项。解除手机解锁图案要获取root权限,若没有获取的可以在这里点击获取root权限的选项。获取了...

联想云服务官网(联想云服务官网查找手机)

华为手机也是可以下载云服务软件安装然后使用联想账号登陆云服务的。部分云服务功能将无法使用。登录联想云服务方法:点开云服务软件,选择立即使用,即出现:手机号码登入,邮箱登入,第三方登入;手机号码登入,邮...

宏基笔记本系统重装快捷键(宏基笔记本重装系统步骤)

如果用系统u盘、光盘安装:1、需要在Bios中设置从u盘或光盘启动。2、启动电脑,dcer一般默认按Del键(有些型号F2、F12)进入Bios设置界面。F2键。宏碁笔记本重装系统按F2键,进入BIO...

windows10官网打不开(win10系统官网打不开)

你可以通过以下步骤在Windows10官网上更新操作系统:1.打开windows官网,进入“下载和工具”页面。2.单击“立即下载工具”按钮,将下载“Windows10更新助手”。3.运行“...

win7无线网卡插上没反应(win7无线网卡插上没反应怎么回事)

1、如果是路由器的问题,如果原来可以用,暂时不能用了,在有就是恢复出厂设置,从新设置就可以用了(这是在物理连接正确的前提下)。2、如果是宽带本身的问题,首先直接联接宽带网线测试,如果是宽带的问题,联系...

下载爱奇艺安装(下载爱奇艺安装包)

如果你的电脑无法安装爱奇艺,可能有以下原因,第一种原因可能是你的电脑系统版本太低,升级你的电脑操作系统,可以促进爱奇艺的下载,第二种情况是你下载的爱奇艺可能捆绑一些病毒软件,系统的杀毒软件识别有霸王软...

5000元左右的电脑配置单(5000左右的电脑配置推荐2021)

五千元至六千元价位电脑主机,如果组装机,可以配置配置很高的档次,电脑主机主板可以配置不低于十二代产品,可以设四个内存条插槽,相应的内存可以配置128GB内存条2至四根,电脑处理器也同样不低于十二代产品...

快速关机(快速关机按什么键)
快速关机(快速关机按什么键)

1、我们直接长按手机右侧的电源键,大概5秒的时间,这时候手机页面会直接显示是否关机,选择关机就可以直接关机了。2、找到手机一侧的音量“+”键,再找到电源按键,之后只需同时按住音量“+”键和电源按钮,直到手机屏幕关闭即可强制关机。3、点击【设...

2025-12-25 08:05 liuian

云电脑免登录破解版(“云电脑破解版”)

虎牙YOWA云游戏平台便是一款完全免费的产品,只要玩家在自己的账号上购买过相关的产品即可通过云游戏平台直接登陆。但云游戏平台终归只是改变玩家的游戏方式,用户最终还是要回归于游戏中,如果难以保证游戏体验...

联想家庭版win7(联想家庭版笔记本电脑)

1、开机到欢迎界面时,按Ctrl+Alt+Delete,跳出帐号窗口,输入用户名:administrator,回车。2、如果这个帐号也有密码采用开机启动时按F8选“带命令行的安全模式”。3、选“Ad...

两台电脑怎么传文件最快(两台电脑怎么传文件比较快)

两台电脑之间传递文件可以有很多种方法。如果两台电脑同时在1栋楼或者一间办公室内,可以用U盘拷贝的方法传递文件。另外最快的方法还可以用通过邮箱、微信、QQ传送文件,那样速度更快,节省时间,又节省距离。将...

win7计算机图标怎么弄出来(win7怎么设置计算机图标)

您好,如果您的Win7桌面图标不见了,可以尝试以下方法:1.右键点击桌面的空白处,点击查看之后点击显示桌面图标。2.如果第一种方法不起作用,可以使用组合键“ctrl键+alt键+delete键”,...

usb打印机改wifi打印机(usb打印机改无线网络打印机)

首先要把打印机通过USB端口连接到路由器上,连接成功后路由器上的USB指示灯会亮。然后在需要使用网络打印机的电脑上安装打印机的驱动程序,这样才能够正常使用打印服务器连接的打印机。登录路由器,在左侧的系...

windows7没pdf打印机(win7系统自带的打印pdf找不到了)

建议安装Acrobat9,并安装9.1.3的AdobeReader/Acrobat的更新,去官网搜索即可,如果现有版本是9.1.0,则9.1.2和9.1.3的更新均需要安装.我实验的结果时9.0...