jacoco统计代码覆盖率方案

1、本地下载jacoco,然后在启动脚本中 追加 -javaagent:C:\Users\Administrator\Desktop\jacoco-0.8.5\lib\jacocoagent.jar=includes=*,output=tcpserver,port=1027,address=10.110.81.133,append=true

2、下载ant,配置好build.xml。以下为配置示例

<?xml version="1.0" ?>
<project name="jacoco_test" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
<tstamp>
<format property="time" pattern="yyyyMMdd" />
</tstamp>
<property name="baseDir" value="C:\Users\Administrator\Desktop"/>
<!--Jacoco的安装路径-->
<property name="jacocoantPath" value="${baseDir}\jacoco-0.8.5\lib\jacocoant.jar"/>
<!--最终生成.exec文件的路径,里面有覆盖率数据,Jacoco就是根据这个文件生成最终的报告的-->
<property name="jacocoexecPath" value="C:\Users\Administrator\Desktop\apache-ant-1.10.8-bin\apache-ant-1.10.8\bin\jacoco.exec"/>
<!--生成覆盖率报告的路径-->
<property name="reportfolderDatePath" value="C:\Users\Administrator\Desktop\report${time}\"/>
<!--TFS读取覆盖率报告的路径-->
<property name="reportfolderPath" value="C:\Users\Administrator\Desktop\report\"/>
<!--服务的ip地址-->
<property name="server_ip" value="10.110.81.133"/>
<!--前面配置的服务打开的端口,要跟jacocoagent一样-->
<property name="server_port" value="1027"/>
<!--源代码路径-->
<!--property name="srcCodeBaseDir" value="${baseDir}/service_A/src/main/java" /-->
<!--.class文件路径-->
<property name="clsCodeBaseDir" value="C:\Users\Administrator\Desktop\Class\" />
<!--.exec文件路径-->
<property name="execfilepath" value="C:\Users\Administrator\Desktop\apache-ant-1.10.8-bin\apache-ant-1.10.8\bin\" />
<!--让ant知道去哪儿找Jacoco-->
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${jacocoantPath}" />
</taskdef>
<!--dump任务: 根据前面配置的ip地址,和端口号,访问目标tcp服务,并生成.exec文件。-->
<target name="dump">
<jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
</target>

<!--jacoco任务: 根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->
<target name="report">
<delete dir="${reportfolderPath}" />
<mkdir dir="${reportfolderPath}" />
<mkdir dir="${reportfolderDatePath}" />
<jacoco:report>
<executiondata>
<file file="${jacocoexecPath}" />
</executiondata>

<structure name="【10.110.81.133】WebAPI代码覆盖率报告${time}">
<group name="ebs">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\ebs" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="audit">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\audit" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="cs">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\cs" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="icc">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\icc" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="msu">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\msu" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="schd">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\schd" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="aif">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\aif" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="caf">
<classfiles>
<fileset dir="${clsCodeBaseDir}\runtime\libs" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="approvalformat">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\approvalformat" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="bcc">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\bcc" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="cloudprint">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\cloudprint" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="comment">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\comment" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="common">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\common" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<!--group name="debugtool">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\debugtool" />
</classfiles>
<sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles>
</group-->
<group name="dip">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\dip" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="dfs">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\dfs" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="epp">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\epp" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="lcm">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\lcm" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="qdp">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\qdp" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<!--group name="qs">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\qs" />
</classfiles>
<sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles>
</group-->
<group name="rri">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\rri" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="rtc">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\rtc" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="sg">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\sg" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<!--group name="sys">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\sys" />
</classfiles>
<sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles>
</group-->
<group name="task">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\task" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="ubcc">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\ubcc" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
<group name="wf">
<classfiles>
<fileset dir="${clsCodeBaseDir}\platform\runtime\wf" />
</classfiles>
<!--sourcefiles encoding="utf-8">
<fileset dir="${srcCodeBaseDir}" />
</sourcefiles-->
</group>
</structure>
<html destdir="${reportfolderDatePath}" encoding="utf-8" />
</jacoco:report>
<copy todir="${reportfolderPath}">
<fileset dir="${reportfolderDatePath}">
</fileset>
</copy>
<move todir="${reportfolderDatePath}">
<fileset dir="${execfilepath}">
<include name="jacoco.exec" />
</fileset>
</move>
<delete dir="${jacocoexecPath}" />
</target>
</project>

 

3、使用python实现获取jar内的class文件,代码示例如下

#!/usr/bin/python
# -*- coding:gb2312 -*-
import os
import shutil
import zipfile
import configparser
import time

def GetJarFile(apppath,cfile_path):
jfiles = []
path = apppath
if os.path.exists(cfile_path):
try:
shutil.rmtree(cfile_path)
except:
os.rmdir(cfile_path)
time.sleep(5)
try:
os.mkdir(cfile_path)
except :
print('层级删除文件后未释放,请重新启动工具尝试!')
os.system('pause')
for root, dirs, files in os.walk(path):
copy_path = root.replace(path,cfile_path)
if not os.path.exists(copy_path):
os.mkdir(copy_path)
for file in files:
if '.jar' in file:
jfile = os.path.join(root,file)
jfile_copy = os.path.join(copy_path,file)
jfiles.append(jfile_copy)
shutil.copyfile(jfile,jfile_copy)
print('第一级共有:'+ str(len(jfiles)) + '个Jar包!')
return jfiles

def JarToZip(jfiles):
zipfiles = []
for file in jfiles:
new_file = file.replace('.jar','.zip')
if os.path.exists(new_file):
os.remove(new_file)
os.rename(file,new_file)
zipfiles.append(new_file)
return zipfiles

def ZipToFile(zipfiles):
for file in zipfiles:
try:
zf = zipfile.ZipFile(file)
str1 = file.replace('.zip','')
str1 = str1.replace(' ','')
zf.extractall(path=str1)
zf.close()
os.remove(file)
except :
print(file + '解压出错!')
continue

 

config = configparser.ConfigParser()
config.read("config.ini",encoding='utf-8')
apppath = config.get('path', 'apppath')
cfile_path = config.get('path', 'cfile_path')
jfiles = GetJarFile(apppath,cfile_path)
zipfiles = JarToZip(jfiles)
ZipToFile(zipfiles)
jfiles_1 = GetJarfiles_1(cfile_path)
zipfiles_1 = JarToZip(jfiles_1)
ZipToFile(zipfiles_1)
print("Class生成成功!")
#os.system("pause")

4、通过计划任务定时执行 ant report 和 ant dump,生成报告和获取二进制文件

5、nginx配置html转发端口

6、集成TFS前端展示

 

posted @ 2021-05-24 19:37  小清澈  阅读(626)  评论(0)    收藏  举报