测试覆盖率统计工具

本文详细介绍了JaCoCo,一个流行的Java代码覆盖率工具,其原理是通过动态修改字节码插入探针。配置方面,讲解了单模块和多模块Maven项目的设置,以及如何生成和查看覆盖率报告。在开发过程中,IDEA原生插件coverage提供了实时的代码覆盖率查看。文章还展示了覆盖率报告的视图,包括指令、分支、行和方法级别的覆盖率,并提供了查看未覆盖代码的方法。

一、工具选型

简介:jacoco(Java code coverage )是目前主流的开源代码覆盖率统计工具(更新最热,github引用最多)。其实现原理(on-the-fly模式)为通过java.lang.instrument包提供的接口,编写jvm代理,在jvm加载字节码时动态修改内容,增加探针指令。

二、代码覆盖率统计原理

处理流程:

 

动态加入代码探针效果:

原代码:

 

经jacoco jvm代理处理后的代码:

 

(实际为字节码,为便于展示,替换为等效的源码)

三、配置

单模块应用maven配置

在项目pom增加maven插件

<plugin>
	<groupId>org.jacoco</groupId>
	<artifactId>jacoco-maven-plugin</artifactId>
	<executions>
		<execution>
			<id>prepare-unit-tests</id>
			<goals>
				<!--default bound to phase:initialize-->
				<goal>prepare-agent</goal>
			</goals>
		</execution>
		<execution>
			<id>report-when-test</id>
			<phase>test</phase>
			<goals>
				<goal>report</goal>
			</goals>
		</execution>
	</executions>
</plugin>

此配置的作用是在maven生命周期的initialize阶段执行prepare-agent,修改字节码加入探针;在生命周期的test阶段执行report,生成报告。

多模块应用maven配置

在父pom配置jacoco插件

<plugin>
	<groupId>org.jacoco</groupId>
	<artifactId>jacoco-maven-plugin</artifactId>
	<executions>
		<execution>
			<id>prepare-unit-tests</id>
			<!--default bound to phase:initialize-->
			<goals>
				<goal>prepare-agent</goal>
			</goals>
		</execution>
	</executions>
</plugin>

这一步的作用是在应用启动的时候附加上-javaagent参数,对字节码做修改,加入探针

新增test-reporting子模块

子模块只包含一个pom文件,包含两块配置:

依赖所有其他模块

    <dependencies>
        <dependency>
            <groupId>com.zhengwenbin</groupId>
            <artifactId>module1</artifactId>
            <version>${my.project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.zhengwenbin</groupId>
            <artifactId>module2</artifactId>
            <version>${my.project.version}</version>
        </dependency>
    </dependencies>

此配置的作用是,将各个模块的测试报告汇总到一处。(jacoco官方提供汇总多模块应用测试报告的方法)

配置jacoco插件

    <build>
        <plugins>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>report-aggregate</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report-aggregate</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>merge-results</id>
                        <phase>test</phase>
                        <goals>
                            <goal>merge</goal>
                        </goals>
                        <configuration>
                            <fileSets>
                                <fileSet>
                                    <directory>${code.coverage.project.folder}</directory>
                                    <includes>
                                        <include>**/target/jacoco.exec</include>
                                    </includes>
                                </fileSet>
                            </fileSets>
                            <destFile>${code.coverage.overall.data.folder}/aggregate.exec</destFile>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

此配置的作用是,将各个模块的测试报告聚合,并将生成报告动作绑定到test阶段

多模块应用配置示例:

四、使用

在项目pom.xml目录下执行命令:

mvn clean test

五、结果查看

覆盖率报告html

查看覆盖率

jacoco插件report/report-aggregate命令会在各个模块的target目录生成site文件夹,进入site/jacoco文件夹,使用浏览器打开index.html。(对于多模块应用,site目录只会显示该模块依赖的模块代码覆盖率,因此需要进入test-reporting模块查看所有报告)

 

可以看到指令、分支、行、方法、类级别的代码覆盖率报告。(默认只显示指令覆盖率百分比,没有找到jacoco显示其他参数百分比的配置项)

查看未覆盖的代码行

在element列不断点击链接,可看到不同层级的代码覆盖率,最终可以看到代码行的指令覆盖情况:

  • 绿色表示完全覆盖
  • 红色表示未覆盖
  • 黄色表示部分覆盖

 

多模块聚合报告.exec文件

对于多模块应用,在html报告中只能看到分模块的覆盖率。若要查看根据类路径聚合的测试报告,需要使用IDE或者jar包工具,打开jacoco.exec文件。

  • 文件地址:多模块项目根目录/target/jacoco.exex
  • 打开方式:idea →Run → Show Coverage Data → 点击+号,选择jacoco.exec文件;最终展示如下:

点击按钮,可以生成html版本的报告

 

六、开发者工具

idea原生插件coverage

上述代码覆盖率报告适用于生成最终验收报告,实际开发过程中,可以使用ide工具来为每一次运行生成覆盖率报告,并将行覆盖情况显示在ide编辑器中。使用ide生成测试覆盖率报告,无需任何pom配置。

官方文档:https://www.jetbrains.com/help/idea/code-coverage.html

新增junit run configuration

 

以覆盖率工具方式运行测试用例

 

或者选中测试用例,点击小盾牌按钮

 

运行后,将弹出窗口,要求选择如何显示覆盖率数据,选择替换;coverage窗口将自动弹出。

查看代码覆盖情况:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值