利用jenkins傳送測試報告模板
阿新 • • 發佈:2019-02-04
1、Editable Email Notification中的 Default Content 填寫以下內容:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content=text/html; charset="UTF-8> <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次測試執行日誌</title> </head> <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0"> <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 14pt; font-family: Microsoft Yahei,Tahoma, Arial, Helvetica, sans-serif"> <tr> <td><br /> <b><font color="#000079">自動化測試概要</font></b> <hr size="2" width="100%" align="center" /></td> </tr> <tr> <td> <ul> <li>專案名稱 : ${PROJECT_NAME}</li> <li>觸發原因: ${CAUSE}</li> </ul> </td> </tr> </table> </body> </html> ${FILE, path="reportLog/html//APITest.html"}
其中
${FILE, path="reportLog/html//APITest.html"}
這句話是將測試報告以附件的形式顯示在郵件中。
2、build.xml檔案內容如下:
<?xml version="1.0" encoding="UTF-8"?> <project name="JmeterTest" default="all" basedir="."> <tstamp> <format property="time" pattern="yyyyMMddHHmm" /> </tstamp> <!-- 需要改成自己本地的 Jmeter 目錄--> <property name="jmeter.home" value="F:\testsoft\apache-jmeter-3.0" /> <!-- jmeter生成jtl格式的結果報告的路徑--> <property name="jmeter.result.jtl.dir" value="F:\testsoft\apache-jmeter-3.0\extras\reportLog\jtl" /> <!-- jmeter生成html格式的結果報告的路徑--> <property name="jmeter.result.html.dir" value="F:\testsoft\apache-jmeter-3.0\extras\reportLog\html" /> <!-- jmeter生成html格式的歷史結果報告的路徑--> <property name="jmeter.result.html.historydir" value="F:\testsoft\apache-jmeter-3.0\extras\reportLog\historyhtml" /> <!-- 生成的報告的字首--> <property name="ReportName" value="APITest" /> <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" /> <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html" /> <property name="ComputerName" value="dell" /> <target name="all"> <antcall target="test" /> <antcall target="report" /> </target> <target name="test"> <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" /> <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}"> <!-- 宣告要執行的指令碼。"*.jmx"指包含此目錄下的所有jmeter指令碼--> <testplans dir="F:\testsoft\script" includes="*.jmx" /> <property name="jmeter.save.saveservice.output_format" value="xml"/> </jmeter> </target> <target name="report"> <tstamp> <format property="report.datestamp" pattern="yyyy/MM/dd HH:mm" /></tstamp> <!-- <xslt classpathref="xslt.classpath" force="true" in="${jmeter.result.jtlName}" out="${jmeter.result.htmlName}" style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl"> <param name="dateReport" expression="${report.datestamp}"/> </xslt> --> <xslt in="${jmeter.result.jtlName}" out="${jmeter.result.htmlName}" style="${jmeter.home}/extras/jmeter-results-detail-report_1.0.xsl" > <param name="dateReport" expression="${report.datestamp}"/> </xslt> <!-- 因為上面生成報告的時候,不會將相關的圖片也一起拷貝至目標目錄,所以,需要手動拷貝 --> <copy todir="${jmeter.result.html.dir}"> <fileset dir="${jmeter.home}/extras"> <include name="collapse.png" /> <include name="expand.png" /> </fileset> </copy> <!-- 將每天生成的測試報告按當前時間進行備份 --> <copy tofile="${jmeter.result.html.dir}\${ReportName}${time}.html"> <fileset dir="${jmeter.result.html.dir}"> <include name="APITest.html" /> </fileset> </copy> </target> </project>
3、jmeter-results-detail-report_1.0.xsl 如下:
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- Stylesheet for processing 2.1 output format test result files To uses this directly in a browser, add the following to the JTL file as line 2: <?xml-stylesheet type="text/xsl" href="../extras/jmeter-results-detail-report_21.xsl"?> and you can then view the JTL in a browser --> <xsl:output method="html" indent="yes" encoding="UTF-8" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" /> <!-- Defined parameters (overrideable) <td bgcolor="#ff00ff"> --> <xsl:param name="showData" select="'y'"/> <xsl:param name="titleReport" select="'自動化測試結果'"/> <xsl:param name="dateReport" select="'date not defined'"/> <xsl:template match="testResults"> <html > <head> <title><xsl:value-of select="$titleReport" /></title> <style type="text/css"> body { font:normal 90% Microsoft Yahei,Microsoft Yahei,verdana,arial,helvetica; color:#000000; } table tr td, table tr th { font-size: 75%; } table.details tr th{ color: #ffffff; font-weight: bold; text-align:center; background:#2674a6; white-space: nowrap; } table.details tr td{ background:#eeeee0; white-space: nowrap; } h1 { margin: 0px 0px 5px; font: 110% Microsoft Yahei,Microsoft Yahei,verdana,arial,helvetica } h2 { margin-top: 1em; margin-bottom: 0.5em; font: bold 100% Microsoft Yahei,Microsoft Yahei,verdana,arial,helvetica } h3 { margin-bottom: 0.5em; font: bold 100% Microsoft Yahei,Microsoft Yahei,verdana,arial,helvetica } .Failure { font-weight:bold; color:red; } img { border-width: 0px; } .expand_link { position=absolute; right: 0px; width: 27px; top: 1px; height: 27px; } .page_details { display: none; } .page_details_expanded { display: block; display/* hide this definition from IE5/6 */: table-row; } </style> <script language="JavaScript"><![CDATA[ function expand(details_id) { document.getElementById(details_id).className = "page_details_expanded"; } function collapse(details_id) { document.getElementById(details_id).className = "page_details"; } function change(details_id) { if(document.getElementById(details_id+"_image").src.match("expand")) { document.getElementById(details_id+"_image").src = "collapse.png"; expand(details_id); } else { document.getElementById(details_id+"_image").src = "expand.png"; collapse(details_id); } } ]]></script> </head> <body > <xsl:call-template name="pageHeader" /> <xsl:call-template name="myresult" /> <xsl:call-template name="summary" /> <hr size="1" width="75%" align="center" /> <xsl:call-template name="pagelist" /> <hr size="1" width="75%" align="center" /> <xsl:call-template name="detail" /> </body> </html> </xsl:template> <xsl:template name="pageHeader"> <h1><xsl:value-of select="$titleReport" /></h1> <table width="100%"> <tr> <td align="left">Date report: <xsl:value-of select="$dateReport" /></td> <td align="right">from lly</td> </tr> </table> <hr size="1" /> </xsl:template> <xsl:template name="myresult"> <xsl:variable name="allFailCount" select="count(/testResults/*[attribute::s='false'])" /> <xsl:if test="$allFailCount = '0'"> <h2>測試結果:成功</h2> </xsl:if> <xsl:if test="$allFailCount > '0'"> <h2 bgcolor="#ff00ff">測試結果:未完全通過</h2> <h2 bgcolor="#ff00ff">失敗個數:<xsl:value-of select="count(/testResults/*[attribute::s='false'])"/></h2> </xsl:if> </xsl:template> <xsl:template name="summary"> <h2>報告概況</h2> <table align="center" class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> <tr valign="top"> <th>功能模組總數</th> <th>失敗數</th> <th>成功率</th> <th>平均響應時間</th> </tr> <tr valign="top"> <xsl:variable name="allCount" select="count(/testResults/*)" /> <xsl:variable name="allFailureCount" select="count(/testResults/*[attribute::s='false'])" /> <xsl:variable name="allSuccessCount" select="count(/testResults/*[attribute::s='true'])" /> <xsl:variable name="allSuccessPercent" select="$allSuccessCount div $allCount" /> <xsl:variable name="allTotalTime" select="sum(/testResults/*/@t)" /> <xsl:variable name="allAverageTime" select="$allTotalTime div $allCount" /> <xsl:variable name="allMinTime"> <xsl:call-template name="min"> <xsl:with-param name="nodes" select="/testResults/*/@t" /> </xsl:call-template> </xsl:variable> <xsl:variable name="allMaxTime"> <xsl:call-template name="max"> <xsl:with-param name="nodes" select="/testResults/*/@t" /> </xsl:call-template> </xsl:variable> <xsl:attribute name="class"> <xsl:choose> <xsl:when test="$allFailureCount > 0">Failure</xsl:when> </xsl:choose> </xsl:attribute> <td align="center"> <xsl:value-of select="$allCount" /> </td> <td align="center"> <xsl:value-of select="$allFailureCount" /> </td> <td align="center"> <xsl:call-template name="display-percent"> <xsl:with-param name="value" select="$allSuccessPercent" /> </xsl:call-template> </td> <td align="center"> <xsl:call-template name="display-time"> <xsl:with-param name="value" select="$allAverageTime" /> </xsl:call-template> </td> </tr> </table> </xsl:template> <xsl:template name="pagelist"> <h2>詳細情況</h2> <table align="center" class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> <tr valign="top"> <th width="20%">功能模組</th> <th>執行次數</th> <th>失敗數</th> <th>成功率</th> <th>實際響應時間</th> </tr> <xsl:for-each select="/testResults/*[not(@lb = preceding::*/@lb)]"> <xsl:variable name="label" select="@lb" /> <xsl:variable name="count" select="count(../*[@lb = current()/@lb])" /> <xsl:variable name="failureCount" select="count(../*[@lb = current()/@lb][attribute::s='false'])" /> <xsl:variable name="successCount" select="count(../*[@lb = current()/@lb][attribute::s='true'])" /> <xsl:variable name="successPercent" select="$successCount div $count" /> <xsl:variable name="totalTime" select="sum(../*[@lb = current()/@lb]/@t)" /> <xsl:variable name="averageTime" select="$totalTime div $count" /> <xsl:variable name="minTime"> <xsl:call-template name="min"> <xsl:with-param name="nodes" select="../*[@lb = current()/@lb]/@t" /> </xsl:call-template> </xsl:variable> <xsl:variable name="maxTime"> <xsl:call-template name="max"> <xsl:with-param name="nodes" select="../*[@lb = current()/@lb]/@t" /> </xsl:call-template> </xsl:variable> <tr valign="top"> <xsl:attribute name="class"> <xsl:choose> <xsl:when test="$failureCount > 0">Failure</xsl:when> </xsl:choose> </xsl:attribute> <td> <xsl:if test="$failureCount > 0"> <a><xsl:attribute name="href">#<xsl:value-of select="$label" /></xsl:attribute> <xsl:value-of select="$label" /> </a> </xsl:if> <xsl:if test="0 >= $failureCount"> <xsl:value-of select="$label" /> </xsl:if> </td> <td align="center"> <xsl:value-of select="$count" /> </td> <td align="center"> <xsl:value-of select="$failureCount" /> </td> <td align="center"> <xsl:call-template name="display-percent"> <xsl:with-param name="value" select="$successPercent" /> </xsl:call-template> </td> <td align="center"> <xsl:call-template name="display-time"> <xsl:with-param name="value" select="$averageTime" /> </xsl:call-template> </td> </tr> </xsl:for-each> </table> </xsl:template> <xsl:template name="detail"> <xsl:variable name="allFailureCount" select="count(/testResults/*[attribute::s='false'])" /> <xsl:if test="$allFailureCount > 0"> <h2>Failure Detail</h2> <xsl:for-each select="/testResults/*[not(@lb = preceding::*/@lb)]"> <xsl:variable name="failureCount" select="count(../*[@lb = current()/@lb][attribute::s='false'])" /> <xsl:if test="$failureCount > 0"> <h3><xsl:value-of select="@lb" /><a><xsl:attribute name="name"><xsl:value-of select="@lb" /></xsl:attribute></a></h3> <table align="center" class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> <tr valign="top"> <th>響應</th> <th>失敗詳細資訊</th> <xsl:if test="$showData = 'y'"> <th>響應資料</th> </xsl:if> </tr> <xsl:for-each select="/testResults/*[@lb = current()/@lb][attribute::s='false']"> <tr> <td><xsl:value-of select="@rc | @rs" /> - <xsl:value-of select="@rm" /></td> <td><xsl:value-of select="assertionResult/failureMessage" /></td> <xsl:if test="$showData = 'y'"> <td><xsl:value-of select="responseData" /></td> </xsl:if> </tr> </xsl:for-each> </table> </xsl:if> </xsl:for-each> </xsl:if> </xsl:template> <xsl:template name="min"> <xsl:param name="nodes" select="/.." /> <xsl:choose> <xsl:when test="not($nodes)">NaN</xsl:when> <xsl:otherwise> <xsl:for-each select="$nodes"> <xsl:sort data-type="number" /> <xsl:if test="position() = 1"> <xsl:value-of select="number(.)" /> </xsl:if> </xsl:for-each> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="max"> <xsl:param name="nodes" select="/.." /> <xsl:choose> <xsl:when test="not($nodes)">NaN</xsl:when> <xsl:otherwise> <xsl:for-each select="$nodes"> <xsl:sort data-type="number" order="descending" /> <xsl:if test="position() = 1"> <xsl:value-of select="number(.)" /> </xsl:if> </xsl:for-each> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="display-percent"> <xsl:param name="value" /> <xsl:value-of select="format-number($value,'0.00%')" /> </xsl:template> <xsl:template name="display-time"> <xsl:param name="value" /> <xsl:value-of select="format-number($value,'0 ms')" /> </xsl:template> </xsl:stylesheet>
4、預期效果如下: