首页 > 其他分享 >【Devops】【测试左移】代码覆盖率统计的几个脚本

【Devops】【测试左移】代码覆盖率统计的几个脚本

时间:2022-09-27 15:56:15浏览次数:63  
标签:xml exec 覆盖率 左移 Devops jacoco method sh class

一、在测试服务器部署路径下注入jacoco
insert.sh是用于将jacoco.sh中的内容打桩到catalina.sh的脚本中,需传一个参数,为服务器的ip地址。使用方式为sh insert.sh <server_ip>
#!/bin/bash
#该脚本用于将jacoco的代理内容(jacoco.sh)插入catalina.sh的启动脚本中
#使用方式:sh insert.sh 10.xx.xx.xx
#jacoco,默认使用9999端口的tcp方式
if [ $# -ne 1 ];then
 echo "Usage:$0 filename"
 exit 1
fi
#将ip写入jacoco.sh
ip=$1
sed -i "s/address=/&$ip/" jacoco.sh
#cat jacoco.sh
#将jacoco内容插入catalina.sh
jagent=`cat -n catalina.sh |grep -i "javaagent"`
echo $jagent
if [[ -z $jagent ]];then
    #在第一个java_opts变量定义的后面加入jacoco的代理内容
    row=`cat -n catalina.sh |grep -i "JAVA_OPTS="|awk '{print $1}'|sed -n "1"P`
    sed -i "${row}r jacoco.sh" catalina.sh
    echo "|||execute insert.sh finished"
else
    echo "|||jacoco agent is already insert in,no need to execute insert.sh"
fi


 

二、将第一步需要打桩的代码内容汇总到jacoco.sh中

jacoco.sh 是jacoco agent的打桩具体内容,address为空,动态写入,默认端口为9999

if [ "$1" = "start" ];then
        JAVA_COCO="-javaagent:jacocoagent.jar=includes=*,output=tcpserver,port=9999,address="
        JAVA_OPTS="$JAVA_OPTS $JAVA_COCO"
        echo $JAVA_OPTS
fi

三、在jenkins服务器执行jaco_exec并收集报告

#!/bin/bash
#该脚本用于将生成jacoco.exec文件并生成xml报告
#jacoco.exec文件在当前jenkins工程的workspace下的jacoco_exec文件夹下
#初始目录均为$WORKSPACE,需传4个参数,ip地址+classes地址+src源码地址+工作空间地址
#使用方式:sh jacoco_exec.sh 10.xx.xx.xx workspace/code/ workspace/code/ workspace
#src和class地址会根据传参进行遍历,传工程code目录即可
#jacoco,默认使用9999端口的tcp方式
if [ $# -ne 4 ];then
 echo "Usage:$0 envip classes srcs workspace"
 exit 1
fi
server_ip=$1
classes_dir=$2
src_dir=$3
workspace=$4

if [ -f "$workspace/jacoco_exec/jacoco.exec" ];then
    rm -rf $workspace/jacoco_exec/jacoco.exec
fi
sleep 3
#遍历$2中所有的src目录和classes目录
class_arr=()
src_arr=()
#arr[${#arr[*]}]
#遍历src目录和classes目录
function read_dir(){
    for file in `ls $1` #注意此处这是两个反引号,表示运行系统命令
    do
        if [ -d $1"/"$file ];then
            if [[ $file = "target" ]];then             
                if [[ -d $1"/src" ]];then
                class_arr[${#class_arr[*]}]=$1"/target/classes/com"

                src_arr[${#src_arr[*]}]=$1"/src/main/java/"
                fi
            else
                read_dir $1"/"$file
            fi
        fi
    done
} 
read_dir $classes_dir
echo ${class_arr[*]}
echo ${src_arr[*]}

#生成jacoco.exec文件
java -jar /data/jacoco/jacoco/lib/jacococli.jar dump --address $server_ip --port 9999 --destfile $workspace/jacoco_exec/jacoco.exec
#生成xml报告用于丰声发消息
num=${#class_arr[@]}
num=`expr $num - 1`
#每个目录生成report.xml
reportlist=""
for i in $(seq 0 ${num}); do
    reportlist="$reportlist $workspace/report$i.xml"
    java -jar /data/jacoco/jacoco/lib/jacococli.jar report $workspace/jacoco_exec/jacoco.exec --classfiles ${class_arr[$i]} --sourcefiles ${src_arr[$i]} --xml $workspace/report$i.xml
done
#java -jar /data/jacoco/jacoco/lib/jacococli.jar report $workspace/jacoco_exec/jacoco.exec --classfiles $classes_dir --sourcefiles $src_dir --xml $workspace/report.xml

echo $reportlist
#返回覆盖率结果
covmessage=$(python3 /data/llm/git/gis-qrcts-core-mpc-qa/SF_Jenkins_scripts/script_for_jacoco/get_jacoco_coverity.py $reportlist)
echo $covmessage

 

四、解析报告中的覆盖率值脚本

get_jacoco_coverity.py 是解析覆盖率的xml文件,将总体的class和method覆盖率计算出来,用于发消息通知。使用方式为python3 get_jacoco_coverity.py report.xml
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
date:2021/3/15
description:
'''
import sys
try:
  import xml.etree.cElementTree as ET
except ImportError:
  import xml.etree.ElementTree as ET
import sys

class Jacoverty:
    def get_javacoco_coverity(self,filenames):
        '''获取jacoco的 xml文件覆盖率统计数据'''
        class_cov=class_total=class_miss=0
        method_cov=method_total=method_miss=0
        for filename in filenames:
            tree = ET.parse(filename)
            root = tree.getroot()

            for counter in root.findall("counter"):
                covtype = counter.get("type")
                if "CLASS" == covtype:
                    class_miss += int(counter.get("missed"))
                    class_cov += int(counter.get("covered"))
                if "METHOD" == covtype:
                    method_miss += int(counter.get("missed"))
                    method_cov += int(counter.get("covered"))
        class_total += class_miss + class_cov
        method_total += method_miss+method_cov
        class_coverty = format(float(class_cov)/float(class_total),'.0%')
        method_coverty = format(float(method_cov) / float(method_total), '.0%')
        # print(class_total,class_cov,method_total,method_cov)
        str = f'Coverage Summary = {"CLASS"}:{class_coverty};{"METHOD"}:{method_coverty};'
        print(str)
        return str

if __name__ == '__main__':
    files = sys.argv[1:]
    # files = ["reportxml2.xml","reportxml.xml"]
    Jacoverty().get_javacoco_coverity(files)

 

标签:xml,exec,覆盖率,左移,Devops,jacoco,method,sh,class
From: https://www.cnblogs.com/happylumei/p/16734830.html

相关文章

  • 【Devops】【Jenkins】jenkins API获取工程构建结果SUCCESS/FAIL
    一、速览核心原理:API调用命令行如下cmd="curl--userusername:pwdhttp://xx.xx.xx.xx:8080/job/{}/job/{}/{}/api/json".format(jobname1,jobname2,jobnum)ps:这里......
  • 【Devops】【jenkins】jenkins上下游工程传递参数,文件传参
    一、背景Devops打通上下游,从开发编译打包到测试自动化到运维部署,最后通知结果采用将参数写入profile.txt文件中,传递到下游工程,下游工程读取profile.txt文件中的变量进行......
  • 技术分享 | 代码覆盖率集成
    本文节选自霍格沃兹测试开发学社内部教材JaCoCo,即JavaCodeCoverageLibrary,它由EclEmma团队根据多年来使用和集成现有库的经验教训而创建的一个开源的代码覆盖率工......
  • DevOps Tutorials All In One
    DevOpsTutorialsAllInOneDevOps导论https://www.icourse163.org/learn/NJU-1003664002refs©xgqfrms2012-2020www.cnblogs.com/xgqfrms发布文章使用:只允......
  • 使用coverlet统计单元测试的代码覆盖率
    单元测试是个好东西,可以在一定程度上兜底虽然写单元测试这件事情非常麻烦但是好的单元测试可以显著提高代码质量,减少bug,避免无意中的修改导致其他模块出错写测试......
  • DevOps 流行工具
    DevOps流行工具Git分布式版本服务器;docker,开源应用容器引擎;Selenium,基于Web-UI自动化测试架构;Jenkins,自动化集成服务器;ANSIBLE,自动化运维工具;Puppet,集中配置管理......
  • 如何从零开始成为 DevOps 工程师
    如何从零开始成为DevOps工程师资源自过去5年以来,DevOps生态系统发展迅速,但我总是看到在某些方面难以回答的同一个问题:如何成为DevOps工程师?让我在这篇文章中为......
  • 腾讯云,DevOps 领导者!
    刚刚,《IDCMarketScape:中国DevOps平台市场厂商评估,2022》正式发布。腾讯云CODING成功入选领导者位置在战略和能力两大维度国内领先......
  • DevOps企业级
    DevOps计划部署编码<-----DevOps------>运维......
  • 代码覆盖率和功能覆盖率之间的区别
    代码覆盖率代码覆盖率直接来自设计代码。它不是用户指定的。代码覆盖的优点之一是它自动评估设计的源码在仿真/回归期间被执行的程度,从而识别设计源码中在仿真期间未被执......