代码覆盖Jacoco使用

Jacoco使用

1、前提

项目是微服务架构,CI: 使用jenkins+racher+docker。目前一整套使用已流畅。因需要在测试环境加代码覆盖率进行统计,在不影响正常测试和改变现有部署框架方法下,把Jacoco使用起来

2、了解现状部署方式

部署现状:Jenkins 从git拉取代码 编译是jar包 ,Jenkins使用docker插件生成镜像文件,推送到阿里云上;racher从阿里云上拉取镜像文件部署。

3、使用Jacoco

  • 在官网上下载 https://www.jacoco.org/jacoco/ jacococli.jar 与agent使用官网下载的。选择0.8.7版本

  • 每个微服务pom.xml Dockerfile需要添加Jacoco依赖。考虑到有几十个微服务,在尽可能不改变现有的部署方式,我们通过写一段java代码来完成。只需要在jenkins上配置一段shell来执行这段代码即可。

    echo $WORKSPACE/
    ​
    #把jacocoagent.jar 复制到Dockerfile目录下
    cp -rf ../jacocoagent.jar oms-server/oms-order-server/jacocoagent.jar
    ​
    #能过jacocoTest.jar 传三个参数:Dockerfile文件,端口,pom.xml文件 修改Dockerfile 和pom.xml文件,加入jacoco插件进行编译 并在docker加入jacocoAgent。
    java -jar ../jacocoTest.jar "oms-server/oms-order-server/Dockerfile" "9926" "oms-server/oms-order-server/pom.xml"
    ​
    ​

    jacocoTest.jar自动会在pom.xml文件加入 如下两段内容。

    <dependency>
        <groupId>org.jacoco</groupId>
        <artifactId>org.jacoco.agent</artifactId>
        <version>0.8.7</version>
        <classifier>runtime</classifier>
    </dependency>

    在build模块加入:jacoco插件,参与如下

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                </configuration>
            </plugin>
    ​
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.7</version>
                <executions>
                    <execution>
                        <id>default-instrument</id>
                        <goals>
                            <goal>instrument</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>default-restore-instrumented-classes</id>
                        <goals>
                            <goal>restore-instrumented-classes</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>report</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>check</id>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                </executions>
                <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>
        </plugins>
    </build>
    • jacocoTest.jar自动会修改Dockerfile 文件加入: jacocoagent.jar 和一个新端口 ,EXPOSE 6478 ; 修改ENTRYPOINT 命令。参考如下

    from registry.cn-hangzhou.aliyuncs.com/wljs-ops/openjdk:8u212-b03
    VOLUME /home/app
    ADD target/oms-order-server.jar oms-order-server.jar
    ADD jacocoagent.jar  /tmp/jacocoagent.jar
    EXPOSE 9113
    EXPOSE 9926
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone
    ENV JAVA_OPTS="$JAVA_OPTS-Dfile.encoding=UTF8  -Duser.timezone=GMT+08"
    ENTRYPOINT exec java -javaagent:/tmp/jacocoagent.jar=includes=*,output=tcpserver,port=9926,address=0.0.0.0 -Xms500m -Xmx2g $JAVA_OPTS -Djava.security.edg=file:/dev/./urandom -jar /server.jar

    4、把jacocoagent.jar、jacococli.jar、jacocoTest.jar 传到jenkins机器上。

    5、编译项目成功后,在racher上部署

    【注】在端口Racher映射时,主机监听端口不要与已有项目的冲突。

    6、项目部署成功后,通过在Jenkins机器上执行以下命令

    dump覆盖率数据:java -jar jacococli.jar dump --address 192.168.20.214 --destfile b.exec --port 30202

    生成报告:java -jar jacococli.jar report b.exec --classfiles oms-server/oms-order-server/target/classes/ --html report

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JacocoJava Code Coverage)是一个用于衡量代码覆盖率的工具。它可以帮助开发人员分析代码的测试覆盖情况,从而提供关于测试质量和代码可靠性的指标。 要使用Jacoco来计算代码覆盖率,你需要在项目中集成Jacoco插件并进行配置。具体步骤如下: 1. 在项目的构建文件(如pom.xml或build.gradle)中添加Jacoco插件的依赖。 对于Maven项目,添加以下代码到pom.xml文件中: ```xml <build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.7</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 对于Gradle项目,添加以下代码到build.gradle文件中: ```groovy plugins { id 'jacoco' } jacoco { toolVersion = "0.8.7" } test { jacoco { append = false destinationFile = file("$buildDir/jacoco/test.exec") } } ``` 2. 运行项目的测试套件,生成Jacoco覆盖率数据。 使用命令行或者IDE工具运行项目的测试套件,Jacoco会在测试过程中收集代码覆盖率数据。默认情况下,Jacoco会将数据保存在项目的`target`目录下(Maven项目)或者`build`目录下(Gradle项目)。 3. 生成代码覆盖率报告。 运行以下命令来生成代码覆盖率报告: ```shell mvn jacoco:report ``` 或者 ```shell gradle jacocoTestReport ``` 生成的报告会显示代码覆盖率情况,包括行覆盖率、分支覆盖率、类覆盖率等指标。你可以在报告中查看哪些代码被测试覆盖,哪些代码没有被覆盖到。 希望这能帮助到你!如果有更多关于Jacoco或其他开发工具的问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值