jacoco生成覆盖率报告的几种方式

11 篇文章 0 订阅
10 篇文章 0 订阅

1.本地跑maven项目集成jacoco获取单元测试代码覆盖率,在pom.xml的build标签里面增加该插件
            

<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.8</version>
                <executions>
                    <!--这里的execution ,每一个执行的goal,对应的id必须是唯一的 -->
                    <!-- prepare-agen这个就相当于插桩,发生在default生命周期的initialize阶段 -->
                    <execution>
                        <id>prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <!--这个check:对代码进行检测,控制项目构建成功还是失败 -->
                    <!-- <execution>
                        <id>check</id>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution> -->
                    <!--这个report:对代码进行检测,然后生成index.html在 target/site/index.html中可以查看检测的详细结果 -->
                    <!-- report这个就是生成代码覆盖率报告,发生在default生命周期的verify阶段 -->
                    <execution>
                        <id>report</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>

                    </execution>
                    <!-- <execution> <id>post-unit-test</id> <phase>test</phase> <goals> 
                        <goal>report</goal> </goals> <configuration> <dataFile>target/jacoco.exec</dataFile> 
                        <outputDirectory>target/jacoco-ut</outputDirectory> </configuration> </execution> -->
                </executions>
                <!-- <configuration> <systemPropertyVariables> <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile> 
                    </systemPropertyVariables> </configuration> -->
                <!-- Configuration 里面写配置信息 -->
                <configuration>
                    <!-- rules里面指定覆盖规则 -->
                    <rules>
                        <rule implementation="org.jacoco.maven.RuleConfiguration">
                            <element>BUNDLE</element>
                            <limits>
                                <!-- 指定方法覆盖到80% -->
                                <limit implementation="org.jacoco.report.check.Limit">
                                    <counter>METHOD</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>0.80</minimum>
                                </limit>
                                <!-- 指定指令覆盖到80% -->
                                <limit implementation="org.jacoco.report.check.Limit">
                                    <counter>INSTRUCTION</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>0.80</minimum>
                                </limit>
                                <!-- 指定行覆盖到80% -->
                                <limit implementation="org.jacoco.report.check.Limit">
                                    <counter>LINE</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>0.80</minimum>
                                </limit>
                                <!-- 指定类覆盖到100%,不能遗失任何类 -->
                                <limit implementation="org.jacoco.report.check.Limit">
                                    <counter>CLASS</counter>
                                    <value>MISSEDCOUNT</value>
                                    <maximum>0</maximum>
                                </limit>

                            </limits>
                        </rule>
                    </rules>
                </configuration>
            </plugin>

2.服务器跑jacoco获取部署的服务代码覆盖率
    2.1、获取代码覆盖率文件几种方式
    (1)output=file    获取覆盖率文件必须要停掉服务,才能获取
    (2)output=tcpserver    
不需要停服务,直接可以运行中获取代码覆盖率文件,tcpserver这种方式可以作为一个服务器一样,供客户端远程调用ip和制定代理的端口,获取覆盖率exec文件
    (3)output=tcpclient    
不需要停服务,直接可以运行中获取代码覆盖率文件,tcpclient这种方式作为客户端,不断向我们自己部署的代码覆盖率收集服务器发送覆盖率数据,生成覆盖率ex
ec文件
    (4)output=none不输出任何覆盖率文件
    
    2.2、我这里使用output=tcpserver的方式来获取覆盖率文件,操作如下:
        (1)启动服务
            我跑war项目,tomcat服务器增加jvm配置:我是在tomcat目下的bin下的catalina.sh增加的配置
              

# -javaagent: 的后面跟jacoco的安装路径
# includes= 选项,选择你要覆盖率的服务
# port= 选项,选择你要打开的端口
# address= 选项,tomcat服务所在机器的ip地址(如果想在跟tomcat服务同一台机器上执行ant任务的话,需要改为127.0.0.1或者*)
JAVA_OPTS="-javaagent:/path/to/your/jacoco_0.6.4/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8893,address=*"


            如果是jar包,需要直接启动的时候添加JAVA_OPTS参数,例如启动一个springboot项目
                例如:

java  -javaagent:/usr/local/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8045,address=* -jar hello-0.0.1-SNAPSHOT.jar --server.port=9999

        (2)查看是否生效
            ps -ef |grep tomcat
            看到有jacocoagent的配置生效即可
            网上说如果发现启动主程序异常,那么在JAVA_OPTS 配置中国再加一项-Xverify:none,有问题可以试下
        
  
        (3)远程dump出覆盖率exec文件
            方法1:通过ant来执行操作,获取覆盖率exec文件
                在项目目录下加入build.xml文件,直接ant ,多个子项目时可以多加几个配置
                    例如:
                    

<?xml version="1.0" ?>
      <project name="hello" xmlns:jacoco="antlib:org.jacoco.ant" default="jacocoReport">
      <property name="srcPath" value="src/main/java"/>
      <property name="classPath" value="target/classes"/>
      <!--Jacoco ant的安装路径-->
      <property name="jacocoantPath" value="C:\Program Files\jacoco-0.8.2\lib\jacocoant.jar"/>
      <property name="jacocoexecPath" value="./merged.exec"/>
      <property name="workspacePath" value="."/>
      <!--生成覆盖率报告的路径-->
      <property name="reportfolderPath" value="./report"/>
      <!--远程tomcat服务的ip地址-->
      <property name="server_ip" value="47.99.206.219"/>
      <!--前面配置的远程tomcat服务打开的端口,要跟上面配置的一样-->
      <property name="server_port" value="9999"/>
    
      <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
        <classpath path="${jacocoantPath}" />
      </taskdef>
    
      <target name="dump">
        <jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
      </target>
      <target name="merge" depends="dump" >
      	        <jacoco:merge destfile="merged.exec">
      	          <fileset dir="${workspacePath}" includes="**/*.exec"/>
      	        </jacoco:merge>
      </target>
      <target name="jacocoReport" depends="merge">
        <delete dir="${reportfolderPath}" />
        <mkdir dir="${reportfolderPath}" />
    
        <jacoco:report>
          <executiondata>
            <file file="${jacocoexecPath}" />
          </executiondata>
    
          <structure name="JaCoCo Report">
          <group name="testgroupname">
            <classfiles>
              <fileset dir="${classPath}" />
            </classfiles>
            <sourcefiles encoding="utf-8">
              <fileset dir="${srcPath}" />
            </sourcefiles>
          </group>
          </structure>
          <html destdir="${reportfolderPath}" encoding="utf-8" />
        </jacoco:report>
      </target>
    </project>

            
            方法2:通过使用jacocoAPI来发送dump请求,接受返回的覆盖率exec文件
            下面给出一个例子:
            

package com.kang.jacoco;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

import org.jacoco.core.data.ExecutionDataWriter;
import org.jacoco.core.runtime.RemoteControlReader;
import org.jacoco.core.runtime.RemoteControlWriter;
import org.junit.Test;

import com.kang.jacoco.example.ReportGenerator;

/**
 * 测试jacoco  
 * IP:47.99.206.219
 * port:8044
 * @author 67639
 *
 */
public class JacocoTest {
	
	//jacoco覆盖率文件本地生成的地址
	private static final String JACOCOEXEC_DESTFILE = "C:\\Users\\67639\\git\\springboot\\eshop-cache-ha\\jacoco.exec";

	//生成报告的地址
	private static final String REPORT_DIR = "C:\\Users\\67639\\git\\springboot\\eshop-cache-ha";
	
	private static final String ADDRESS = "47.99.206.219";

	private static final int PORT = 9999;
	
	public static void main(String[] args) throws IOException {
		JacocoTest jacocotest =new JacocoTest(); 
		jacocotest.test01();
		jacocotest.test02();
	}
	
	public void test02() throws IOException {
		ReportGenerator report =new ReportGenerator(new File(REPORT_DIR));
		report.create();
		
	}
	
	public void test01() throws IOException {
		final FileOutputStream localFile = new FileOutputStream(JACOCOEXEC_DESTFILE);
		final ExecutionDataWriter localWriter = new ExecutionDataWriter(localFile);

		// Open a socket to the coverage agent:
		final Socket socket = new Socket(InetAddress.getByName(ADDRESS), PORT);
		final RemoteControlWriter writer = new RemoteControlWriter(
				socket.getOutputStream());
		final RemoteControlReader reader = new RemoteControlReader(
				socket.getInputStream());
		reader.setSessionInfoVisitor(localWriter);
		reader.setExecutionDataVisitor(localWriter);

		// Send a dump command and read the response:
		writer.visitDumpCommand(true, false);
		System.out.println("发送dump请求");
		if (!reader.read()) {
			throw new IOException("Socket closed unexpectedly.");
		}
		
		socket.close();
		localFile.close();
	}
	
}

    
    
3.到报告的目录下打开index.html即可查看覆盖率报告


 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Jacoco是一种用于测试覆盖率的工具,可以帮助开发人员分析他们的代码被测试用例覆盖的程度。它可以生成详细的报告,显示代码中哪些部分被测试覆盖到,哪些部分没有被覆盖到。 Jacoco的优势在于它支持多种不同类型的覆盖率分析,包括行覆盖率、分支覆盖率、方法覆盖率和类覆盖率等。它能够帮助开发人员发现代码中的潜在问题和漏洞,改善代码的质量和可靠性。 Jacoco可以与各种不同的开发环境和工具集成,例如Eclipse、Maven和Ant等。它可以很容易地配置和使用,可以通过简单的插件或命令行命令来生成测试覆盖率报告。 通过使用Jacoco,开发人员可以更好地理解他们的代码,找出那些没有被充分测试的部分,并进行调整和改进。测试覆盖率报告可以帮助开发人员决定在哪些地方增加更多的测试用例,从而提高代码的可测试性和质量。 总的来说,Jacoco是一个实用而强大的测试覆盖率工具,可以帮助开发人员提高代码的质量和可靠性。 ### 回答2: Diff Jacoco是指Jacoco代码覆盖率工具中的差异分析功能。Jacoco是一个用于计算代码覆盖率的开源工具,可以帮助开发人员和测试人员分析他们的测试覆盖率并进行相应的调整。 Diff JacocoJacoco工具的一个插件,用于比较两个不同版本的代码覆盖率。当代码发生变更时,可以使用Diff Jacoco来分析这些变更对测试覆盖率的影响。 使用Diff Jacoco,我们可以比较两个版本的代码覆盖率报告,并查看差异部分的覆盖率信息。这样,开发人员可以更好地了解代码的变更对测试覆盖率的影响,从而有针对性地进行测试和调整。 Diff Jacoco会显示出新增的代码覆盖率、删除的代码覆盖率以及修改的代码覆盖率等信息。通过分析这些差异,开发人员可以判断哪些部分的代码需要额外的测试工作,从而提高整体的代码覆盖率。 使用Diff Jacoco可以帮助团队在进行持续集成和持续交付时更好地控制代码质量。通过及时分析差异,并进行相应的测试工作,可以避免新增代码引入的潜在问题,并确保每个版本的代码覆盖率都得到适当关注和提升。 综上所述,Diff JacocoJacoco的一个插件,用于比较不同版本的代码覆盖率。它可以帮助开发人员分析代码变更对测试覆盖率的影响,并进行相应的测试和调整工作,从而提高整体的代码质量。 ### 回答3: Jacoco是一种用于测试覆盖率分析的工具,它可以帮助开发人员评估测试套件的覆盖范围和质量。通过分析被测试代码中的分支和语句覆盖情况,Jacoco可以提供详细的覆盖率报告,并帮助开发人员识别未被充分测试的部分。 与其他测试覆盖率工具相比,Jacoco具有以下几个不同之处: 1. 易于使用和集成:Jacoco可以轻松地与常见的Java构建工具(如Maven和Gradle)集成,并通过插件的形式与各种测试框架(如JUnit和TestNG)搭配使用。这使得开发团队能够方便地将Jacoco集成到他们的开发流程中,并获得覆盖率报告。 2. 精确度和灵活性:Jacoco可以提供详细的覆盖率指标,包括行覆盖率、分支覆盖率、方法覆盖率和类覆盖率等。开发人员可以根据自己的需求选择不同的指标进行分析,以便更好地评估测试的充分性。 3. 对多样性环境的支持:Jacoco不仅支持传统的Java应用程序,还可以用于Android应用程序、OSGi框架和非Java虚拟机(JVM)的项目。这为开发人员提供了在不同环境中进行测试覆盖率分析的选择。 总之,Jacoco是一个强大的测试覆盖率分析工具,它的易用性、精确度和灵活性使得开发人员能够更好地评估测试套件的覆盖范围和质量,提高代码的可靠性和可维护性。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值