持续集成:Jenkins中获取Robot Framework插件返回的Robot变量
在 Jenkins集成Robot Framework 中介绍了Jenkins如何集成Robot Framework测试框架,本文介绍如何在邮件报告中显示测试结果(比如通过率、测试报告链接等参数)。
目录- 邮件直接调用
- Groovy 脚本模板调用
- 方案1:保存Robot变量
- 方案2:Jenkins API读取结果
Robot Framework插件返回了以下参数:
${ROBOT_FAILEDCASES}
- 失败用例列表${ROBOT_PASSPERCENTAGE, onlyCritical}
- 通过率 (passed / total * 100%),onlyCritical默认为false。${ROBOT_PASSRATIO, onlyCritical}
- 'passed / total' 格式的结果,onlyCritical默认为false。${ROBOT_FAILED}
- 失败用例数${ROBOT_PASSED}
- 通过用例数${ROBOT_TOTAL}
- 总用例数${ROBOT_REPORTLINK}
- log.html文件链接。
要在邮件报告中使用这些参数另外还需要安装 Email Extension 和 Token Macro 这两个插件。
邮件直接调用
插件安装完成后,可以在HTML模板中可以直接调用上述参数:
(自动化构建邮件,无需回复!)
FAIL Case:$ROBOT_FAILEDCASES
passed / total:$ROBOT_PASSRATIO
Passed:${ROBOT_PASSED}
Failed:${ROBOT_FAILED}
Total:${ROBOT_TOTAL}
PASSPERCENTAGE:$ROBOT_PASSPERCENTAGE
Report URL:${ROBOT_REPORTLINK}
执行Robot framework自动化测试的pipeline 脚本 (scripted pipeline语法) 如下:
node('win_agent') { //测试代理节点
try {
// 自动化测试
stage('Test') {
TEST_STATU = bat (
script: '''robot -d %WORKSPACE%/rf_results D:/Testcases''',
returnStatus: true
) == 0
}
stage('Test Report') {
script {
step(
[
$class : 'RobotPublisher',
outputPath : 'rf_results',
outputFileName : 'output.xml',
reportFileName : 'report.html',
logFileName : 'log.html',
otherFiles : '*.png,*.jpg',
disableArchiveOutput: true,
passThreshold : 100,
unstableThreshold : 100,
]
)
}
}
} catch (error) {
currentBuild.result = 'FAILURE'
throw error
} finally {
stage("email") {
emailext (
subject: '\'构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}\'',
to: "XXXXXXXXX@qq.com",
body: '${FILE,path="email.html"}',
)
}
}
}
构建,执行效果如下:
Groovy 脚本模板调用
Email Extension插件支持HTML Groovy 脚本模板,那么如何在HTML Groovy 脚本模板中展示测试结果呢?
下面介绍两种方案。
方案1:保存Robot变量
可以先将Robot变量保存到一个xml文件中,然后在template文件中解析这个生成的xml文件。
下面介绍具体实现思路。
1、将Robot变量保存到环境变量中
脚本如下:
stage('Test Report') {
script {
step(
[
$class : 'RobotPublisher',
outputPath : 'rf_results',
outputFileName : 'output.xml',
reportFileName : 'report.html',
logFileName : 'log.html',
otherFiles : '*.png,*.jpg',
disableArchiveOutput: true,
passThreshold : 100,
unstableThreshold : 100,
]
)
}
script {
// 将测试结果保存到环境变量中
env.ROBOT_FAILEDCASES = tm('${ROBOT_FAILEDCASES}')
env.ROBOT_PASSRATIO = tm('${ROBOT_PASSRATIO}')
env.ROBOT_PASSED = tm('${ROBOT_PASSED}')
env.ROBOT_FAILED = tm('${ROBOT_FAILED}')
env.ROBOT_TOTAL = tm('${ROBOT_TOTAL}')
env.ROBOT_PASSPERCENTAGE = tm('${ROBOT_PASSPERCENTAGE}')
env.ROBOT_REPORTLINK = tm('${ROBOT_REPORTLINK}')
}
}
其中tm
是Token Macro插件提供的方法。
2、将变量保存到xml文件中
可以使用groovy脚本来编写保存环境变量的方法,为了是代码更加简洁,将groovy脚本放到pipeline共享库中。
def saveEnvToXml() {
def jobVariables = currentBuild.getBuildVariables();
println "jobVariables:${jobVariables}";
println "ROBOT_FAILEDCASES: ${ROBOT_FAILEDCASES}";
println "ROBOT_PASSRATIO: ${ROBOT_PASSRATIO}";
println "ROBOT_PASSED: ${ROBOT_PASSED}";
println "ROBOT_FAILED: ${ROBOT_FAILED}";
println "ROBOT_TOTAL: ${ROBOT_TOTAL}";
println "ROBOT_PASSPERCENTAGE: ${ROBOT_PASSPERCENTAGE}";
println "ROBOT_REPORTLINK: ${ROBOT_REPORTLINK}";
}
saveEnvToXml()方法中保存变量到xml文件的代码这里省略,主要介绍实现思路。
执行结果如下图:
3、groovy-html.template文件中解析xml文件,读取Robot变量。
template文件使用groovy+HTML语法编写,使用groovy来解析xml文件,HTML展示结果。
pipeline完整脚本如下:
@Library('pipelinelibs@1.0') _ // SVN库
import com.hiyongz.MyLib
def mylib = new MyLib();
node('win_agent') { //测试代理节点
env.JOB_BASE_NAME = "${JOB_BASE_NAME}"
env.JOB_URL = "${JOB_URL}"
try {
// 自动化测试
stage('Test') {
TEST_STATU = bat (
script: '''robot -d %WORKSPACE%/rf_results D:/Testcases''',
returnStatus: true
) == 0
}
stage('Test Report') {
script {
step(
[
$class : 'RobotPublisher',
outputPath : 'rf_results',
outputFileName : 'output.xml',
reportFileName : 'report.html',
logFileName : 'log.html',
otherFiles : '*.png,*.jpg',
disableArchiveOutput: true,
passThreshold : 100,
unstableThreshold : 100,
]
)
}
script {
// 将测试结果保存到环境变量中
env.ROBOT_FAILEDCASES = tm('${ROBOT_FAILEDCASES}')
env.ROBOT_PASSRATIO = tm('${ROBOT_PASSRATIO}')
env.ROBOT_PASSED = tm('${ROBOT_PASSED}')
env.ROBOT_FAILED = tm('${ROBOT_FAILED}')
env.ROBOT_TOTAL = tm('${ROBOT_TOTAL}')
env.ROBOT_PASSPERCENTAGE = tm('${ROBOT_PASSPERCENTAGE}')
env.ROBOT_REPORTLINK = tm('${ROBOT_REPORTLINK}')
}
script {
mylib.saveEnvToXml();
}
}
} catch (error) {
currentBuild.result = 'FAILURE'
throw error
} finally {
stage("email") {
emailext (
subject: '\'构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}\'',
to: "XXXXXXXXX@qq.com",
body: '''${SCRIPT,template="groovy-html.template"}''',
)
}
}
}
方案2:Jenkins API读取结果
也可以直接在template文件中编写groovy脚本解析Robot Framework生成的output.xml文件,获取测试结果。这种方法缺点是output.xml文件可能比较大,且处理比较复杂。
更简单的方法是使用Jenkins API读取测试结果,jenkins支持以下3种方式:
- JSON API:
.../api/json
- XML API:
.../api/xml
- Python API:比如有 JenkinsAPI, Python-Jenkins, api4jenkins, aiojenkins Python库
更多Jenkins API介绍可参考https://plugins.jenkins.io/robot/
发愤忘食,乐以忘忧,不知老之将至云尔。——《论语·述而》