- 在java项目中要得出测试的覆盖率,使用jacoco插件,利用其生成的html文件进行解析。在脚本中生成一个以字符串形式构成的html格式的文件。
- 覆盖率以模块为单位进行表示,并且每一个模块中需要分析到包的覆盖率。
- 覆盖率的内容可以有全部,也可以用一部分,我这里选用了行,类,方法,并且对表示形式做了一些优化。
- 需要有邮件发送的功能,以及对邮箱格式检查的功能。
- 需要以参数的形式传入阈值,并且在脚本中分析每一模块是否达到标准。
因为是SpringBoot项目,并且使用了jacoco的插件,代码仓库顶层pom.xml里面加入如下maven依赖,子模块只需继承(parent)父pom即可。(1. 又学了maven一遍,层次结构,groupid,等)
org.jacoco jacoco-maven-plugin 0.8.7 org.jacoco jacoco-maven-plugin 0.8.6 prepare-agent prepare-agent report test report org.apache.maven.plugins maven-surefire-plugin 2.16 false true
这里稍作解释:
- 加入了jacoco的依赖。
- 加了jacoco的运行插件。
- 加了org.apache.maven.plugins插件(我也不确定加不加)
org.apache.maven.plugins的功能解释
顶层pom中需要使用标签管理同个项目中的各个模块。因为是根据项目中的来获取模块名称的。所以必须添加。
示例:
2.2 python执行准备modulename1 modulename2
因为我们需要给脚本传入三个参数,所以需要运行脚本时显式的传入参数:
python Soup.py https://code.hwwt2.com/enterprise__helloworld/Test.git 1253324157@qq.com 65%3.代码说明
import json
import sys
import random
import requests
import shutil
import re
import os
from bs4 import BeautifulSoup
#python接收命令行参数
#接收GITURL和邮箱地址
gitUrl = sys.argv[1]
email = sys.argv[2]
flag = sys.argv[3]
flag = float(flag.strip("%"))
codeDir = ""
ti = True
#生成随机的15字符目录
for i in range(15):
num = random.randint(0,9)
letter = chr(random.randint(97, 122)) # 取小写字母
s = str(random.choice([num,letter]))
codeDir += s
if('/' in codeDir):
print("目录中有非法字符")
sys.exit()
#验证邮箱格式
emails = email.split(";")
print(emails)
def check_email_url(email_address):
# check '@'
at_count = 0
for element in email_address:
if element == '@':
at_count = at_count + 1
if at_count != 1:
return 0
# check ' '
for element in email_address:
if element == ' ':
return 0
# check '.com'
postfix = email_address[-4:]
if postfix != '.com':
return 0
# check char
for element in email_address:
if element.isalpha() == False and element.isdigit() == False:
if element != '.' and element != '@' and element != '_':
return 0
return 1
for e in emails:
print(e)
if(check_email_url(e) == 0):
print("邮箱格式出错")
sys.exit()
#拉取代码
os.system("git clone " + gitUrl + " " + codeDir)
os.system("cd " + codeDir + " && mvn test -Dmaven.test.failure.ignore=true && cd ../")
try:
#先解析pom,拿到moduleList
pom = open(codeDir + '/pom.xml').read()
pomsoup = BeautifulSoup(pom,"xml")
ps = pomsoup.find_all('module')
moduleList = []
for i in ps:
moduleList.append(i.string)
print(len(moduleList))
number = len(moduleList)
result = "本次单元测试报告如下所示,请查阅。本报告以模块为单位展示单元测试覆盖率及报告,覆盖率阈值为 : "+ str(flag) + "%
"
#对每一个模块的文件进行导入解析
for r in range(number):
add = codeDir + '/' +moduleList[r] + "/target/site/jacoco/index.html"
#add = i + "\target\site\jacoco\index.html"
f = open(add).read()
soup = BeautifulSoup(f, "html.parser")
#解析模块名
moduleName = soup.find('h1').string
result += '' +"模块名称:" + moduleName + ''
#result += ''
result += '| ' + headTd[td*2+1].string + ", %"+ ' | ' result += '
| ' + str(bodyResult) + ' (' + str(int(bodyNumber1) - int(bodyNumber)) +'/' + bodyNumber1 + ")"+ " | " result += '
| ' + str(tfootResult) + ' (' + str(int(tfootNumber1) - int(tfootNumber)) + '/' + tfootNumber1 + ")" + " | " result += '
| ' + res + ' |



