使用jacoco maven插件做单元测试覆盖率统计

1.在项目pom.xml中build->plugins下添加
<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.2</version>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>post-unit-test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            
2.由于项目在编译时会运行单元测试,会将/src/main/resources/lib拷贝到target/classes/lib下,
    运行jacoco插件会检测到lib下jar,这些jar会阻碍jacoco正常执行,具体原因可能有以下:
    1.这些jar与Maven pom.xml依赖引入的包有重复冲突
    2.这些jar本身不能被jacoco探针机制正常注入相关字节码代码

解决思路:阻止/lib下jar文件拷贝到/target/classes/lib
具体做法:1.移动/src/main/resources/lib到项目顶层目录/lib下(即与src同级)
        2.打包编译将顶层目录/lib拷贝到target/lib下
        具体在pom.xml文件的build->plugins下找到<artifactId>maven-resources-plugin</artifactId>,在其<executions>下添加
        <execution>
                        <id>app ext lib</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${basedir}/target/lib</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>lib</directory>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                    
3.为了将覆盖率统计结果显示在gitlab上需要在gitlab编译环境中做一些配置(此步骤已做)
首先需要改写gitlab-ci.yml文件调用执行的job-runner.sh文件,
登录编译服务器(172.17.197.230),
cd /home/ci/gitAgent
vi job-runner.sh
在函数function execute_job() 循环编译变动项目的代码中添加访问/target/site/jacoco/index.html的逻辑
function execute_job() {
    local result=0

    for project in ${CHANGED_PROJ_LIST[@]}
        do
        print_info ""
        print_info "Executing job for project [$project]..."
        
        if can_process $project ./$default_compile_script
        then
            run $project "sh ./$default_compile_script"
            result=$?
            print_info "Job execution complete - result [$result]"
            if [ $result -ne 0 ];
            then
                break
            fi
        
        elif can_process $project pom.xml
                then
            run $project "${default_maven_script}"
            result=$?
                        print_info "Job execution complete - result [$result]"
            if [ $result -ne 0 ];
                        then
                                break
                        fi
                else
            print_info "Job execution for $project skipped"
        fi
        cur_report="${project}/target/site/jacoco/index.html"
        if [ -f $cur_report ];then
           cat $cur_report
           echo "\n----key coverage results---------"
           totalCoverage=$(grep -Eo "Total.*?([0-9]{1,3})%" $cur_report | grep -Eo '([0-9]{1,3})%')
           totalInsCoverage=$(echo $totalCoverage | cut -d ' ' -f 1  )
           totalBrchCoverage=$(echo $totalCoverage | cut -d ' ' -f 2  )
           echo "total instructions coverage:$totalInsCoverage,branch coverage:$totalBrchCoverage"
           
           serviceCoverage=$(grep -Eo ".service.Impl.*?([0-9]{1,3})%" $cur_report | grep -Eo '([0-9]{1,3})%')
           serviceInsCoverage=$(echo $serviceCoverage | cut -d ' ' -f 1  )
           serviceBrchCoverage=$(echo $serviceCoverage | cut -d ' ' -f 2  )
           echo "service package instructions coverage:$serviceInsCoverage,branch coverage:$serviceBrchCoverage"
           
           controllerCoverage=$(grep -Eo ".controller.*?([0-9]{1,3})%" $cur_report | grep -Eo '([0-9]{1,3})%')
           controllerInsCoverage=$(echo $controllerCoverage | cut -d ' ' -f 1  )
           controllerBrchCoverage=$(echo $controllerCoverage | cut -d ' ' -f 2  )
           echo "controller package instructions coverage:$controllerInsCoverage,branch coverage:$controllerBrchCoverage"
        else
           echo "cannot find jacoco reports in ${cur_report}"
        fi
    done

    return $result    
}

4.配置覆盖率数据提取正则表达式(此步骤已做)
首先需要确保登录gitlab后左侧栏能看到Settings选项,如果没有则需要需要申请权限
点击展开Settings,点击CI/CD, 点击General pipelines settings右侧Expand 按钮
找到Test coverage parsing输入框
输入Total.*?([0-9]{1,3})%
点击save Changes按钮即可

5.验证
如果不想通过推送变更触发重新编译,可以在gitlab CI/CD的job下找到可以运行jacoco插件的项目编译任务,
进入console界面,点击右上角Retry按钮,运行通过时,应该在右侧job面板下多出一个Coverage输出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值