一、本文目的:
之前寫了兩篇文章搭建持續整合介面測試平臺(Jenkins+Ant+Jmeter)和ANT批量執行Jmeter指令碼,功能實現上都沒有什麼問題,但是最後生成的報告有一點小問題,雖然不影響使用,但總是感覺不夠完美,具體問題如下:
1、Date report這裡的時間沒有正確顯示出來
2、Summary裡的欄位Min Time和Max Time顯示的是NaN,沒有顯示正確的時間。
本文主要解決上述兩個問題,具體報告如何生成可參考上面提到的兩篇文章。
二、Jmeter+Ant報告生成原理:
在解決問題之前,讓我們先弄清楚Jmeter+Ant是生成報告的原理,知道原理後我們就可以很從容的解決問題了。另外,如果後續我們想定製報告也就很容易了。
1、在Jmeter的extras目錄下,官方已經為我們提供了一個現成的例項,我們只需要在該目錄下執行ant命令就可以生成一個資料檔案Test.jtl和一個報告Test.html(PS:如果沒有安裝ant需要先去安裝,不會用ant的自行百度)。
2、知道了上一步後,接下來我們研究的重點就是extras目錄下的build.xml檔案了,具體研究細節就不在此細說了,因為這就部分內容屬於ant的範圍,有需要的可以自行補充下ant的知識。
三、解決問題:
1、找到extras目錄下build.xml檔案內容的如下部分:它的作用就是把生成的.jtl資料檔案轉換為.html格式的報告
具體屬性的含義:
- in:生成的.jtl檔案的路徑
- out:生成的.html檔案的路徑
- style:從.jtl轉換成.html所使用的樣式,這些檔案也在extras目錄下,這個是最重要的部分,如果我們想定製報告可以自行定義這個檔案或者從網上找一些合適的檔案。
- param:引數,這幾個引數可以在style中使用,下面會講到。
- path:新增jar包的路徑,在下面的target中有引用到(下面第9行)。
1 <path id="xslt.classpath">//jar的路徑 2 <fileset dir="${lib.dir}" includes="xalan*.jar"/> 3 <fileset dir="${lib.dir}" includes="serializer*.jar"/> 4 </path> 5 //把生成的.jtl資料檔案轉換成.html格式的報告 6 <target name="xslt-report" depends="_message_xalan"> 7 <tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp> 8 <xslt 9 classpathref="xslt.classpath" 10 force="true" 11 in="${testpath}/${test}.jtl" 12 out="${testpath}/${test}.html" 13 style="${basedir}/jmeter-results-detail-report${style_version}.xsl"> 14 <param name="showData" expression="${show-data}"/> 15 <param name="titleReport" expression="${report.title}"/> 16 <param name="dateReport" expression="${report.datestamp}"/> 17 </xslt> 18 </target>
2、通過上面的分析,style 檔案是整成報告轉換的關鍵,那我們就開啟jmeter-results-detail-report_21.xsl這個檔案看看,找到如下幾行,這裡也定義了三個引數跟build.xml檔案中一樣,由此可猜測,我們只要在build.xml檔案中定義dateReport這個引數和值,在style中就可以按如下方式使用,經過測試證明猜測是正確的,那麼第一個問題就解決了:
1 <xsl:param name="showData" select="'n'"/> 2 <xsl:param name="titleReport" select="'Load Test Results'"/> 3 <xsl:param name="dateReport" select="'date not defined'"/>
3、對於第二個問題,其實把第1步中的程式碼複製到我們自己的build.xml檔案中後,可以一併解決這兩個問題。解決第二個總是的關鍵程式碼是第9行和第10行:
classpathref="xslt.classpath"
force="true"
而第9行又引用了第1~4行
4、到此,兩個問題都解決了,最終修改後的build.xml檔案如下,標黃是解決總是新增的程式碼:
<?xml version="1.0" encoding="UTF-8"?> <project name="ant-jmeter-test" default="run" basedir="."> <!-- 需要改成自己本地的 Jmeter 目錄--> <property name="jmeter.home" value="/Users/Tools/Jmeter" /> <property name="report.title" value="介面測試"/> <!-- jmeter生成jtl格式的結果報告的路徑--> <property name="jmeter.result.jtl.dir" value="/Users/Desktop/jmx/report" /> <!-- jmeter生成html格式的結果報告的路徑--> <property name="jmeter.result.html.dir" value="/Users/Desktop/jmx/report" /> <!-- 生成的報告的字首--> <property name="ReportName" value="TestReport" /> <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}.jtl" /> <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html" /> <target name="run"> <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="/Users/Desktop/jmx" includes="*.jmx" /> <property name="jmeter.save.saveservice.output_format" value="xml"/> </jmeter> </target> <path id="xslt.classpath"> <fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/> <fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/> </path> <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> <!-- 因為上面生成報告的時候,不會將相關的圖片也一起拷貝至目標目錄,所以,需要手動拷貝 --> <copy todir="${jmeter.result.html.dir}"> <fileset dir="${jmeter.home}/extras"> <include name="collapse.png" /> <include name="expand.png" /> </fileset> </copy> </target> </project>
5、修改後的報告: