在 Jenkins集成Robot Framework 中介绍了Jenkins如何集成Robot Framework测试框架,本文介绍如何在邮件报告中显示测试结果(比如通过率、测试报告链接等参数)。
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模板中可以直接调用上述参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <hr/>(自动化构建邮件,无需回复!)<br/><hr/>
FAIL Case:$ROBOT_FAILEDCASES<br/><br/>
passed / total:$ROBOT_PASSRATIO<br/><br/>
Passed:${ROBOT_PASSED}<br/><br/>
Failed:${ROBOT_FAILED}<br/><br/>
Total:${ROBOT_TOTAL}<br/><br/>
PASSPERCENTAGE:$ROBOT_PASSPERCENTAGE<br/><br/>
Report URL:<a href="${ROBOT_REPORTLINK}">${ROBOT_REPORTLINK}</a><br/><br/ <hr/>
|
执行Robot framework自动化测试的pipeline 脚本 (scripted pipeline语法) 如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| 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变量保存到环境变量中
脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| 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共享库中。
1 2 3 4 5 6 7 8 9 10 11
| 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完整脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| @Library('pipelinelibs@1.0') _ 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种方式:
更多Jenkins API介绍可参考持续集成:Jenkins API使用方法详细介绍,这里介绍一下xml api的用法。
进入Robot Results界面,在url后面添加 /api/xml
,会返回如下xml内容:
可以看到robot framework测试结果,我们可以从这个api中提取结果。可以进一步使用xpath语法获取想要的值,获取通过率passPercentage:../api/xml?xpath=/*/passPercentage
:
自动化脚本中可以使用curl命令获取通过率passPercentage:
1 2
| $ curl -k --silent -L --user 用户名:API Token http://192.168.30.8:8080/view/RF/job/RF-TMVariables-demo/26/robot/api/xml?xpath=/*/passPercentage | tr '<' '\n' | egrep '^passPercentage>' | sed 's/.*>//g' 100.0
|
groovy脚本:
1
| def WORKFLOW_API_XML = sh ( script: "API_XML=\$(curl -k --silent -L --user 用户名:API Token http://192.168.30.8:8080/view/RF/job/RF-TMVariables-demo/26/robot/api/xml?xpath=/*/passPercentage | tr '<' '\n' | egrep '^passPercentage>' | sed 's/.*>//g'); echo \${API_XML}", returnStdout: true ).trim();
|
使用json api会返回json格式的测试结果,获取到这些结果后,就有很多方法可以用来提取你想要的值。
参考文档:
- https://plugins.jenkins.io/robot/
- https://plugins.jenkins.io/email-ext/
- https://www.jenkins.io/doc/book/using/remote-access-api/
- https://stackoverflow.com/questions/54751520/how-to-output-test-pass-failure-notification-to-slack-through-jenkins-when-runni
--THE END--
发愤忘食,乐以忘忧,不知老之将至云尔。——《论语·述而》