定义要获取的指标
testFailCount、testSkipCount、testTotalCount。分别为测试失败用例总数、跳过的测试用例总数和用例总数。获取到这些指标后就能对单个项目的单元测试设置一下度量指标。(单元测试覆盖率可以在SonarQube平台获取)
获取指标数据的接口
我之前第一想法是通过日志获取到这些数据,但并没有简单的插件能够完成。BlueOcean上面有测试数据相关的接口,貌似可以获取数据(但是我并没有获取到~)于是直接使用jenkins的json api尝试获取,果然是有的,只要应用了单元测试(junit)的项目都会有这个类和相对应的数据指标。
jenkins单元测试数据获取接口
接口地址: ${JOB_URL}${BUILD_ID}/api/json?pretty=true
接口返回:
[_class, actions, artifacts, building, description, displayName, duration, estimatedDuration, executor, fullDisplayName, id, keepLog, number, queueId, result, timestamp, url, changeSets, culprits, nextBuild, previousBuild]
测试数据:
{"_class":"hudson.tasks.junit.TestResultAction","failCount":0,"skipCount":0,"totalCount":1,"urlName":"testReport"}
前置条件:
1、readJSON需要jenkins安装script-security、pipeline-utility-steps插件。(安装有依赖顺序,从左到右)。
2、调用接口获取数据前,首先要使用junit插件获取数据。
pipeline实现:
node("master"){
def testsFailCount = "0"
def testSkipCount = "0"
def testTotalCount = "0"
sh "mvn clean package"
junit allowEmptyResults:true,testResults: "target/surefire-reports/*.xml"
response = httpRequest ignoreSslErrors: true, url: "${JOB_URL}${BUILD_ID}/api/json?pretty=true"
//println(response.content)
response = response.content
//使用json方法偶尔出现序列化问题,果断采用readJSON
def info = readJSON text: """${response}"""
//println(info.keySet())
//println(info["actions"])
for (cls in info["actions"]){
if (cls.get("_class")){
if (cls["_class"] == "hudson.tasks.junit.TestResultAction"){
println(cls)
testsFailCount = cls["failCount"]
testSkipCount = cls["skipCount"]
testTotalCount = cls["totalCount"]
}
}
}
println([testsFailCount,testSkipCount,testTotalCount])
}